Merge of new rebased code
[appc.git] / appc-dg / appc-dg-shared / appc-dg-dependency-model / src / main / java / org / openecomp / appc / dg / flowbuilder / impl / AbstractFlowStrategy.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * openECOMP : APP-C
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights
6  *                                              reserved.
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  * 
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  * 
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  * ============LICENSE_END=========================================================
20  */
21
22 package org.openecomp.appc.dg.flowbuilder.impl;
23
24 import com.att.eelf.configuration.EELFLogger;
25 import com.att.eelf.configuration.EELFManager;
26
27 import java.util.Iterator;
28 import java.util.List;
29 import java.util.Set;
30
31 import org.openecomp.appc.dg.flowbuilder.FlowStrategy;
32 import org.openecomp.appc.dg.flowbuilder.exception.InvalidDependencyModel;
33 import org.openecomp.appc.dg.flowbuilder.helper.Graph;
34 import org.openecomp.appc.dg.objects.*;
35 import org.openecomp.appc.domainmodel.Vnfc;
36
37
38 public abstract class AbstractFlowStrategy implements FlowStrategy {
39
40     protected Graph<Vnfc> graph;
41
42     private static final EELFLogger logger = EELFManager.getInstance().getLogger(AbstractFlowStrategy.class);
43
44     public VnfcFlowModel buildFlowModel(VnfcDependencyModel dependencyModel, InventoryModel inventoryModel) {
45         if(logger.isTraceEnabled()){
46             logger.trace("Entering into buildFlowModel with dependency model = " + dependencyModel
47                     + "inventory model = " +inventoryModel);
48         }
49
50         if(dependencyModel == null
51                 || dependencyModel.getDependencies() ==null
52                 || dependencyModel.getDependencies().size() ==0){
53             logger.debug("Dependency model not available, building flow model with sequence");
54             throw new InvalidDependencyModel("Dependency model either null or does not contain any dependency");
55         }
56
57         VnfcFlowModel flowModel = buildFlowModel(dependencyModel);
58         if(logger.isDebugEnabled()){
59             logger.debug("Flow Model without instance data: \n" + flowModel);
60         }
61
62         logger.info("Populating flow model with A&AI data");
63         populateFlowModel(flowModel,inventoryModel);
64         if(logger.isDebugEnabled()){
65             logger.debug("Flow Model with instance data: \n" + flowModel);
66         }
67
68         return flowModel;
69     }
70
71     private void populateFlowModel(VnfcFlowModel flowModel, InventoryModel inventoryModel) {
72         Iterator<List<Vnfc>> flowIterator = null;
73
74         for(Vnfc vnfcFromInventory:inventoryModel.getVnf().getVnfcs()){
75             flowIterator = flowModel.getModelIterator();
76             String vnfcType = vnfcFromInventory.getVnfcType();
77             while (flowIterator.hasNext()){
78                 for(Vnfc vnfcFromFlowModel:flowIterator.next() ){
79                     if(vnfcType.equalsIgnoreCase(vnfcFromFlowModel.getVnfcType())){
80                         vnfcFromFlowModel.setVnfcName(vnfcFromInventory.getVnfcName());
81                         vnfcFromFlowModel.addVms(vnfcFromInventory.getVserverList());
82                     }
83                 }
84             }
85
86         }
87
88     }
89
90     private VnfcFlowModel buildFlowModel(VnfcDependencyModel dependencyModel) throws InvalidDependencyModel {
91         Set<Node<Vnfc>> dependencies = dependencyModel.getDependencies();
92         graph = new Graph(dependencies.size());
93
94         for(Node<Vnfc> node:dependencies){
95             graph.addVertex(node.getChild());
96         }
97
98         for(Node node:dependencies){
99             Vnfc child = (Vnfc)node.getChild();
100             List<Vnfc> parents = node.getParents();
101             for(Vnfc parent:parents){
102                 graph.addEdge(child,parent);
103             }
104         }
105         List<List<Vnfc>> dependencyList = orderDependencies();
106
107         VnfcFlowModel.VnfcFlowModelBuilder builder = new VnfcFlowModel.VnfcFlowModelBuilder();
108         int count=0;
109         int flowModelSize = 0;
110         for(List<Vnfc> vnfcList:dependencyList){
111             builder.addMetadata(count,vnfcList);
112             flowModelSize += vnfcList.size();
113             count++;
114         }
115         if(flowModelSize != dependencies.size()){
116             throw new InvalidDependencyModel("Cycle detected in the VNFC dependencies");
117         }
118
119         return builder.build();
120     }
121
122     protected abstract List<List<Vnfc>> orderDependencies();
123
124     /*private VnfcFlowModel buildFlowModelWithoutSequence(InventoryModel inventoryModel) {
125         VnfcFlowModel.VnfcFlowModelBuilder builder = new VnfcFlowModel.VnfcFlowModelBuilder();
126
127         for(Vnfc vnfc:inventoryModel.getVnf().getVnfcs()){
128             builder = builder.addMetadata(0,vnfc);
129         }
130
131         return builder.build();
132     }*/
133 }