1 package org.openecomp.sdc.asdctool.impl.migration.v1707.jsonmodel;
3 import java.util.ArrayList;
6 import java.util.stream.Collectors;
8 import javax.annotation.Resource;
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;
18 import fj.data.Either;
20 public class ServicesMigration extends ComponentMigration<Service> {
22 private static final String DEFAULT_CONFORMANCE_LEVEL = "0.0";
23 private static Logger LOGGER = LoggerFactory.getLogger(ServicesMigration.class);
25 @Resource(name = "service-operation")
26 private IServiceOperation serviceOperation;
28 @Resource(name = "service-version-migration")
29 private VersionMigration<Service> versionMigration;
32 public String description() {
33 return "migrate services";
37 Either<List<Service>, ?> getElementsToMigrate() {
38 return serviceOperation.getAll();
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);
51 boolean doPostSaveOperation(Service element) {
52 return element.getComponentInstances() == null ||
53 (requirementsCapabilitiesMigrationService.associateFulfilledRequirements(element, NodeTypeEnum.Service) &&
54 requirementsCapabilitiesMigrationService.associateFulfilledCapabilities(element, NodeTypeEnum.Service));
58 boolean doPostMigrateOperation(List<Service> elements) {
59 LOGGER.info("migrating services versions");
60 return versionMigration.buildComponentsVersionChain(elements);
64 void doPreMigrationOperation(List<Service> elements) {
65 super.doPreMigrationOperation(elements);
66 setMissingTemplateInfo(elements);
69 private void filterOutDuplicatePropsAndAttrs(Service element) {
70 if (element.getComponentInstancesProperties() != null) {
71 removeDuplicatedNameProperties(element);
73 if (element.getComponentInstancesAttributes() != null) {
74 removeDuplicatedNameAttributes(element);
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));
85 private List<ComponentInstanceProperty> getUniquedNamePropertyList(Service service, List<ComponentInstanceProperty> properties) {
86 if (properties == null) {
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));
95 return uniqueNameProperties;
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);
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));
111 private List<ComponentInstanceProperty> getUniquedNameAttributeList(Service service, List<ComponentInstanceProperty> attributes) {
112 if (attributes == null) {
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));
121 return uniqueNameAttributes;
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));
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));
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));
145 // private Map<String, List<ComponentInstanceProperty>> filterOutVFInstanceProperties(Map<String, List<ComponentInstanceProperty>> instances, List<String> vfInstanceIds) {
146 // return instances.entrySet()
148 // .filter(entry -> !vfInstanceIds.contains(entry.getKey()))
149 // .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
152 // private Map<String, List<ComponentInstanceAttribute>> filterOutVFInstanceAttributes(Map<String, List<ComponentInstanceAttribute>> instances, List<String> vfInstanceIds) {
153 // return instances.entrySet()
155 // .filter(entry -> !vfInstanceIds.contains(entry.getKey()))
156 // .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));