[sdc] update to the current code base
[sdc.git] / asdctool / src / main / java / org / openecomp / sdc / asdctool / impl / migration / v1707 / jsonmodel / NodeTemplateMissingDataResolver.java
1 package org.openecomp.sdc.asdctool.impl.migration.v1707.jsonmodel;
2
3
4 import java.util.ArrayList;
5 import java.util.Arrays;
6 import java.util.List;
7 import java.util.Map;
8 import java.util.stream.Collectors;
9
10 import javax.annotation.Resource;
11
12 import org.openecomp.sdc.be.datatypes.elements.ComponentInstanceDataDefinition;
13 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
14 import org.openecomp.sdc.be.datatypes.enums.OriginTypeEnum;
15 import org.openecomp.sdc.be.datatypes.tosca.ToscaDataDefinition;
16 import org.openecomp.sdc.be.model.Component;
17 import org.openecomp.sdc.be.model.ComponentInstanceInput;
18 import org.openecomp.sdc.be.model.jsontitan.datamodel.TopologyTemplate;
19 import org.openecomp.sdc.be.model.jsontitan.datamodel.ToscaElement;
20 import org.openecomp.sdc.be.model.jsontitan.operations.TopologyTemplateOperation;
21 import org.openecomp.sdc.be.model.jsontitan.operations.ToscaElementLifecycleOperation;
22 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
23 import org.slf4j.Logger;
24 import org.slf4j.LoggerFactory;
25
26 import fj.data.Either;
27
28
29 public class NodeTemplateMissingDataResolver <T extends Component> {
30         
31         private static Logger LOGGER = LoggerFactory.getLogger(NodeTemplateMissingDataResolver.class);
32         
33         @Resource(name = "tosca-element-lifecycle-operation")
34     private ToscaElementLifecycleOperation lifecycleOperation;
35         
36         @Resource(name = "topology-template-operation")
37     private TopologyTemplateOperation topologyTemplateOperation;
38         
39         public void resolveNodeTemplateInfo(ComponentInstanceDataDefinition vfInst, Map<String, ToscaElement> origCompMap, T component) {
40                 lifecycleOperation.resolveToscaComponentName(vfInst, origCompMap);
41                 if(OriginTypeEnum.VF == vfInst.getOriginType())
42                         collectVFInstanceInputs(component.getComponentInstancesInputs(), origCompMap, vfInst);
43         }
44         
45         private void collectVFInstanceInputs(Map<String, List<ComponentInstanceInput>> instInputs, Map<String, ToscaElement> origCompMap, ComponentInstanceDataDefinition vfInst) {
46                 String ciUid = vfInst.getUniqueId();
47                 String origCompUid = vfInst.getComponentUid();
48                 Either<ToscaElement, StorageOperationStatus> origComp = fetchToscaElement(origCompMap, vfInst, origCompUid);
49         if(origComp.isRight())
50                 return;
51                 Map<String, PropertyDataDefinition> origVFInputs = ((TopologyTemplate)origComp.left().value()).getInputs();
52                 if (origVFInputs != null && !origVFInputs.isEmpty()) {
53                         Map<String, ComponentInstanceInput> collectedVFInputs = origVFInputs.values().stream()
54                                                                                                                .collect(Collectors.toMap(p -> p.getName(), p -> new ComponentInstanceInput(p)));
55                         List<ComponentInstanceInput> instInputList = instInputs.get(ciUid);
56                         Map<String, ComponentInstanceInput> existingInstInputs = ToscaDataDefinition.listToMapByName(instInputList);
57                         collectedVFInputs.putAll(existingInstInputs);
58                         List<ComponentInstanceInput> mergedList = new ArrayList<>(collectedVFInputs.values());
59                         instInputs.put(ciUid, mergedList);      
60                 }
61         }
62
63         private Either<ToscaElement, StorageOperationStatus> fetchToscaElement(Map<String, ToscaElement> origCompMap, ComponentInstanceDataDefinition vfInst, String origCompUid) {
64                 Either<ToscaElement, StorageOperationStatus> origCompEither;
65                 if (!origCompMap.containsKey(origCompUid)) {
66                         origCompEither = topologyTemplateOperation.getToscaElement(origCompUid);
67                         if (origCompEither.isRight()) {
68                                   LOGGER.error("failed to fetch Tosca element {} with id {}", vfInst.getComponentName(), origCompUid);
69                                   return origCompEither;                
70                         }
71                         origCompMap.put(origCompUid, origCompEither.left().value());
72                 }
73                 return Either.left(origCompMap.get(origCompUid));
74         }
75 }