Fix template generation for R2 43/49743/2
authorDenes Nemeth <denes.nemeth@nokia.com>
Thu, 31 May 2018 11:59:34 +0000 (13:59 +0200)
committerDenes Nemeth <denes.nemeth@nokia.com>
Thu, 31 May 2018 12:37:56 +0000 (14:37 +0200)
Change-Id: Ibf53ee4f203f248c930611812f3eb248e3023be8
Signed-off-by: Denes Nemeth <denes.nemeth@nokia.com>
Issue-ID: VFC-728

31 files changed:
nokiav2/docs/onboarding.rst
nokiav2/docs/sampleVnfs/simple/cbam.instantiation.request.json [deleted file]
nokiav2/docs/sampleVnfs/simple/simple.v1.csar
nokiav2/docs/sampleVnfs/simple/simple.v2.csar [new file with mode: 0644]
nokiav2/docs/sampleVnfs/simpleDual/cbam.instantiation.request.json [deleted file]
nokiav2/docs/sampleVnfs/simpleDual/cbam.package.zip [new file with mode: 0644]
nokiav2/docs/sampleVnfs/simpleDual/etsi_config.json [new file with mode: 0644]
nokiav2/docs/sampleVnfs/simpleDual/simple.dual.v1.csar [new file with mode: 0644]
nokiav2/docs/sampleVnfs/simpleDual/simple.dual.v2.csar [new file with mode: 0644]
nokiav2/docs/sampleVnfs/simpleDual/simpleDual.csar [deleted file]
nokiav2/docs/sampleVnfs/simple_cmcc/simple.v1.csar
nokiav2/docs/sampleVnfs/simple_cmcc/simple.v2.csar
nokiav2/docs/samplevnf.rst
nokiav2/driver/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/packagetransformer/OnapAbstractVnfdBuilder.java
nokiav2/driver/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/packagetransformer/OnapR1VnfdBuilder.java [moved from nokiav2/driver/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/packagetransformer/OnapVnfdBuilder.java with 55% similarity]
nokiav2/driver/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/packagetransformer/OnapR2VnfdBuilder.java
nokiav2/driver/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/packagetransformer/OnapVnfPackageBuilder.java [moved from nokiav2/driver/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/packagetransformer/OnapR1VnfPackageBuilder.java with 93% similarity]
nokiav2/driver/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/restapi/ConverterApi.java
nokiav2/driver/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/vnfm/LifecycleManager.java
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/packagetransformer/TestOnapAbstractVnfdBuilder.java [new file with mode: 0644]
nokiav2/driver/src/test/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/packagetransformer/TestOnapR1VnfdBuilder.java [moved from nokiav2/driver/src/test/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/packagetransformer/TestOnapVnfdBuilder.java with 83% similarity]
nokiav2/driver/src/test/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/packagetransformer/TestOnapR2VnfdBuilder.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/resources/application-direct.properties
nokiav2/driver/src/test/resources/application.properties
nokiav2/driver/src/test/resources/unittests/packageconverter/cbam.package.zip
nokiav2/driver/src/test/resources/unittests/packageconverter/cbam.package.zip.vnfd
nokiav2/driver/src/test/resources/unittests/packageconverter/nodes.vnfd.cbam.yaml
nokiav2/driver/src/test/resources/unittests/packageconverter/nodes.vnfd.onap.v2.yaml

index 80aff0b..4613777 100644 (file)
@@ -181,6 +181,8 @@ The following section requires the CSAR and the ETSI configuration of the VNF to
 
         - Select the ETSI configuration file using Browse
 
+          - the name of the file on the local file system must be etsi_config.json
+
         - Click on Done
 
 - Click on Check in
diff --git a/nokiav2/docs/sampleVnfs/simple/cbam.instantiation.request.json b/nokiav2/docs/sampleVnfs/simple/cbam.instantiation.request.json
deleted file mode 100644 (file)
index a85ca0a..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-{
-    "apiVersion":"3.1",
-    "computeResourceFlavours": [
-        {
-            "vnfdVirtualComputeDescId": "server_compute",
-            "resourceId": "m1.small"
-        }
-    ],
-    "extVirtualLinks": [
-        {
-            "extCps": [
-                {
-                    "cpdId": "commisioning_ecp"
-                }
-            ],
-            "resourceId": "pub_net"
-        },
-        {
-            "extCps": [
-                {
-                    "cpdId": "vnftovnf_ecp"
-                }
-            ],
-            "resourceId": "preservedNetwork"
-        }
-    ],
-    "zones": [
-        {
-            "resourceId": "compute-a",
-            "id": "zoneInfoId"
-        }
-    ],
-    "flavourId": "scalable",
-    "grantlessMode": true,
-    "softwareImages": [
-        {
-            "resourceId": "ubuntu.16.04",
-            "vnfdSoftwareImageId": "server_image"
-        }
-    ],
-    "vims": [
-        {
-            "accessInfo": {
-                "username": "<username>",
-                "tenant": "<tenantName>",
-                "password": "<password>",
-                "region": "RegionOne"
-            },
-            "interfaceInfo": {
-                "endpoint": "https://<keyStoneIp>:5000/v2.0/",
-                "trustedCertificates": [],
-                "skipCertificateVerification": true,
-                "skipCertificateHostnameCheck": true
-            },
-            "vimInfoType": "OPENSTACK_V2_INFO",
-            "id": "vim_id"
-        }
-    ],
-    "instantiationLevelId": "default"
-}
index bdea8ad..3f66c11 100644 (file)
Binary files a/nokiav2/docs/sampleVnfs/simple/simple.v1.csar and b/nokiav2/docs/sampleVnfs/simple/simple.v1.csar differ
diff --git a/nokiav2/docs/sampleVnfs/simple/simple.v2.csar b/nokiav2/docs/sampleVnfs/simple/simple.v2.csar
new file mode 100644 (file)
index 0000000..a746625
Binary files /dev/null and b/nokiav2/docs/sampleVnfs/simple/simple.v2.csar differ
diff --git a/nokiav2/docs/sampleVnfs/simpleDual/cbam.instantiation.request.json b/nokiav2/docs/sampleVnfs/simpleDual/cbam.instantiation.request.json
deleted file mode 100644 (file)
index 16fc4d1..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-{
-    "apiVersion":"3.1",
-    "computeResourceFlavours": [
-        {
-            "vnfdVirtualComputeDescId": "server_compute",
-            "resourceId": "m1.small"
-        }
-    ],
-    "extVirtualLinks": [
-        {
-            "extCps": [
-                {
-                    "cpdId": "commisioning_ecp"
-                }
-            ],
-            "resourceId": "pub_net"
-        },
-        {
-            "extCps": [
-                {
-                    "cpdId": "vnftovnf_ecp"
-                }
-            ],
-            "resourceId": "preservedNetwork"
-        }
-    ],
-    "zones": [
-        {
-            "resourceId": "compute-a",
-            "id": "zoneInfoId"
-        }
-    ],
-    "flavourId": "scalable",
-    "grantlessMode": true,
-    "softwareImages": [
-        {
-            "resourceId": "ubuntu.16.04",
-            "vnfdSoftwareImageId": "server_image"
-        }
-    ],
-    "vims": [
-        {
-            "accessInfo": {
-                "username": "<username>",
-                "tenant": "<tenantName>",
-                "password": "<password>",
-                "region": "RegionOne"
-            }, 
-            "interfaceInfo": {
-                "endpoint": "https://<keyStoneIp>:5000/v2.0/",
-                "trustedCertificates": [],
-                "skipCertificateVerification": true,
-                "skipCertificateHostnameCheck": true 
-            },
-            "vimInfoType": "OPENSTACK_V2_INFO",
-            "id": "vim_id"
-        }
-   ],
-    "instantiationLevelId": "default"
-}
diff --git a/nokiav2/docs/sampleVnfs/simpleDual/cbam.package.zip b/nokiav2/docs/sampleVnfs/simpleDual/cbam.package.zip
new file mode 100644 (file)
index 0000000..4884162
Binary files /dev/null and b/nokiav2/docs/sampleVnfs/simpleDual/cbam.package.zip differ
diff --git a/nokiav2/docs/sampleVnfs/simpleDual/etsi_config.json b/nokiav2/docs/sampleVnfs/simpleDual/etsi_config.json
new file mode 100644 (file)
index 0000000..a0cff01
--- /dev/null
@@ -0,0 +1,39 @@
+{
+  "extensions": [
+    {
+      "name": "myNameKey",
+      "value": "myName"
+    }
+  ],
+  "computeResourceFlavours": [
+    {
+      "vnfdVirtualComputeDescId": "server_compute",
+      "resourceId": "m1.small"
+    }
+  ],
+  "extVirtualLinks": [
+    {
+      "extCps": [
+        {
+          "cpdId": "universal_ecp"
+        }
+      ],
+      "resourceId": "pub_net"
+    }
+  ],
+  "zones": [
+    {
+      "resourceId": "compute-a",
+      "id": "zoneInfoId"
+    }
+  ],
+  "flavourId": "scalable",
+  "vimType": "OPENSTACK_V3_INFO",
+  "instantiationLevel": "default",
+  "softwareImages": [
+    {
+      "resourceId": "ubuntu.16.04",
+      "vnfdSoftwareImageId": "server_image"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/nokiav2/docs/sampleVnfs/simpleDual/simple.dual.v1.csar b/nokiav2/docs/sampleVnfs/simpleDual/simple.dual.v1.csar
new file mode 100644 (file)
index 0000000..6f2aeec
Binary files /dev/null and b/nokiav2/docs/sampleVnfs/simpleDual/simple.dual.v1.csar differ
diff --git a/nokiav2/docs/sampleVnfs/simpleDual/simple.dual.v2.csar b/nokiav2/docs/sampleVnfs/simpleDual/simple.dual.v2.csar
new file mode 100644 (file)
index 0000000..89c448b
Binary files /dev/null and b/nokiav2/docs/sampleVnfs/simpleDual/simple.dual.v2.csar differ
diff --git a/nokiav2/docs/sampleVnfs/simpleDual/simpleDual.csar b/nokiav2/docs/sampleVnfs/simpleDual/simpleDual.csar
deleted file mode 100644 (file)
index 3a43b78..0000000
Binary files a/nokiav2/docs/sampleVnfs/simpleDual/simpleDual.csar and /dev/null differ
index bdea8ad..eb52ccb 100644 (file)
Binary files a/nokiav2/docs/sampleVnfs/simple_cmcc/simple.v1.csar and b/nokiav2/docs/sampleVnfs/simple_cmcc/simple.v1.csar differ
index dbb6cda..e142609 100644 (file)
Binary files a/nokiav2/docs/sampleVnfs/simple_cmcc/simple.v2.csar and b/nokiav2/docs/sampleVnfs/simple_cmcc/simple.v2.csar differ
index dd6efdb..3228786 100644 (file)
@@ -4,7 +4,13 @@ Sample VNFs
 Simple
 ------
 
-- CSAR: :download:`csar <sampleVnfs/simple/simple.csar>`
+- CSAR R1: :download:`csar <sampleVnfs/simple/simple.v1.csar>`
+
+- CSAR R2: :download:`csar <sampleVnfs/simple/simple.v2.csar>`
+
+- Original CBAM package: :download:`csar <sampleVnfs/simple_cmcc/cbam.package.zip>`
+
+- ETSI configuration: :download:`csar <sampleVnfs/simple/etsi_config.json>`
 
 - NS creation request on VF-C API :download:`create.json <sampleVnfs/simple/vfc.ns.create.request.json>` (several fields must be changed to fit actual environment)
 
@@ -23,7 +29,11 @@ Simple CMCC
 
 The Simple VNF altered to suite the CMCC lab environment (no support for floating IPs)
 
-- CSAR: :download:`csar <sampleVnfs/simple_cmcc/simple.csar>`
+- CSAR R1: :download:`csar <sampleVnfs/simple_cmcc/simple.v1.csar>`
+
+- CSAR R2: :download:`csar <sampleVnfs/simple_cmcc/simple.v2.csar>`
+
+- Original CBAM package: :download:`csar <sampleVnfs/simple_cmcc/cbam.package.zip>`
 
 - ETSI configuration: :download:`csar <sampleVnfs/simple_cmcc/etsi_config.json>`
 
@@ -43,18 +53,22 @@ The Simple VNF altered to suite the CMCC lab environment (no support for floatin
 Simple Dual
 -----------
 
-- CSAR: :download:`csar <sampleVnfs/simpleDual/simpleDual.csar>`
+- CSAR R1: :download:`csar <sampleVnfs/simpleDual/simpleDual.v1.csar>`
 
-- NS creation request on VF-C API :download:`create.json <sampleVnfs/simpleDual/vfc.ns.create.request.json>` (several fields must be changed to fit actual environment)
+- CSAR R2: :download:`csar <sampleVnfs/simpleDual/simpleDual.v2.csar>`
 
-- NS instantiation request on VF-C API :download:`instantiate.json <sampleVnfs/simpleDual/vfc.ns.instantiation.request.json>` (several fields must be changed to fit actual environment)
+- Original CBAM package: :download:`csar <sampleVnfs/simpleDual/cbam.package.zip>`
 
-- NS heal request on VF-C API: :download:`heal.json <sampleVnfs/simpleDual/vfc.ns.heal.request.json>` (several fields must be changed to fit actual environment)
+- ETSI configuration: :download:`csar <sampleVnfs/simple_cmcc/etsi_config.json>`
+
+- NS creation request on VF-C API :download:`create.json <sampleVnfs/simpleDual/vfc.ns.create.request.json>` (several fields must be changed to fit actual environment)
+
+- NS instantiation request on VF-C API :download:`instantiate.json <sampleVnfs/simpleDual/vfc.ns.instantiation.request.direct.json>` (several fields must be changed to fit actual environment)
 
-- VNF scale request on VF-C API: :download:`scale.json <sampleVnfs/simpleDual/vfc.vnf.scale.request.json>` (several fields must be changed to fit actual environment)
+- NS instantiation request on VF-C API when ETSI config is not supplied: download:`instantiate.json <sampleVnfs/simpleDual/vfc.ns.instantiation.request.json>` (several fields must be changed to fit actual environment)
 
+- E2E scaling data: :download:`instantiate.json <sampleVnfs/simpleDual/vfc.ns.instantiation.request.direct.json>` (several fields must be changed to fit actual environment)
 
-VOLTE IMS
----------
+- NS heal request on VF-C API: :download:`heal.json <sampleVnfs/simpleDual/vfc.ns.heal.request.json>` (several fields must be changed to fit actual environment)
 
-- TODO
\ No newline at end of file
+- VNF scale request on VF-C API: :download:`scale.json <sampleVnfs/simpleDual/vfc.vnf.scale.request.json>` (several fields must be changed to fit actual environment)
\ No newline at end of file
index f7f247a..5e9be7f 100644 (file)
@@ -21,6 +21,7 @@ import com.google.gson.Gson;
 import com.google.gson.JsonArray;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.Set;
@@ -33,9 +34,9 @@ import static org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.util.CbamUtils.childElem
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
- * Transforms a CBAM package into an ONAP package
+ * Generic non ONAP version dependent package conversion
  */
-public class OnapAbstractVnfdBuilder {
+abstract class OnapAbstractVnfdBuilder {
     public static final String DESCRIPTION = "description";
     public static final String PROPERTIES = "properties";
     public static final String REQUIREMENTS = "requirements";
@@ -63,7 +64,7 @@ public class OnapAbstractVnfdBuilder {
         return null;
     }
 
-    private JsonElement get(String name, Set<Map.Entry<String, JsonElement>> nodes) {
+    protected JsonElement get(String name, Set<Map.Entry<String, JsonElement>> nodes) {
         for (Map.Entry<String, JsonElement> node : nodes) {
             if (name.equals(node.getKey())) {
                 return node.getValue();
@@ -71,4 +72,80 @@ public class OnapAbstractVnfdBuilder {
         }
         throw new NoSuchElementException("The VNFD does not have a node called " + name + " but required by an other node");
     }
+
+    protected String buildEcp(String name, JsonElement ecp, Set<Map.Entry<String, JsonElement>> nodes) {
+        if (ecp.getAsJsonObject().has(REQUIREMENTS)) {
+            String icpName = getRequirement(ecp.getAsJsonObject().get(REQUIREMENTS).getAsJsonArray(), "internal_connection_point");
+            if (icpName != null) {
+                return buildEcpInternal(name, icpName, nodes);
+            } else {
+                logger.warn("The {} ecp does not have an internal connection point", name);
+            }
+        } else {
+            logger.warn("The {} ecp does not have an requirements section", name);
+        }
+        return "";
+    }
+
+    private String buildEcpInternal(String ecpName, String icpName, Set<Map.Entry<String, JsonElement>> nodes) {
+        JsonObject icpNode = get(icpName, nodes).getAsJsonObject();
+        if (icpNode.has(REQUIREMENTS)) {
+            String vdu = getRequirement(icpNode.getAsJsonObject().get(REQUIREMENTS).getAsJsonArray(), "virtual_binding");
+            //internal connection point is bound to VDU
+            if (vdu != null) {
+                return buildVduCpd(ecpName, vdu, child(icpNode, PROPERTIES));
+            } else {
+                logger.warn("The {} internal connection point of the {} ecp does not have a VDU", icpName, ecpName);
+            }
+        } else {
+            logger.warn("The {} internal connection point of the {} ecp does not have a requirements section", icpName, ecpName);
+        }
+        return "";
+    }
+
+    /**
+     * @param cbamVnfd the CBAM VNFD
+     * @return the converted ONAP VNFD
+     */
+    public String toOnapVnfd(String cbamVnfd) {
+        JsonObject root = new Gson().toJsonTree(new Yaml().load(cbamVnfd)).getAsJsonObject();
+        JsonObject topologyTemplate = child(root, "topology_template");
+        JsonObject substitution_mappings = child(topologyTemplate, "substitution_mappings");
+        Map<String, JsonElement> virtualLinks = new HashMap<>();
+        if (topologyTemplate.has("node_templates")) {
+            Set<Map.Entry<String, JsonElement>> nodeTemplates = child(topologyTemplate, "node_templates").entrySet();
+            StringBuilder body = new StringBuilder();
+            for (Map.Entry<String, JsonElement> node : nodeTemplates) {
+                String type = childElement(node.getValue().getAsJsonObject(), "type").getAsString();
+                if ("tosca.nodes.nfv.VDU".equals(type)) {
+                    body.append(buildVdu(node.getKey(), substitution_mappings, node.getValue().getAsJsonObject(), nodeTemplates));
+                } else if ("tosca.nodes.nfv.VirtualStorage".equals(type)) {
+                    body.append(buildVolume(node.getKey(), node.getValue().getAsJsonObject()));
+                } else if ("tosca.nodes.nfv.VL".equals(type)) {
+                    virtualLinks.put(node.getKey(), node.getValue());
+                    body.append(buildVl(node.getValue().getAsJsonObject().get(PROPERTIES).getAsJsonObject(), node.getKey()));
+                } else if ("tosca.nodes.nfv.ICP".equals(type)) {
+                    body.append(buildIcp(node.getKey(), node.getValue().getAsJsonObject()));
+                } else if ("tosca.nodes.nfv.ECP".equals(type)) {
+                    body.append(buildEcp(node.getKey(), node.getValue(), nodeTemplates));
+                } else {
+                    logger.warn("The {} type is not converted", type);
+                }
+            }
+            return buildHeader(topologyTemplate, virtualLinks) + body.toString();
+        }
+        return buildHeader(topologyTemplate, virtualLinks);
+    }
+
+    abstract protected String buildHeader(JsonObject toplogyTemplate, Map<String, JsonElement> virtualLinks);
+
+    abstract protected String buildVduCpd(String name, String vdu, JsonObject properties);
+
+    abstract protected String buildVdu(String name, JsonObject vnf, JsonObject vdu, Set<Map.Entry<String, JsonElement>> nodes);
+
+    abstract protected String buildIcp(String name, JsonObject icp);
+
+    abstract protected String buildVolume(String nodeName, JsonObject volume);
+
+    abstract protected String buildVl(JsonObject vlProperties, String name);
 }
 
 package org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.packagetransformer;
 
-import com.google.common.annotations.VisibleForTesting;
-import com.google.gson.Gson;
 import com.google.gson.JsonArray;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 import java.util.Map;
-import java.util.NoSuchElementException;
 import java.util.Set;
-import java.util.regex.Pattern;
 import org.slf4j.Logger;
-import org.yaml.snakeyaml.Yaml;
 
 import static org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.util.CbamUtils.child;
 import static org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.util.CbamUtils.childElement;
+import static org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.LifecycleManager.ETSI_CONFIG;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Transforms a CBAM package into an ONAP package
  */
-public class OnapVnfdBuilder {
-    public static final String DESCRIPTION = "description";
-    public static final String PROPERTIES = "properties";
-    public static final String REQUIREMENTS = "requirements";
-    private static Logger logger = getLogger(OnapVnfdBuilder.class);
-
-    @VisibleForTesting
-    static String indent(String content, int prefixSize) {
-        StringBuilder sb = new StringBuilder();
-        for (int i = 0; i < prefixSize; i++) {
-            sb.append("  ");
-        }
-        Pattern pattern = Pattern.compile("^(.*)$", Pattern.MULTILINE);
-        return pattern.matcher(content).replaceAll(sb.toString() + "$1");
-    }
+public class OnapR1VnfdBuilder extends OnapAbstractVnfdBuilder {
+    private static Logger logger = getLogger(OnapR1VnfdBuilder.class);
 
     private static String trimUnit(String data) {
-        //FIXME the unit should not be trimmed VF-C bug
+        //The R1 templates in Amsterdam release can not handle the scalar-unit types in Tosca
+        //templates, so that the MB, GB, ... units need to be removed even though the created
+        //Tosca template will be invalid
         return data.trim().replaceAll("[^0-9]", "");
     }
 
-    public static String getRequirement(JsonArray requirements, String key) {
-        for (int i = 0; i < requirements.size(); i++) {
-            JsonElement requirement = requirements.get(i);
-            Map.Entry<String, JsonElement> next = requirement.getAsJsonObject().entrySet().iterator().next();
-            String s = next.getKey();
-            if (key.equals(s)) {
-                return next.getValue().getAsString();
-            }
-        }
-        return null;
-    }
-
-    /**
-     * @param cbamVnfd the CBAM VNFD
-     * @return the converted ONAP VNFD
-     */
-    public String toOnapVnfd(String cbamVnfd) {
-        JsonObject root = new Gson().toJsonTree(new Yaml().load(cbamVnfd)).getAsJsonObject();
-        JsonObject topologyTemplate = child(root, "topology_template");
-        if (topologyTemplate.has("node_templates")) {
-            Set<Map.Entry<String, JsonElement>> nodeTemplates = child(topologyTemplate, "node_templates").entrySet();
-            StringBuilder body = new StringBuilder();
-            for (Map.Entry<String, JsonElement> node : nodeTemplates) {
-                String type = childElement(node.getValue().getAsJsonObject(), "type").getAsString();
-                if ("tosca.nodes.nfv.VDU".equals(type)) {
-                    body.append(buildVdu(node.getKey(), node.getValue().getAsJsonObject(), nodeTemplates));
-                } else if ("tosca.nodes.nfv.VirtualStorage".equals(type)) {
-                    body.append(buildVolume(node.getKey(), node.getValue().getAsJsonObject()));
-                } else if ("tosca.nodes.nfv.VL".equals(type)) {
-                    body.append(buildVl(node.getKey()));
-                } else if ("tosca.nodes.nfv.ICP".equals(type)) {
-                    body.append(buildIcp(node.getKey(), node.getValue().getAsJsonObject()));
-                } else if ("tosca.nodes.nfv.ECP".equals(type)) {
-                    body.append(buildEcp(node.getKey(), node.getValue(), nodeTemplates));
-                } else {
-                    logger.warn("The {} type is not converted", type);
-                }
-            }
-            return buildHeader(topologyTemplate) + body.toString();
-        }
-        return buildHeader(topologyTemplate);
-    }
-
-    private String buildHeader(JsonObject toplogyTemplate) {
+    @Override
+    protected String buildHeader(JsonObject toplogyTemplate, Map<String, JsonElement> virtualLinks) {
         JsonObject properties = child(child(toplogyTemplate, "substitution_mappings"), PROPERTIES);
         String descriptorVersion = properties.get("descriptor_version").getAsString();
         return "tosca_definitions_version: tosca_simple_yaml_1_0\n" +
@@ -115,22 +58,14 @@ public class OnapVnfdBuilder {
                 "  vnfdVersion: " + descriptorVersion + "\n\n" +
                 "topology_template:\n" +
                 "  inputs:\n" +
-                "    etsi_config:\n" +
+                "    " + ETSI_CONFIG + ":\n" +
                 "      type: string\n" +
                 "      description: The ETSI configuration\n" +
                 "  node_templates:\n";
     }
 
-    private JsonElement get(String name, Set<Map.Entry<String, JsonElement>> nodes) {
-        for (Map.Entry<String, JsonElement> node : nodes) {
-            if (name.equals(node.getKey())) {
-                return node.getValue();
-            }
-        }
-        throw new NoSuchElementException("The VNFD does not have a node called " + name + " but required by an other node");
-    }
-
-    private String buildVdu(String name, JsonObject vdu, Set<Map.Entry<String, JsonElement>> nodes) {
+    @Override
+    protected String buildVdu(String name, JsonObject vnf, JsonObject vdu, Set<Map.Entry<String, JsonElement>> nodes) {
         String memorySize = "";
         String cpuCount = "";
         StringBuilder body = new StringBuilder();
@@ -167,37 +102,7 @@ public class OnapVnfdBuilder {
         return header + body.toString();
     }
 
-    private String buildEcp(String name, JsonElement ecp, Set<Map.Entry<String, JsonElement>> nodes) {
-        if (ecp.getAsJsonObject().has(REQUIREMENTS)) {
-            String icpName = getRequirement(ecp.getAsJsonObject().get(REQUIREMENTS).getAsJsonArray(), "internal_connection_point");
-            if (icpName != null) {
-                return buildEcpInternal(name, icpName, nodes);
-            } else {
-                logger.warn("The {} ecp does not have an internal connection point", name);
-            }
-        } else {
-            logger.warn("The {} ecp does not have an requirements section", name);
-        }
-        return "";
-    }
-
-    private String buildEcpInternal(String ecpName, String icpName, Set<Map.Entry<String, JsonElement>> nodes) {
-        JsonObject icpNode = get(icpName, nodes).getAsJsonObject();
-        if (icpNode.has(REQUIREMENTS)) {
-            String vdu = getRequirement(icpNode.getAsJsonObject().get(REQUIREMENTS).getAsJsonArray(), "virtual_binding");
-            //internal connection point is bound to VDU
-            if (vdu != null) {
-                return buildVduCpd(ecpName, vdu, child(icpNode, PROPERTIES));
-            } else {
-                logger.warn("The {} internal connection point of the {} ecp does not have a VDU", icpName, ecpName);
-            }
-        } else {
-            logger.warn("The {} internal connection point of the {} ecp does not have a requirements section", icpName, ecpName);
-        }
-        return "";
-    }
-
-    private String buildIcp(String name, JsonObject icp) {
+    protected String buildIcp(String name, JsonObject icp) {
         if (icp.has(REQUIREMENTS)) {
             JsonArray requirements = icp.get(REQUIREMENTS).getAsJsonArray();
             String vdu = getRequirement(requirements, "virtual_binding");
@@ -224,7 +129,7 @@ public class OnapVnfdBuilder {
         return "";
     }
 
-    private String buildVduCpd(String name, String vdu, JsonObject properties) {
+    protected String buildVduCpd(String name, String vdu, JsonObject properties) {
         return indent(name + ":\n" +
                 "  type: tosca.nodes.nfv.VduCpd\n" +
                 "  " + PROPERTIES + ":\n" +
@@ -236,7 +141,7 @@ public class OnapVnfdBuilder {
                 "    - virtual_binding: " + vdu + "\n", 2);
     }
 
-    private String buildVolume(String nodeName, JsonObject volume) {
+    protected String buildVolume(String nodeName, JsonObject volume) {
         return indent(nodeName + ":\n" +
                 "  type: tosca.nodes.nfv.VDU.VirtualStorage\n" +
                 "  properties:\n" +
@@ -245,7 +150,8 @@ public class OnapVnfdBuilder {
                 "    size_of_storage: " + trimUnit(childElement(child(volume, PROPERTIES), "size_of_storage").getAsString()) + "\n", 2);
     }
 
-    private String buildVl(String name) {
+    @Override
+    protected String buildVl(JsonObject vlProperties, String name) {
         return indent(name + ":\n" +
                 "  type: tosca.nodes.nfv.VnfVirtualLinkDesc\n" +
                 "  properties:\n" +
index 099f641..e242284 100644 (file)
 
 package org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.packagetransformer;
 
-import com.google.gson.Gson;
 import com.google.gson.JsonArray;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
-import java.util.HashMap;
 import java.util.Map;
-import java.util.NoSuchElementException;
 import java.util.Set;
 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.onap.core.SelfRegistrationManager;
 import org.slf4j.Logger;
-import org.yaml.snakeyaml.Yaml;
 
-import static org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.packagetransformer.OnapVnfdBuilder.getRequirement;
-import static org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.packagetransformer.OnapVnfdBuilder.indent;
 import static org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.util.CbamUtils.child;
 import static org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.util.CbamUtils.childElement;
+import static org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.LifecycleManager.ETSI_CONFIG;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Transforms a CBAM package into an ONAP package
  */
-public class OnapR2VnfdBuilder {
-    public static final String DESCRIPTION = "description";
-    public static final String PROPERTIES = "properties";
-    public static final String REQUIREMENTS = "requirements";
+public class OnapR2VnfdBuilder extends OnapAbstractVnfdBuilder {
     private static Logger logger = getLogger(OnapR2VnfdBuilder.class);
 
-    private static String trimUnit(String data) {
-        //FIXME the unit should not be trimmed VF-C bug
-        return data;
-        //data.trim().replaceAll("[^0-9]", "");
-    }
-
-    /**
-     * @param cbamVnfd the CBAM VNFD
-     * @return the converted ONAP VNFD
-     */
-    public String toOnapVnfd(String cbamVnfd) {
-        JsonObject root = new Gson().toJsonTree(new Yaml().load(cbamVnfd)).getAsJsonObject();
-        JsonObject topologyTemplate = child(root, "topology_template");
-        JsonObject substitution_mappings = child(topologyTemplate, "substitution_mappings");
-        Map<String, JsonElement> virtualLinks = new HashMap<>();
-        if (topologyTemplate.has("node_templates")) {
-            Set<Map.Entry<String, JsonElement>> nodeTemplates = child(topologyTemplate, "node_templates").entrySet();
-
-            StringBuilder body = new StringBuilder();
-            for (Map.Entry<String, JsonElement> node : nodeTemplates) {
-                String type = childElement(node.getValue().getAsJsonObject(), "type").getAsString();
-                if ("tosca.nodes.nfv.VDU".equals(type)) {
-                    body.append(buildVdu(node.getKey(), substitution_mappings, node.getValue().getAsJsonObject(), nodeTemplates));
-                } else if ("tosca.nodes.nfv.VirtualStorage".equals(type)) {
-                    body.append(buildVolume(node.getKey(), node.getValue().getAsJsonObject()));
-                } else if ("tosca.nodes.nfv.VL".equals(type)) {
-                    virtualLinks.put(node.getKey(), node.getValue());
-                    body.append(buildVl(node.getValue().getAsJsonObject().get(PROPERTIES).getAsJsonObject(), node.getKey()));
-                } else if ("tosca.nodes.nfv.ICP".equals(type)) {
-                    body.append(buildIcp(node.getKey(), node.getValue().getAsJsonObject()));
-                } else if ("tosca.nodes.nfv.ECP".equals(type)) {
-                    body.append(buildEcp(node.getKey(), node.getValue(), nodeTemplates));
-                } else {
-                    logger.warn("The {} type is not converted", type);
-                }
-            }
-            return buildHeader(topologyTemplate, virtualLinks) + body.toString();
-        }
-        return buildHeader(topologyTemplate, virtualLinks);
-    }
-
-    private String buildHeader(JsonObject toplogyTemplate, Map<String, JsonElement> virtualLinks) {
+    protected String buildHeader(JsonObject toplogyTemplate, Map<String, JsonElement> virtualLinks) {
         JsonObject substitution_mappings = child(toplogyTemplate, "substitution_mappings");
         String vnfContent = buildVnf(substitution_mappings, virtualLinks);
         return "tosca_definitions_version: tosca_simple_profile_yaml_1_1\n" +
                 "\n" +
                 "topology_template:\n" +
                 "  inputs:\n" +
-                "    etsi_config:\n" +
+                "    " + ETSI_CONFIG + ":\n" +
                 "      type: string\n" +
                 "      description: The ETSI configuration\n" +
                 "  node_templates:\n" + vnfContent;
     }
 
-    private JsonElement get(String name, Set<Map.Entry<String, JsonElement>> nodes) {
-        for (Map.Entry<String, JsonElement> node : nodes) {
-            if (name.equals(node.getKey())) {
-                return node.getValue();
-            }
-        }
-        throw new NoSuchElementException("The VNFD does not have a node called " + name + " but required by an other node");
-    }
-
-    private String buildVdu(String name, JsonObject vnf, JsonObject vdu, Set<Map.Entry<String, JsonElement>> nodes) {
+    protected String buildVdu(String name, JsonObject vnf, JsonObject vdu, Set<Map.Entry<String, JsonElement>> nodes) {
         String memorySize = "";
         String cpuCount = "";
         StringBuilder body = new StringBuilder();
@@ -118,7 +60,7 @@ public class OnapR2VnfdBuilder {
             if ("virtual_compute".equals(s)) {
                 JsonObject virtualCompute = get(next.getValue().getAsString(), nodes).getAsJsonObject();
                 cpuCount = childElement(child(child(virtualCompute, PROPERTIES), "virtual_cpu"), "num_virtual_cpu").getAsString();
-                memorySize = trimUnit(childElement(child(child(virtualCompute, PROPERTIES), "virtual_memory"), "virtual_mem_size").getAsString());
+                memorySize = childElement(child(child(virtualCompute, PROPERTIES), "virtual_memory"), "virtual_mem_size").getAsString();
             } else if ("virtual_storage".equals(s)) {
                 String item = indent(
                         "- virtual_storage:\n" +
@@ -144,27 +86,13 @@ public class OnapR2VnfdBuilder {
                 indent(
                         "properties:\n" +
                                 "  virtual_memory:\n" +
-                                "    virtual_mem_size: " + trimUnit(memorySize) + "\n" +
+                                "    virtual_mem_size: " + memorySize + "\n" +
                                 "  virtual_cpu:\n" +
                                 "    num_virtual_cpu: " + cpuCount + "\n", 3) +
                 "  " + REQUIREMENTS + ":\n", 2);
         return header + body.toString();
     }
 
-    private String buildEcp(String name, JsonElement ecp, Set<Map.Entry<String, JsonElement>> nodes) {
-        if (ecp.getAsJsonObject().has(REQUIREMENTS)) {
-            String icpName = getRequirement(ecp.getAsJsonObject().get(REQUIREMENTS).getAsJsonArray(), "internal_connection_point");
-            if (icpName != null) {
-                return buildEcpInternal(name, icpName, nodes);
-            } else {
-                logger.warn("The {} ecp does not have an internal connection point", name);
-            }
-        } else {
-            logger.warn("The {} ecp does not have an requirements section", name);
-        }
-        return "";
-    }
-
     private String buildVnf(JsonObject vnf, Map<String, JsonElement> virtualLinks) {
         JsonObject vnfProperties = child(vnf, PROPERTIES);
         JsonObject flavourProperties = child(child(child(vnf, "capabilities"), "deployment_flavour"), "properties");
@@ -192,23 +120,7 @@ public class OnapR2VnfdBuilder {
                 vlContent.toString();
     }
 
-    private String buildEcpInternal(String ecpName, String icpName, Set<Map.Entry<String, JsonElement>> nodes) {
-        JsonObject icpNode = get(icpName, nodes).getAsJsonObject();
-        if (icpNode.has(REQUIREMENTS)) {
-            String vdu = getRequirement(icpNode.getAsJsonObject().get(REQUIREMENTS).getAsJsonArray(), "virtual_binding");
-            //internal connection point is bound to VDU
-            if (vdu != null) {
-                return buildVduCpd(ecpName, vdu, child(icpNode, PROPERTIES));
-            } else {
-                logger.warn("The {} internal connection point of the {} ecp does not have a VDU", icpName, ecpName);
-            }
-        } else {
-            logger.warn("The {} internal connection point of the {} ecp does not have a requirements section", icpName, ecpName);
-        }
-        return "";
-    }
-
-    private String buildIcp(String name, JsonObject icp) {
+    protected String buildIcp(String name, JsonObject icp) {
         if (icp.has(REQUIREMENTS)) {
             JsonArray requirements = icp.get(REQUIREMENTS).getAsJsonArray();
             String vdu = getRequirement(requirements, "virtual_binding");
@@ -237,7 +149,7 @@ public class OnapR2VnfdBuilder {
         return "";
     }
 
-    private String buildVduCpd(String name, String vdu, JsonObject properties) {
+    protected String buildVduCpd(String name, String vdu, JsonObject properties) {
         return indent(name + ":\n" +
                 "  type: tosca.nodes.nfv.VduCp\n" +
                 "  " + PROPERTIES + ":\n" +
@@ -250,21 +162,22 @@ public class OnapR2VnfdBuilder {
                 "    - virtual_binding: " + vdu + "\n", 2);
     }
 
-    private String buildVolume(String nodeName, JsonObject volume) {
+    protected String buildVolume(String nodeName, JsonObject volume) {
         return indent(nodeName + ":\n" +
                 "  type: tosca.nodes.nfv.Vdu.VirtualStorage\n" +
                 "  properties:\n" +
                 "    type_of_storage: volume\n" +
-                "    size_of_storage: " + trimUnit(childElement(child(volume, PROPERTIES), "size_of_storage").getAsString()) + "\n", 2);
+                "    size_of_storage: " + childElement(child(volume, PROPERTIES), "size_of_storage").getAsString() + "\n", 2);
     }
 
-    private String buildVl(JsonObject vlProperties, String name) {
+    protected String buildVl(JsonObject vlProperties, String name) {
+        JsonObject connectivityType = child(vlProperties, "connectivity_type");
         return indent(name + ":\n" +
                 "  type: tosca.nodes.nfv.VnfVirtualLink\n" +
                 "  properties:\n" +
                 "    connectivity_type:\n" +
-                "      layer_protocol: [ " + childElement(child(vlProperties, "connectivity_type"), "layer_protocol").getAsString() + " ]\n" +
-                "      flow_pattern: " + childElement(child(vlProperties, "connectivity_type"), "flow_pattern").getAsString() + "\n" +
+                "      layer_protocol: [ " + childElement(connectivityType, "layer_protocol").getAsString() + " ]\n" +
+                (connectivityType.has("flow_pattern") ? "      flow_pattern: " + childElement(connectivityType, "flow_pattern").getAsString() + "\n" : "") +
                 "    vl_profile:\n" +
                 "      max_bit_rate_requirements:\n" +
                 "        root: " + Integer.MAX_VALUE + "\n" + //FIXME GAP IN CBAM TEMPLATE
@@ -33,7 +33,7 @@ import static org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.CatalogManager.getV
  * Transforms a CBAM package into an ONAP package
  */
 
-public class OnapR1VnfPackageBuilder {
+public class OnapVnfPackageBuilder {
 
     /**
      * Entry point for the command line package transformer
@@ -41,7 +41,7 @@ public class OnapR1VnfPackageBuilder {
      * @param args not used (required due to signature)
      */
     public static void main(String[] args) throws Exception {
-        byte[] covert = new OnapR1VnfPackageBuilder().covert(systemFunctions().in(), SupportedOnapPackageVersions.V1);
+        byte[] covert = new OnapVnfPackageBuilder().covert(systemFunctions().in(), SupportedOnapPackageVersions.V1);
         systemFunctions().out().write(covert);
     }
 
@@ -57,7 +57,7 @@ public class OnapR1VnfPackageBuilder {
         byte[] cbamVnfdContent = vnfdContent.toByteArray();
         String onapVnfd = SupportedOnapPackageVersions.V2 == version ?
                 new OnapR2VnfdBuilder().toOnapVnfd(new String(cbamVnfdContent, StandardCharsets.UTF_8)) :
-                new OnapVnfdBuilder().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);
     }
index 95438ca..758c8b3 100644 (file)
@@ -22,7 +22,7 @@ import java.io.IOException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.Part;
-import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.packagetransformer.OnapR1VnfPackageBuilder;
+import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.packagetransformer.OnapVnfPackageBuilder;
 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.packagetransformer.SupportedOnapPackageVersions;
 import org.slf4j.Logger;
 import org.springframework.stereotype.Controller;
@@ -47,7 +47,7 @@ import static org.springframework.web.bind.annotation.RequestMethod.POST;
 @RequestMapping(value = BASE_URL)
 public class ConverterApi {
     private static Logger logger = getLogger(ConverterApi.class);
-    private OnapR1VnfPackageBuilder vnfPackageConverter = new OnapR1VnfPackageBuilder();
+    private OnapVnfPackageBuilder vnfPackageConverter = new OnapVnfPackageBuilder();
 
     /**
      * Return the converted ONAP package
index f64ce1e..7c8e231 100644 (file)
@@ -334,6 +334,7 @@ public class LifecycleManager {
                 return child(child(operation.getValue().getAsJsonObject(), "inputs"), "additional_parameters").entrySet();
             }
         }
+
         throw buildFatalFailure(logger, "Unable to find operation named " + operationName);
     }
 
index 69e3482..b37d95f 100644 (file)
@@ -28,10 +28,7 @@ import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.onap.direct.TestSdcPackageProvi
 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.TestCbamVnfPackageBuilder;
-import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.packagetransformer.TestCbamVnfdBuilder;
-import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.packagetransformer.TestOnapVnfPackageBuilder;
-import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.packagetransformer.TestOnapVnfdBuilder;
+import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.packagetransformer.*;
 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.restapi.*;
 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.spring.TestRealConfig;
 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.spring.TestServletInitializer;
@@ -70,7 +67,8 @@ import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.notification.TestReportedA
         TestVfcNotificationSender.class,
 
         TestCbamVnfdBuilder.class,
-        TestOnapVnfdBuilder.class,
+        TestOnapR1VnfdBuilder.class,
+        TestOnapR2VnfdBuilder.class,
         TestCbamVnfPackageBuilder.class,
         TestOnapVnfPackageBuilder.class,
 
diff --git a/nokiav2/driver/src/test/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/packagetransformer/TestOnapAbstractVnfdBuilder.java b/nokiav2/driver/src/test/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/packagetransformer/TestOnapAbstractVnfdBuilder.java
new file mode 100644 (file)
index 0000000..0d2c348
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * 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 org.junit.Test;
+import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.TestBase;
+
+import static junit.framework.TestCase.assertEquals;
+
+public class TestOnapAbstractVnfdBuilder extends TestBase {
+
+    @Test
+    public void indent() {
+        assertEquals("    x", OnapAbstractVnfdBuilder.indent("x", 2));
+        assertEquals("    x\n", OnapAbstractVnfdBuilder.indent("x\n", 2));
+        assertEquals("    x\n    y", OnapAbstractVnfdBuilder.indent("x\ny", 2));
+        assertEquals("    x\n    y\n", OnapAbstractVnfdBuilder.indent("x\ny\n", 2));
+        assertEquals("    \n", OnapAbstractVnfdBuilder.indent("\n", 2));
+    }
+}
@@ -27,22 +27,14 @@ import static org.mockito.Mockito.verify;
 import static org.springframework.test.util.ReflectionTestUtils.setField;
 
 
-public class TestOnapVnfdBuilder extends TestBase {
-    private OnapVnfdBuilder packageTransformer = new OnapVnfdBuilder();
+public class TestOnapR1VnfdBuilder extends TestBase {
+    private OnapR1VnfdBuilder packageTransformer = new OnapR1VnfdBuilder();
 
 
     @Before
     public void init() {
-        setField(OnapVnfdBuilder.class, "logger", logger);
-    }
-
-    @Test
-    public void indent() {
-        assertEquals("    x", packageTransformer.indent("x", 2));
-        assertEquals("    x\n", packageTransformer.indent("x\n", 2));
-        assertEquals("    x\n    y", packageTransformer.indent("x\ny", 2));
-        assertEquals("    x\n    y\n", packageTransformer.indent("x\ny\n", 2));
-        assertEquals("    \n", packageTransformer.indent("\n", 2));
+        setField(OnapAbstractVnfdBuilder.class, "logger", logger);
+        setField(OnapR1VnfdBuilder.class, "logger", logger);
     }
 
     /**
@@ -73,7 +65,7 @@ public class TestOnapVnfdBuilder extends TestBase {
      * if a node refers to a non existing node it results in a failure
      */
     @Test
-    public void testInconsitentVnfd() {
+    public void testInconsistentVnfd() {
         try {
             packageTransformer.toOnapVnfd(new String(TestUtil.loadFile("unittests/packageconverter/nodes.vnfd.inconsistent.cbam.yaml")));
             fail();
index 6916d38..a8f6a64 100644 (file)
@@ -23,6 +23,7 @@ import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.TestBase;
 
 import static junit.framework.TestCase.assertEquals;
 import static junit.framework.TestCase.fail;
+import static org.mockito.Mockito.verify;
 import static org.springframework.test.util.ReflectionTestUtils.setField;
 
 
@@ -32,7 +33,8 @@ public class TestOnapR2VnfdBuilder extends TestBase {
 
     @Before
     public void init() {
-        setField(OnapVnfdBuilder.class, "logger", logger);
+        setField(OnapAbstractVnfdBuilder.class, "logger", logger);
+        setField(OnapR2VnfdBuilder.class, "logger", logger);
     }
 
 
@@ -50,14 +52,14 @@ public class TestOnapR2VnfdBuilder extends TestBase {
     @Test
     public void testNodes() {
         assertEquals(new String(TestUtil.loadFile("unittests/packageconverter/nodes.vnfd.onap.v2.yaml")), packageTransformer.toOnapVnfd(new String(TestUtil.loadFile("unittests/packageconverter/nodes.vnfd.cbam.yaml"))));
-       /* verify(logger).warn("The {} ecp does not have an internal connection point", "myEcpWithoutIcp");
+        verify(logger).warn("The {} ecp does not have an internal connection point", "myEcpWithoutIcp");
         verify(logger).warn("The {} ecp does not have an requirements section", "ecpWithIcpWithOutRequirements");
         verify(logger).warn("The {} internal connection point of the {} ecp does not have a VDU", "icpWithoutVdu", "myEcpWithoutIcpWithoutVdu");
         verify(logger).warn("The {} internal connection point of the {} ecp does not have a requirements section", "icpWithOutRequiements", "myEcpWithoutIcpWithoutIcpReq");
         verify(logger).warn("The {} internal connection point does not have a VDU", "icpWithOutVdu");
         verify(logger).warn("The {} internal connection point does not have a requirements section", "icpWithOutRequiements");
         verify(logger).warn("The {} internal connection point does not have a VL", "icpWithOutVl");
-        verify(logger).warn("The {} type is not converted", "tosca.nodes.nfv.Unknown")*/
+        verify(logger).warn("The {} type is not converted", "tosca.nodes.nfv.Unknown");
     }
 
     /**
index 55949ab..d2a9255 100644 (file)
@@ -46,10 +46,10 @@ public class TestOnapVnfPackageBuilder extends TestBase {
         when(systemFunctions.loadFile("MainServiceTemplate.mf")).thenCallRealMethod();
 
         String cbamVnfd = new String(TestUtil.loadFile("unittests/packageconverter/cbam.package.zip.vnfd"));
-        String expectedOnapVnfd = new OnapVnfdBuilder().toOnapVnfd(cbamVnfd);
+        String expectedOnapVnfd = new OnapR1VnfdBuilder().toOnapVnfd(cbamVnfd);
 
         //when
-        OnapR1VnfPackageBuilder.main(null);
+        OnapVnfPackageBuilder.main(null);
         //verify
         assertFileInZip(bos.toByteArray(), "TOSCA-Metadata/TOSCA.meta", TestUtil.loadFile("TOSCA.meta"));
         assertFileInZip(bos.toByteArray(), "MainServiceTemplate.yaml", expectedOnapVnfd.getBytes());
@@ -59,13 +59,60 @@ public class TestOnapVnfPackageBuilder extends TestBase {
         assertItenticalZips(expectedModifiedCbamPackage, actualModifiedCbamVnfPackage.toByteArray());
     }
 
+    /**
+     * Test conversion for V1 package
+     */
+    @Test
+    public void testConversionViaV1() throws Exception {
+        when(systemFunctions.loadFile("cbam.pre.collectConnectionPoints.js")).thenCallRealMethod();
+        when(systemFunctions.loadFile("cbam.collectConnectionPoints.js")).thenCallRealMethod();
+        when(systemFunctions.loadFile("cbam.post.collectConnectionPoints.js")).thenCallRealMethod();
+        when(systemFunctions.loadFile("TOSCA.meta")).thenCallRealMethod();
+        when(systemFunctions.loadFile("MainServiceTemplate.mf")).thenCallRealMethod();
+
+        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);
+        //verify
+        assertFileInZip(convertedPackage, "TOSCA-Metadata/TOSCA.meta", TestUtil.loadFile("TOSCA.meta"));
+        assertFileInZip(convertedPackage, "MainServiceTemplate.yaml", expectedOnapVnfd.getBytes());
+        assertFileInZip(convertedPackage, "MainServiceTemplate.mf", TestUtil.loadFile("MainServiceTemplate.mf"));
+        ByteArrayOutputStream actualModifiedCbamVnfPackage = getFileInZip(new ByteArrayInputStream(convertedPackage), "Artifacts/Deployment/OTHER/cbam.package.zip");
+        byte[] expectedModifiedCbamPackage = new CbamVnfPackageBuilder().toModifiedCbamVnfPackage(TestUtil.loadFile("unittests/packageconverter/cbam.package.zip"), "vnfdloc/a.yaml", new CbamVnfdBuilder().build(cbamVnfd));
+        assertItenticalZips(expectedModifiedCbamPackage, actualModifiedCbamVnfPackage.toByteArray());
+    }
+
+    /**
+     * Test conversion for V2 package
+     */
+    @Test
+    public void testConversionViaV2() throws Exception {
+        when(systemFunctions.loadFile("cbam.pre.collectConnectionPoints.js")).thenCallRealMethod();
+        when(systemFunctions.loadFile("cbam.collectConnectionPoints.js")).thenCallRealMethod();
+        when(systemFunctions.loadFile("cbam.post.collectConnectionPoints.js")).thenCallRealMethod();
+        when(systemFunctions.loadFile("TOSCA.meta")).thenCallRealMethod();
+        when(systemFunctions.loadFile("MainServiceTemplate.mf")).thenCallRealMethod();
+
+        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);
+        //verify
+        assertFileInZip(convertedPackage, "TOSCA-Metadata/TOSCA.meta", TestUtil.loadFile("TOSCA.meta"));
+        assertFileInZip(convertedPackage, "MainServiceTemplate.yaml", expectedOnapVnfd.getBytes());
+        assertFileInZip(convertedPackage, "MainServiceTemplate.mf", TestUtil.loadFile("MainServiceTemplate.mf"));
+        ByteArrayOutputStream actualModifiedCbamVnfPackage = getFileInZip(new ByteArrayInputStream(convertedPackage), "Artifacts/Deployment/OTHER/cbam.package.zip");
+        byte[] expectedModifiedCbamPackage = new CbamVnfPackageBuilder().toModifiedCbamVnfPackage(TestUtil.loadFile("unittests/packageconverter/cbam.package.zip"), "vnfdloc/a.yaml", new CbamVnfdBuilder().build(cbamVnfd));
+        assertItenticalZips(expectedModifiedCbamPackage, actualModifiedCbamVnfPackage.toByteArray());
+    }
 
     /**
      * Prevents moving the class (customer documentation) must be updated
      */
     @Test
     public void testPreventMove() {
-        assertEquals("b3JnLm9uYXAudmZjLm5mdm8uZHJpdmVyLnZuZm0uc3ZuZm0ubm9raWEucGFja2FnZXRyYW5zZm9ybWVyLk9uYXBSMVZuZlBhY2thZ2VCdWlsZGVy", Base64.getEncoder().encodeToString(OnapR1VnfPackageBuilder.class.getCanonicalName().getBytes()));
+        assertEquals("b3JnLm9uYXAudmZjLm5mdm8uZHJpdmVyLnZuZm0uc3ZuZm0ubm9raWEucGFja2FnZXRyYW5zZm9ybWVyLk9uYXBWbmZQYWNrYWdlQnVpbGRlcg==", Base64.getEncoder().encodeToString(OnapVnfPackageBuilder.class.getCanonicalName().getBytes()));
     }
 
 
index 48d2cab..99fd203 100644 (file)
@@ -31,7 +31,7 @@ import org.mockito.Mock;
 import org.mockito.Mockito;
 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.packagetransformer.CbamVnfPackageBuilder;
 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.packagetransformer.CbamVnfdBuilder;
-import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.packagetransformer.OnapVnfdBuilder;
+import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.packagetransformer.OnapR1VnfdBuilder;
 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.util.TestUtil;
 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.TestBase;
 import org.springframework.http.HttpHeaders;
@@ -88,7 +88,7 @@ public class TestConverterApi extends TestBase {
 
     private void verifyVnfPackageWritterToOutputStream(ByteArrayOutputStream bos) throws Exception {
         String cbamVnfd = new String(TestUtil.loadFile("unittests/packageconverter/cbam.package.zip.vnfd"));
-        String expectedOnapVnfd = new OnapVnfdBuilder().toOnapVnfd(cbamVnfd);
+        String expectedOnapVnfd = new OnapR1VnfdBuilder().toOnapVnfd(cbamVnfd);
         assertFileInZip(bos.toByteArray(), "TOSCA-Metadata/TOSCA.meta", TestUtil.loadFile("TOSCA.meta"));
         assertFileInZip(bos.toByteArray(), "MainServiceTemplate.yaml", expectedOnapVnfd.getBytes());
         assertFileInZip(bos.toByteArray(), "MainServiceTemplate.mf", TestUtil.loadFile("MainServiceTemplate.mf"));
@@ -133,6 +133,27 @@ public class TestConverterApi extends TestBase {
         }
     }
 
+    /**
+     * error is propagated if unable to extract version from HTTP request
+     */
+    @Test
+    public void testUnableToExtractVersion() throws Exception {
+        IOException expectedException = new IOException();
+        Part part = Mockito.mock(Part.class);
+        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()));
+        try {
+            converterApi.convert(httpResponse, httpRequest);
+            fail();
+        } catch (Exception e) {
+            verify(logger).error("Unable to determine the desired ONAP package version", expectedException);
+            assertEquals("Unable to determine the desired ONAP package version", e.getMessage());
+            assertEquals(expectedException, e.getCause());
+        }
+    }
+
     /**
      * error is propagated if unable to extract package from HTTP request
      */
index 5702c91..b9c1c68 100644 (file)
@@ -13,9 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 ###############################################################################
-
 server.error.whitelabel.enabled=false
-
 ###############################################################################
 # Beginning  of mandatory properties                                          #
 ###############################################################################
@@ -42,7 +40,6 @@ skipCertificateVerification=true
 trustedCertificates=
 # the identifier of the VNFM in A&AI core system registry
 vnfmId=7c267318-2a6a-4d47-b039-a7cce5fea38b
-
 ###############################################################################
 # Configuration parameters for direct integration
 ###############################################################################
@@ -61,7 +58,6 @@ aaiPassword=AAI
 sdcUsername=SDC
 #The password to access SDC
 sdcPassword=SDC
-
 ###############################################################################
 # End of mandatory properties for driver                                      #
 ###############################################################################
index af64fd9..d273291 100644 (file)
@@ -13,9 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 ###############################################################################
-
 server.error.whitelabel.enabled=false
-
 ###############################################################################
 # Beginning of mandatory properties                                           #
 ###############################################################################
@@ -42,7 +40,6 @@ skipCertificateVerification=true
 trustedCertificates=
 # the identifier of the VNFM in A&AI core system registry
 vnfmId=53fbba58-464e-4cc4-8d33-aaaf072f0a27
-
 ###############################################################################
 # Configuration parameters for direct integration
 ###############################################################################
@@ -61,7 +58,6 @@ aaiPassword=AAI
 sdcUsername=SDC
 #The password to access SDC
 sdcPassword=SDC
-
 ###############################################################################
 # End of mandatory properties for driver                                      #
 ###############################################################################
index ac555df..fe99695 100644 (file)
Binary files a/nokiav2/driver/src/test/resources/unittests/packageconverter/cbam.package.zip and b/nokiav2/driver/src/test/resources/unittests/packageconverter/cbam.package.zip differ
index 3c12138..af4a530 100644 (file)
@@ -15,3 +15,8 @@ topology_template:
       Basic:
         instantiate:
         terminate:
+    capabilities:
+      deployment_flavour:
+        properties:
+          flavour_id: myFlavorId
+          description: myFlavorDescription
index 3870605..c893b93 100644 (file)
@@ -67,7 +67,6 @@ topology_template:
       properties:
         connectivity_type:
           layer_protocol: ipv4
-          flow_pattern: mesh
         description: myDescription
 
     icpWithOutEcp:
index fe0ccf4..ba1c8fa 100644 (file)
@@ -77,7 +77,6 @@ topology_template:
       properties:
         connectivity_type:
           layer_protocol: [ ipv4 ]
-          flow_pattern: mesh
         vl_profile:
           max_bit_rate_requirements:
             root: 2147483647