Third part of onap rename
[appc.git] / appc-sequence-generator / appc-sequence-generator-bundle / src / main / java / org / onap / appc / seqgen / dgplugin / impl / SequenceGeneratorPluginImpl.java
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/onap/appc/seqgen/dgplugin/impl/SequenceGeneratorPluginImpl.java b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/onap/appc/seqgen/dgplugin/impl/SequenceGeneratorPluginImpl.java
new file mode 100644 (file)
index 0000000..c0ea413
--- /dev/null
@@ -0,0 +1,243 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property.  All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.appc.seqgen.dgplugin.impl;
+
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.commons.lang3.StringUtils;
+import org.onap.appc.dg.objects.*;
+import org.onap.appc.domainmodel.Vnf;
+import org.onap.appc.domainmodel.Vnfc;
+import org.onap.appc.domainmodel.Vserver;
+import org.onap.appc.domainmodel.lcm.VNFOperation;
+import org.onap.appc.exceptions.APPCException;
+import org.onap.appc.seqgen.SequenceGenerator;
+import org.onap.appc.seqgen.dgplugin.SequenceGeneratorPlugin;
+import org.onap.appc.seqgen.impl.SequenceGeneratorFactory;
+import org.onap.appc.seqgen.objects.Constants;
+import org.onap.appc.seqgen.objects.SequenceGeneratorInput;
+import org.onap.appc.seqgen.objects.Transaction;
+import org.onap.ccsdk.sli.core.sli.SvcLogicContext;
+
+import java.io.IOException;
+import java.util.*;
+
+public class SequenceGeneratorPluginImpl implements SequenceGeneratorPlugin {
+
+    private static final EELFLogger logger = EELFManager.getInstance().getLogger(SequenceGeneratorPluginImpl.class);
+
+    @Override
+    public void generateSequence(Map<String, String> params, SvcLogicContext context) {
+        ObjectMapper objectMapper = new ObjectMapper();
+        String inputJSON = context.getAttribute("inputJSON");
+        logger.debug("Input to Sequence Generator " + inputJSON);
+        try {
+            SequenceGeneratorInput sequenceGeneratorInput = buildSequenceGeneratorInput(inputJSON);
+            List<Transaction> sequence = generateSequence(sequenceGeneratorInput);
+            String output = objectMapper.writeValueAsString(sequence);
+            logger.debug("Sequence Generator Output " + output);
+
+            context.setAttribute("output", output);
+        } catch (Exception e) {
+            logger.error("Error generating sequence", e);
+            context.setAttribute("error-code", "401");
+            context.setAttribute("error-message", "Error generating sequence " + e.getMessage());
+        }
+    }
+
+    private SequenceGeneratorInput buildSequenceGeneratorInput(String inputJson) throws IOException, APPCException {
+        ObjectMapper objectMapper = new ObjectMapper();
+        SequenceGeneratorInput sequenceGeneratorInput ;
+        objectMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
+        objectMapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true);
+        sequenceGeneratorInput = objectMapper.readValue(inputJson, SequenceGeneratorInput.class);
+
+        InventoryModel inventoryModel = buildInventoryModel(inputJson);
+        sequenceGeneratorInput.setInventoryModel(inventoryModel);
+
+        VnfcDependencyModel dependencyModel = buildDependencyModel(inputJson);
+        sequenceGeneratorInput.setDependencyModel(dependencyModel);
+
+        return sequenceGeneratorInput;
+    }
+    private List<Transaction> generateSequence(SequenceGeneratorInput sequenceGeneratorInput) throws APPCException {
+        if (sequenceGeneratorInput.getRequestInfo() == null) {
+            throw new APPCException("Request info is not provided in the input");
+        }
+        String action = sequenceGeneratorInput.getRequestInfo().getAction();
+        VNFOperation operation = VNFOperation.findByString(action);
+        if (operation == null) {
+            throw new APPCException("Invalid Action " + action);
+        }
+        SequenceGenerator sequenceGenerator = SequenceGeneratorFactory.getInstance().createSequenceGenerator(operation);
+        return sequenceGenerator.generateSequence(sequenceGeneratorInput);
+    }
+
+    // Dependency model is an optional attribute and may contain null values
+    private VnfcDependencyModel buildDependencyModel(String inputJson) throws IOException, APPCException {
+        Set<Node<Vnfc>> dependency = new HashSet<>();
+        ObjectMapper objectMapper = new ObjectMapper();
+        objectMapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true);
+        JsonNode rootNode = objectMapper.readTree(inputJson);
+        JsonNode vnfcs = getVnfcsNode(rootNode);
+        if (vnfcs != null) {
+            for (JsonNode vnfcNode : vnfcs) {
+                String vnfcType = readVnfcType(vnfcNode);
+                String mandatory = readMandatory(vnfcNode);
+                String resilience = readResilience(vnfcNode);
+                Vnfc vnfc = new Vnfc(vnfcType, resilience, null, Boolean.parseBoolean(mandatory));
+                Node<Vnfc> currentNode = getNode(dependency, vnfcType);
+                if (currentNode == null) {
+                    currentNode = new Node<>(vnfc);
+                    dependency.add(currentNode);
+                } else {
+                    currentNode.getChild().setMandatory(Boolean.valueOf(mandatory));
+                    currentNode.getChild().setResilienceType(resilience);
+                }
+                JsonNode parents = vnfcNode.get("parents");
+                for (JsonNode parent : parents) {
+                    String parentVnfcType = parent.asText();
+                    Node<Vnfc> parentNode = getNode(dependency, parentVnfcType);
+                    if (parentNode != null) {
+                        currentNode.addParent(parentNode.getChild());
+                    } else {
+                        Vnfc parentVnfc = new Vnfc(parentVnfcType, null, null, false);
+                        parentNode = new Node<>(parentVnfc);
+                        currentNode.addParent(parentVnfc);
+                        dependency.add(parentNode);
+                    }
+                }
+
+            }
+            return new VnfcDependencyModel(dependency);
+        }
+        return null;
+    }
+
+    private String readResilience(JsonNode vnfcNode) {
+        String resilience = null;
+        if (vnfcNode.get("resilience") != null) {
+            resilience = vnfcNode.get("resilience").asText();
+        }
+        return resilience;
+    }
+
+    private String readMandatory(JsonNode vnfcNode) {
+        String mandatory ;
+        JsonNode mandatoryNode = vnfcNode.get("mandatory");
+        if (mandatoryNode == null) {
+            mandatory = "false";
+        } else {
+            mandatory = mandatoryNode.asText();
+        }
+        return mandatory;
+    }
+
+    private String readVnfcType(JsonNode vnfcNode) throws APPCException {
+        JsonNode vnfcTypeNode = vnfcNode.get(Constants.VNFC_TYPE);
+        if (vnfcTypeNode == null) {
+            throw new APPCException("vnfc-type is not available in dependency info");
+        }
+        return vnfcTypeNode.asText();
+    }
+
+    private JsonNode getVnfcsNode(JsonNode rootNode) {
+        JsonNode dependencyInfo = rootNode.get("dependency-info");
+        JsonNode vnfcs = null;
+        if (dependencyInfo != null) {
+            vnfcs = dependencyInfo.get("vnfcs");
+        }
+        return vnfcs;
+    }
+
+    private Node<Vnfc> getNode(Set<Node<Vnfc>> dependency, String vnfcType) {
+        for (Node<Vnfc> node : dependency) {
+            if (node.getChild().getVnfcType().equals(vnfcType)) {
+                return node;
+            }
+        }
+        return null;
+    }
+
+    private InventoryModel buildInventoryModel(String inputJson) throws IOException, APPCException {
+        ObjectMapper objectMapper = new ObjectMapper();
+        objectMapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true);
+        JsonNode jsonNode = objectMapper.readTree(inputJson);
+        JsonNode inventoryInfo = jsonNode.get("inventory-info");
+        if (inventoryInfo == null) {
+            throw new APPCException("inventory-info is not provided in the input");
+        }
+        JsonNode vnfInfo = inventoryInfo.get("vnf-info");
+        if (vnfInfo == null) {
+            throw new APPCException("vnf-info is not provided in the input");
+        }
+
+        String vnfId = vnfInfo.get("vnf-id").asText();
+        String vnfType = vnfInfo.get("vnf-type").asText();
+        String vnfVersion = vnfInfo.get("vnf-version").asText();
+
+        Vnf vnf = new Vnf(vnfId, vnfType, vnfVersion);
+
+        JsonNode vms = vnfInfo.get("vm");
+
+        Map<Vnfc, List<Vserver>> vfcs = new HashMap<>();
+        for (JsonNode vm : vms) {
+            if(vm.get("vserver-id")== null){
+                throw new APPCException("vserver-id not found ");
+            }
+            String vserverId = vm.get("vserver-id").asText();
+            Vserver vserver = new Vserver(null, null, vserverId, null, null);
+            JsonNode vnfc = vm.get("vnfc");
+            if (vnfc.get("vnfc-name") == null) {
+                throw new APPCException("vnfc-name not found for vserver " + vserverId);
+            }
+            String vnfcName = vnfc.get("vnfc-name").asText();
+            if (vnfc.get("vnfc-type") == null) {
+                throw new APPCException("vnfc-type not found for vserver " + vserverId);
+            }
+            String vnfcType = vnfc.get("vnfc-type").asText();
+            if (StringUtils.isEmpty(vnfcType)) {
+                throw new APPCException("vserver " + vserverId + " is not associated with any vnfc");
+            }
+            Vnfc vfc = new Vnfc(vnfcType, null, vnfcName);
+            List<Vserver> vServers = vfcs.get(vfc);
+            if (vServers == null) {
+                vServers = new LinkedList<>();
+                vfcs.put(vfc, vServers);
+            }
+            vServers.add(vserver);
+        }
+
+        for (Map.Entry<Vnfc, List<Vserver>> entry : vfcs.entrySet()) {
+            Vnfc vnfc = entry.getKey();
+            List<Vserver> vServers = vfcs.get(vnfc);
+            vnfc.addVms(vServers);
+            vnf.addVnfc(vnfc);
+        }
+
+        return new InventoryModel(vnf);
+    }
+}