[sdc] update to the current code base
[sdc.git] / asdctool / src / main / java / org / openecomp / sdc / asdctool / impl / migration / v1707 / jsonmodel / ServicesMigration.java
1 package org.openecomp.sdc.asdctool.impl.migration.v1707.jsonmodel;
2
3 import java.util.ArrayList;
4 import java.util.List;
5 import java.util.Map;
6 import java.util.stream.Collectors;
7
8 import javax.annotation.Resource;
9
10 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
11 import org.openecomp.sdc.be.model.ComponentInstanceProperty;
12 import org.openecomp.sdc.be.model.Service;
13 import org.openecomp.sdc.be.model.operations.api.IServiceOperation;
14 import org.openecomp.sdc.be.model.operations.migration.MigrationMalformedDataLogger;
15 import org.slf4j.Logger;
16 import org.slf4j.LoggerFactory;
17
18 import fj.data.Either;
19
20 public class ServicesMigration extends ComponentMigration<Service> {
21
22     private static final String DEFAULT_CONFORMANCE_LEVEL = "0.0";
23     private static Logger LOGGER = LoggerFactory.getLogger(ServicesMigration.class);
24
25     @Resource(name = "service-operation")
26     private IServiceOperation serviceOperation;
27
28     @Resource(name = "service-version-migration")
29     private VersionMigration<Service> versionMigration;
30
31     @Override
32     public String description() {
33         return "migrate services";
34     }
35
36     @Override
37     Either<List<Service>, ?> getElementsToMigrate() {
38         return serviceOperation.getAll();
39     }
40
41     @Override
42     boolean save(Service element) {
43         MigrationMalformedDataLogger.logIfServiceUsingMalformedVfs(element);
44         filterOutDuplicatePropsAndAttrs(element);
45         element.setConformanceLevel(DEFAULT_CONFORMANCE_LEVEL);
46         requirementsCapabilitiesMigrationService.overrideInstanceCapabilitiesRequirements(element);
47         return super.save(element);
48     }
49
50     @Override
51     boolean doPostSaveOperation(Service element) {
52         return element.getComponentInstances() == null ||
53                (requirementsCapabilitiesMigrationService.associateFulfilledRequirements(element, NodeTypeEnum.Service) &&
54                 requirementsCapabilitiesMigrationService.associateFulfilledCapabilities(element, NodeTypeEnum.Service));
55     }
56
57     @Override
58     boolean doPostMigrateOperation(List<Service> elements) {
59         LOGGER.info("migrating services versions");
60         return versionMigration.buildComponentsVersionChain(elements);
61     }
62     
63     @Override
64     void doPreMigrationOperation(List<Service> elements) {
65         super.doPreMigrationOperation(elements);
66         setMissingTemplateInfo(elements);
67     }
68
69     private void filterOutDuplicatePropsAndAttrs(Service element) {
70         if (element.getComponentInstancesProperties() != null) {
71             removeDuplicatedNameProperties(element);
72         }
73         if (element.getComponentInstancesAttributes() != null) {
74             removeDuplicatedNameAttributes(element);
75         }
76     }
77
78     private void removeDuplicatedNameProperties(Service service) {
79         Map<String, List<ComponentInstanceProperty>> componentInstancesProperties = service.getComponentInstancesProperties();
80         componentInstancesProperties.forEach((uid, properties) ->  {
81             componentInstancesProperties.put(uid, getUniquedNamePropertyList(service, properties));
82         });
83     }
84
85     private List<ComponentInstanceProperty> getUniquedNamePropertyList(Service service, List<ComponentInstanceProperty> properties) {
86         if (properties == null) {
87             return null;
88         }
89         List<ComponentInstanceProperty> uniqueNameProperties = new ArrayList<>();
90         Map<String, List<ComponentInstanceProperty>> collect = properties.stream().collect(Collectors.groupingBy(ComponentInstanceProperty::getName));
91         collect.forEach((name, duplicatedProperties) -> {
92             logServiceDuplicateProperties(service, name, duplicatedProperties);
93             uniqueNameProperties.add(duplicatedProperties.get(0));
94         });
95         return uniqueNameProperties;
96     }
97
98     private void logServiceDuplicateProperties(Service service, String name, List<ComponentInstanceProperty> duplicatedProperties) {
99         if (duplicatedProperties.size() > 1) {
100             LOGGER.debug("service {} with id {} has instance {} with duplicate property {}", service.getName(), service.getUniqueId(), duplicatedProperties.get(0).getUniqueId(), name);
101         }
102     }
103
104     private void removeDuplicatedNameAttributes(Service service) {
105         Map<String, List<ComponentInstanceProperty>> componentInstancesAttributes = service.getComponentInstancesAttributes();
106         componentInstancesAttributes.forEach((uid, attributes) ->  {
107             componentInstancesAttributes.put(uid, getUniquedNameAttributeList(service, attributes));
108         });
109     }
110
111     private List<ComponentInstanceProperty> getUniquedNameAttributeList(Service service, List<ComponentInstanceProperty> attributes) {
112         if (attributes == null) {
113             return null;
114         }
115         List<ComponentInstanceProperty> uniqueNameAttributes = new ArrayList<>();
116         Map<String, List<ComponentInstanceProperty>> collect = attributes.stream().collect(Collectors.groupingBy(ComponentInstanceProperty::getName));
117         collect.forEach((name, duplicatedAttributess) -> {
118             logServiceMalformedAttributes(service, name, duplicatedAttributess);
119             uniqueNameAttributes.add(duplicatedAttributess.get(0));
120         });
121         return uniqueNameAttributes;
122     }
123
124     private void logServiceMalformedAttributes(Service service, String name, List<ComponentInstanceProperty> duplicatedAttributess) {
125         if (duplicatedAttributess.size() > 1) {
126             MigrationMalformedDataLogger.logMalformedDataMsg(String.format("service %s with id %s has instance %s with duplicate attribute %s",
127                     service.getName(), service.getUniqueId(), duplicatedAttributess.get(0).getUniqueId(), name));
128         }
129     }
130
131     //    private void filterOutVFInstanceAttrs(Service element, List<String> vfInstancesIds) {
132 //        Map<String, List<ComponentInstanceAttribute>> componentInstancesAttributes = element.getComponentInstancesAttributes();
133 //        if (componentInstancesAttributes != null) {
134 //            element.setComponentInstancesAttributes(filterOutVFInstanceAttributes(componentInstancesAttributes, vfInstancesIds));
135 //        }
136 //    }
137 //
138 //    private void filterOutVFInstacnecProps(Service element, List<String> vfInstancesIds) {
139 //        Map<String, List<ComponentInstanceProperty>> componentInstancesProperties = element.getComponentInstancesProperties();
140 //        if (componentInstancesProperties != null) {
141 //            element.setComponentInstancesProperties(filterOutVFInstanceProperties(componentInstancesProperties, vfInstancesIds));
142 //        }
143 //    }
144 //
145 //    private Map<String, List<ComponentInstanceProperty>> filterOutVFInstanceProperties(Map<String, List<ComponentInstanceProperty>> instances, List<String> vfInstanceIds) {
146 //        return instances.entrySet()
147 //                .stream()
148 //                .filter(entry -> !vfInstanceIds.contains(entry.getKey()))
149 //                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
150 //    }
151 //
152 //    private Map<String, List<ComponentInstanceAttribute>> filterOutVFInstanceAttributes(Map<String, List<ComponentInstanceAttribute>> instances, List<String> vfInstanceIds) {
153 //        return instances.entrySet()
154 //                .stream()
155 //                .filter(entry -> !vfInstanceIds.contains(entry.getKey()))
156 //                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
157 //    }
158
159         
160 }