Fix template generation for R2
[vfc/nfvo/driver/vnfm/svnfm.git] / nokiav2 / driver / src / main / java / org / onap / vfc / nfvo / driver / vnfm / svnfm / nokia / packagetransformer / OnapAbstractVnfdBuilder.java
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);
 }