diff options
4 files changed, 103 insertions, 9 deletions
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentInterfaceOperationBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentInterfaceOperationBusinessLogic.java index 4e44967dcb..461edd11dc 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentInterfaceOperationBusinessLogic.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentInterfaceOperationBusinessLogic.java @@ -249,6 +249,7 @@ public class ComponentInterfaceOperationBusinessLogic extends BaseBusinessLogic interfaceDefinition.setUniqueId(componentInterfaceUpdatedKey); interfaceDefinition.setToscaResourceName(componentInterfaceUpdatedKey); + interfaceDefinition.setUserCreated(true); final Optional<OperationDataDefinition> optionalOperationDataDefinition = interfaceDefinition.getOperations().values().stream().findFirst(); if (optionalOperationDataDefinition.isEmpty()) { diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceImportManager.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceImportManager.java index 8fe742af50..aa420673c7 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceImportManager.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceImportManager.java @@ -380,7 +380,7 @@ public class ResourceImportManager { setProperties(toscaJson, resource, existingResource); setAttributes(toscaJson, resource); setRequirements(toscaJson, resource, parentResource); - setInterfaceLifecycle(toscaJson, resource); + setInterfaceLifecycle(toscaJson, resource, existingResource); } else { throw new ByActionStatusComponentException(ActionStatus.GENERAL_ERROR); } @@ -434,12 +434,13 @@ public class ResourceImportManager { } } - private void setInterfaceLifecycle(Map<String, Object> toscaJson, Resource resource) { - Either<Map<String, Object>, ResultStatusEnum> toscaInterfaces = ImportUtils + private void setInterfaceLifecycle(Map<String, Object> toscaJson, Resource resource, Either<Resource, StorageOperationStatus> existingResource) { + final Either<Map<String, Object>, ResultStatusEnum> toscaInterfaces = ImportUtils .findFirstToscaMapElement(toscaJson, ToscaTagNamesEnum.INTERFACES); if (toscaInterfaces.isLeft()) { - Map<String, InterfaceDefinition> moduleInterfaces = new HashMap<>(); - for (final Entry<String, Object> interfaceNameValue : toscaInterfaces.left().value().entrySet()) { + final Map<String, InterfaceDefinition> moduleInterfaces = new HashMap<>(); + final Map<String, Object> map = toscaInterfaces.left().value(); + for (final Entry<String, Object> interfaceNameValue : map.entrySet()) { final Either<InterfaceDefinition, ResultStatusEnum> eitherInterface = createModuleInterface(interfaceNameValue.getValue(), resource.getModel()); if (eitherInterface.isRight()) { @@ -449,7 +450,18 @@ public class ResourceImportManager { moduleInterfaces.put(interfaceDefinition.getType(), interfaceDefinition); } } - if (!moduleInterfaces.isEmpty()) { + if (existingResource.isLeft()) { + final Map<String, InterfaceDefinition> userCreatedInterfaceDefinitions = + existingResource.left().value().getInterfaces().entrySet().stream() + .filter(i -> i.getValue().isUserCreated()) + .filter(i -> !map.containsKey(i.getValue().getType())) + .collect(Collectors.toMap(Entry::getKey, Entry::getValue)); + if (MapUtils.isNotEmpty(userCreatedInterfaceDefinitions)) { + moduleInterfaces.putAll(userCreatedInterfaceDefinitions); + } + } + + if (MapUtils.isNotEmpty(moduleInterfaces)) { resource.setInterfaces(moduleInterfaces); } } diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/ResourceImportManagerTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/ResourceImportManagerTest.java index df679f1402..32d174f194 100644 --- a/catalog-be/src/test/java/org/openecomp/sdc/be/components/ResourceImportManagerTest.java +++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/ResourceImportManagerTest.java @@ -47,6 +47,8 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.tuple.ImmutablePair; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; @@ -358,6 +360,43 @@ class ResourceImportManagerTest { } @Test + void testReimportVfcWithInterfaceImplementation() throws IOException { + user.setUserId(resourceMD.getContactId()); + when(userAdmin.getUser(anyString(), anyBoolean())).thenReturn(user); + + setResourceBusinessLogicMock(); + + String jsonContent = ImportUtilsTest.loadCustomTypeFileNameToJsonString("custom-types-node-type-with-interface-impl.yml"); + + Map<String, InterfaceDefinition> interfaceTypes = new HashMap<>(); + final InterfaceDefinition interfaceDefinition = new InterfaceDefinition(); + interfaceDefinition.setType("tosca.interfaces.node.lifecycle.Standard"); + Map<String, OperationDataDefinition> operations = new HashMap<>(); + operations.put("configure", new OperationDataDefinition()); + interfaceDefinition.setOperations(operations); + interfaceTypes.put("tosca.interfaces.node.lifecycle.standard", interfaceDefinition); + when(interfaceOperationBusinessLogic.getAllInterfaceLifecycleTypes(any())).thenReturn(Either.left(interfaceTypes)); + + ImmutablePair<Resource, ActionStatus> createResource = + importManager.importNormativeResource(jsonContent, resourceMD, user, true, true, false); + assertNotNull(createResource); + Resource resource = createResource.getLeft(); + assertNotNull(resource); + assertSetInterfaceImplementation(resource); + + final GraphVertex graphVertex = new GraphVertex(); + graphVertex.setUniqueId("1-2-3-4-5-6-7"); + when(janusGraphDao.getByCriteria(eq(VertexTypeEnum.NODE_TYPE), anyMap(), anyMap(), eq(JsonParseFlagEnum.ParseAll), any(), anyBoolean())) + .thenReturn(Either.left(Arrays.asList(graphVertex))); + when(toscaOperationFacade.getToscaElement(anyString())).thenReturn(Either.left(resource)); + createResource = reimportVfc(resource, jsonContent); + assertNotNull(createResource); + resource = createResource.getLeft(); + assertNotNull(resource); + assertSetInterfaceImplementationAfterReimport(resource); + } + + @Test void testResourceCreationWithInterfaceImplementation_UnknownInterface() throws IOException { user.setUserId(resourceMD.getContactId()); when(userAdmin.getUser(anyString(), anyBoolean())).thenReturn(user); @@ -508,14 +547,33 @@ class ResourceImportManagerTest { } - private ImmutablePair<Resource, ActionStatus> reimportVfc(Resource resource, String jsonContent) { + private ImmutablePair<Resource, ActionStatus> reimportVfc(final Resource resource, final String jsonContent) { List<PropertyDefinition> propertiesList = resource.getProperties(); - PropertyDefinition propertyDefinition = new PropertyDefinition(); + if (CollectionUtils.isEmpty(propertiesList)) { + propertiesList = new ArrayList<>(); + } + final PropertyDefinition propertyDefinition = new PropertyDefinition(); propertyDefinition.setName("oneMore"); propertyDefinition.setUserCreated(true); propertyDefinition.setType("boolean"); propertiesList.add(propertyDefinition); resource.setProperties(propertiesList); + + Map<String, InterfaceDefinition> interfaces = resource.getInterfaces(); + if (MapUtils.isEmpty(interfaces)) { + interfaces = new HashMap<>(); + } + final InterfaceDefinition interfaceDefinition = new InterfaceDefinition(); + interfaceDefinition.setType("tosca.interfaces.relationship.Configure"); + interfaceDefinition.setUserCreated(true); + final OperationDataDefinition operationDataDefinition = new OperationDataDefinition(); + operationDataDefinition.setName("add_source"); + final Map<String, OperationDataDefinition> operationDataDefinitionMap = new HashMap<>(); + operationDataDefinitionMap.put(operationDataDefinition.getName(), operationDataDefinition); + interfaceDefinition.setOperations(operationDataDefinitionMap); + interfaces.put(interfaceDefinition.getType(), interfaceDefinition); + resource.setInterfaces(interfaces); + return importManager.importNormativeResource(jsonContent, resourceMD, user, true, true, false); } @@ -614,6 +672,24 @@ class ResourceImportManagerTest { assertTrue(operations.containsKey(operationDataDefinition.getName()))); } + private void assertSetInterfaceImplementationAfterReimport(final Resource resource) { + final Map<String, InterfaceDefinition> interfaces = resource.getInterfaces(); + assertNotNull(interfaces); + assertEquals(2, interfaces.size()); + + InterfaceDefinition interfaceDefinition = interfaces.get("tosca.interfaces.node.lifecycle.Standard"); + assertTrue(interfaces.containsKey(interfaceDefinition.getType())); + assertFalse(interfaceDefinition.isUserCreated()); + final Map<String, OperationDataDefinition> operations_1 = interfaceDefinition.getOperations(); + operations_1.values().forEach(operationDataDefinition -> assertTrue(operations_1.containsKey(operationDataDefinition.getName()))); + + interfaceDefinition = interfaces.get("tosca.interfaces.relationship.Configure"); + assertTrue(interfaces.containsKey(interfaceDefinition.getType())); + assertTrue(interfaceDefinition.isUserCreated()); + final Map<String, OperationDataDefinition> operations_2 = interfaceDefinition.getOperations(); + operations_2.values().forEach(operationDataDefinition -> assertTrue(operations_2.containsKey(operationDataDefinition.getName()))); + } + private void testSetDerivedFrom(Resource resource) { assertEquals(1, resource.getDerivedFrom().size()); assertEquals("tosca.nodes.Root", resource.getDerivedFrom().get(0)); diff --git a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/InterfaceDataDefinition.java b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/InterfaceDataDefinition.java index b8237d3678..97730fbc4b 100644 --- a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/InterfaceDataDefinition.java +++ b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/InterfaceDataDefinition.java @@ -20,6 +20,8 @@ package org.openecomp.sdc.be.datatypes.elements; import com.fasterxml.jackson.annotation.JsonCreator; +import lombok.Getter; +import lombok.Setter; import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields; import org.openecomp.sdc.be.datatypes.tosca.ToscaDataDefinition; @@ -30,7 +32,9 @@ import java.util.Map; import static org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields.TOSCA_RESOURCE_NAME; public class InterfaceDataDefinition extends ToscaDataDefinition implements Serializable { - + @Getter + @Setter + private boolean userCreated; public InterfaceDataDefinition(String type, String description) { this(); setType(type); @@ -50,6 +54,7 @@ public class InterfaceDataDefinition extends ToscaDataDefinition implements Seri setToscaResourceName(interfaceDataDefinition.getToscaResourceName()); setOperations(interfaceDataDefinition.getOperations()); setInputs(interfaceDataDefinition.getInputs()); + setUserCreated(interfaceDataDefinition.isUserCreated()); } public String getUniqueId() { |