Fix upgrade for different vendor release 74/122774/3
authorandre.schmid <andre.schmid@est.tech>
Wed, 14 Jul 2021 20:33:45 +0000 (21:33 +0100)
committerMichael Morris <michael.morris@est.tech>
Fri, 23 Jul 2021 17:05:23 +0000 (17:05 +0000)
Change-Id: Id5769b45c4b41fd40b7bac25407c046b8fe787e7
Issue-ID: SDC-3644
Signed-off-by: André Schmid <andre.schmid@est.tech>
catalog-be/src/main/docker/backend/chef-repo/cookbooks/sdc-catalog-be/files/default/error-configuration.yaml
catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceImportManager.java
catalog-be/src/test/java/org/openecomp/sdc/be/components/ResourceImportManagerTest.java
catalog-dao/src/main/java/org/openecomp/sdc/be/dao/api/ActionStatus.java
catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/ToscaOperationFacade.java

index c87e1e3..df13e80 100644 (file)
@@ -2519,3 +2519,20 @@ errors:
         message: "Error: Component %1 with Model %2 already exist.",
         messageId: "SVC4150"
     }
+    #-----------SVC4151---------------------------
+    # %1 - "Component name"
+    # %2 - "Vendor release"
+    # %3 - "Model name"
+    COMPONENT_WITH_VENDOR_RELEASE_ALREADY_EXISTS_IN_MODEL: {
+        code: 409,
+        message: "Error: Component '%1' with Vendor Release '%2' already exists in Model '%3'.",
+        messageId: "SVC4151"
+    }
+    #-----------SVC4152---------------------------
+    # %1 - "Component name"
+    # %2 - "Vendor release"
+    COMPONENT_WITH_VENDOR_RELEASE_ALREADY_EXISTS: {
+        code: 409,
+        message: "Error: Component '%1' with Vendor Release '%2' already exists.",
+        messageId: "SVC4152"
+    }
index 77d8f89..a7defab 100644 (file)
@@ -171,7 +171,7 @@ public class ResourceImportManager {
             setMetaDataFromJson(resourceMetaData, resource);
             populateResourceFromYaml(resourceYml, resource);
             validationFunction.apply(resource);
-            checkResourceExistsBeforeCreate(createNewVersion, csarInfo, resource);
+            checkResourceExists(createNewVersion, csarInfo, resource);
             resource = resourceBusinessLogic
                 .createOrUpdateResourceByImport(resource, creator, true, isInTransaction, needLock, csarInfo, nodeName, isNested).left;
             Resource changeStateResponse;
@@ -198,32 +198,39 @@ public class ResourceImportManager {
         return responsePair;
     }
 
-    private void checkResourceExistsBeforeCreate(final boolean createNewVersion, final CsarInfo csarInfo, final Resource resource) {
-        final String resourceName = resource.getName();
-        final String model = resource.getModel();
-        final Either<Resource, StorageOperationStatus> latestByToscaName = toscaOperationFacade
-            .getLatestByToscaResourceNameAndModel(resourceName, model);
-        if (latestByToscaName.isLeft()) {
-            final Resource foundResource = latestByToscaName.left().value();
-            validateComponentWithModelExist(resourceName, model, foundResource);
-            if (!createNewVersion) {
-                throw new ByActionStatusComponentException(ActionStatus.COMPONENT_NAME_ALREADY_EXIST, resourceName);
-            }
-            if (!isCsarPresent(csarInfo)) {
-                final Either<Resource, StorageOperationStatus> component = toscaOperationFacade
-                    .getComponentByNameAndVendorRelease(resource.getComponentType(), resource.getName(), resource.getVendorRelease(),
-                        JsonParseFlagEnum.ParseAll);
-                if (component.isLeft()) {
-                    validateComponentWithModelExist(resourceName, model, foundResource);
-                    throw new ByActionStatusComponentException(ActionStatus.COMPONENT_VERSION_ALREADY_EXIST, resource.getName());
-                }
+    private void checkResourceExists(final boolean isCreate, final CsarInfo csarInfo, final Resource resource) {
+        if (isCreate) {
+            checkResourceExistsOnCreate(resource, csarInfo);
+        } else {
+            checkResourceExistsOnUpdate(resource);
+        }
+    }
+
+    private void checkResourceExistsOnCreate(final Resource resource, final CsarInfo csarInfo) {
+        if (isCsarPresent(csarInfo)) {
+            return;
+        }
+        final Either<Resource, StorageOperationStatus> resourceEither =
+            toscaOperationFacade.getComponentByNameAndVendorRelease(resource.getComponentType(), resource.getName(),
+                resource.getVendorRelease(), JsonParseFlagEnum.ParseAll);
+        if (resourceEither.isLeft() && toscaOperationFacade.isNodeAssociatedToModel(resource.getModel(), resource)) {
+            if (resource.getModel() == null) {
+                throw new ByActionStatusComponentException(ActionStatus.COMPONENT_WITH_VENDOR_RELEASE_ALREADY_EXISTS,
+                    resource.getName(), resource.getVendorRelease());
             }
+            throw new ByActionStatusComponentException(ActionStatus.COMPONENT_WITH_VENDOR_RELEASE_ALREADY_EXISTS_IN_MODEL,
+                resource.getName(), resource.getVendorRelease(), resource.getModel());
         }
     }
 
-    private void validateComponentWithModelExist(final String resourceName, final String model, final Resource foundResource) {
-        if (model != null && toscaOperationFacade.isNodeAssociatedToModel(model, foundResource).isPresent()) {
-            throw new ByActionStatusComponentException(ActionStatus.COMPONENT_WITH_MODEL_ALREADY_EXIST, resourceName, model);
+    private void checkResourceExistsOnUpdate(final Resource resource) {
+        final String model = resource.getModel();
+        final Either<Resource, StorageOperationStatus> latestByName = toscaOperationFacade.getLatestByName(resource.getName(), model);
+        if (latestByName.isLeft() && toscaOperationFacade.isNodeAssociatedToModel(model, resource)) {
+            if (model == null) {
+                throw new ByActionStatusComponentException(ActionStatus.COMPONENT_NAME_ALREADY_EXIST, resource.getName());
+            }
+            throw new ByActionStatusComponentException(ActionStatus.COMPONENT_WITH_MODEL_ALREADY_EXIST, resource.getName(), model);
         }
     }
 
index f56ff2e..a9368b2 100644 (file)
 
 package org.openecomp.sdc.be.components;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.when;
 
 import fj.data.Either;
@@ -38,11 +40,10 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.ImmutablePair;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 import org.mockito.stubbing.Answer;
 import org.openecomp.sdc.be.auditing.impl.AuditingManager;
@@ -53,6 +54,7 @@ import org.openecomp.sdc.be.components.impl.InterfaceOperationBusinessLogic;
 import org.openecomp.sdc.be.components.impl.ResourceBusinessLogic;
 import org.openecomp.sdc.be.components.impl.ResourceImportManager;
 import org.openecomp.sdc.be.components.impl.ResponseFormatManager;
+import org.openecomp.sdc.be.components.impl.exceptions.ByActionStatusComponentException;
 import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
 import org.openecomp.sdc.be.components.lifecycle.LifecycleChangeInfoWithAction;
 import org.openecomp.sdc.be.config.Configuration;
@@ -101,7 +103,7 @@ public class ResourceImportManagerTest {
     protected static final ComponentsUtils componentsUtils = Mockito.mock(ComponentsUtils.class);
     private static final CapabilityTypeOperation capabilityTypeOperation = Mockito.mock(CapabilityTypeOperation.class);
 
-    @BeforeClass
+    @BeforeAll
     public static void beforeClass() {
         importManager = new ResourceImportManager(componentsUtils, capabilityTypeOperation, interfaceDefinitionHandler);
         importManager.setAuditingManager(auditingManager);
@@ -120,7 +122,7 @@ public class ResourceImportManagerTest {
         configurationManager.setConfiguration(configuration);
     }
 
-    @Before
+    @BeforeEach
     public void beforeTest() {
         Mockito.reset(auditingManager, responseFormatManager, resourceBusinessLogic, userAdmin);
         Either<Component, StorageOperationStatus> notFound = Either.right(StorageOperationStatus.NOT_FOUND);
@@ -129,7 +131,7 @@ public class ResourceImportManagerTest {
     }
 
     @Test
-    public void testBasicResourceCreation() throws IOException {
+    void testBasicResourceCreation() throws IOException {
         UploadResourceInfo resourceMD = createDummyResourceMD();
 
         User user = new User();
@@ -152,11 +154,11 @@ public class ResourceImportManagerTest {
         testSetDerivedFrom(resource);
         testSetProperties(resource);
 
-        Mockito.verify(resourceBusinessLogic, Mockito.times(1)).propagateStateToCertified(Mockito.eq(user), Mockito.eq(resource), Mockito.any(LifecycleChangeInfoWithAction.class), Mockito.eq(false), Mockito.eq(true), Mockito.eq(false));
+        Mockito.verify(resourceBusinessLogic, Mockito.times(1)).propagateStateToCertified(eq(user), eq(resource), Mockito.any(LifecycleChangeInfoWithAction.class), eq(false), eq(true), eq(false));
     }
 
     @Test()
-    public void testResourceCreationFailed() throws IOException {
+    void testResourceCreationFailed() {
         UploadResourceInfo resourceMD = createDummyResourceMD();
         User user = new User();
         user.setUserId(resourceMD.getContactId());
@@ -174,14 +176,14 @@ public class ResourceImportManagerTest {
             errorInfoFromTest = e;
         }
         assertNotNull(errorInfoFromTest);
-        assertEquals(errorInfoFromTest.getActionStatus(), ActionStatus.GENERAL_ERROR);
+        assertEquals(ActionStatus.GENERAL_ERROR, errorInfoFromTest.getActionStatus());
 
-        Mockito.verify(resourceBusinessLogic, Mockito.times(0)).createOrUpdateResourceByImport(Mockito.any(Resource.class), Mockito.eq(user), Mockito.eq(true), Mockito.eq(false), Mockito.eq(true), Mockito.eq(null), Mockito.eq(null), Mockito.eq(false));
-        Mockito.verify(resourceBusinessLogic, Mockito.times(0)).propagateStateToCertified(Mockito.eq(user), Mockito.any(Resource.class), Mockito.any(LifecycleChangeInfoWithAction.class), Mockito.eq(false), Mockito.eq(true), Mockito.eq(false));
+        Mockito.verify(resourceBusinessLogic, Mockito.times(0)).createOrUpdateResourceByImport(Mockito.any(Resource.class), eq(user), eq(true), eq(false), eq(true), eq(null), eq(null), eq(false));
+        Mockito.verify(resourceBusinessLogic, Mockito.times(0)).propagateStateToCertified(eq(user), Mockito.any(Resource.class), Mockito.any(LifecycleChangeInfoWithAction.class), eq(false), eq(true), eq(false));
     }
 
     @Test
-    public void testResourceCreationWithCapabilities() throws IOException {
+    void testResourceCreationWithCapabilities() throws IOException {
         UploadResourceInfo resourceMD = createDummyResourceMD();
         User user = new User();
         user.setUserId(resourceMD.getContactId());
@@ -195,13 +197,13 @@ public class ResourceImportManagerTest {
         Resource resource = createResource.left;
         testSetCapabilities(resource);
 
-        Mockito.verify(resourceBusinessLogic, Mockito.times(1)).propagateStateToCertified(Mockito.eq(user), Mockito.eq(resource), Mockito.any(LifecycleChangeInfoWithAction.class), Mockito.eq(false), Mockito.eq(true), Mockito.eq(false));
+        Mockito.verify(resourceBusinessLogic, Mockito.times(1)).propagateStateToCertified(eq(user), eq(resource), Mockito.any(LifecycleChangeInfoWithAction.class), eq(false), eq(true), eq(false));
         Mockito.verify(resourceBusinessLogic, Mockito.times(1)).createOrUpdateResourceByImport(resource, user, true, false, true, null, null, false);
 
     }
 
     @Test
-    public void testResourceCreationWithRequirments() throws IOException {
+    void testResourceCreationWithRequirments() throws IOException {
         UploadResourceInfo resourceMD = createDummyResourceMD();
         User user = new User();
         user.setUserId(resourceMD.getContactId());
@@ -217,7 +219,7 @@ public class ResourceImportManagerTest {
     }
 
     @Test
-    public void testResourceCreationWithInterfaceImplementation() throws IOException {
+    void testResourceCreationWithInterfaceImplementation() throws IOException {
         UploadResourceInfo resourceMD = createDummyResourceMD();
         User user = new User();
         user.setUserId(resourceMD.getContactId());
@@ -242,7 +244,7 @@ public class ResourceImportManagerTest {
     }
 
     @Test
-    public void testResourceCreationWithInterfaceImplementation_UnknownInterface() throws IOException {
+    void testResourceCreationWithInterfaceImplementation_UnknownInterface() throws IOException {
         UploadResourceInfo resourceMD = createDummyResourceMD();
         User user = new User();
         user.setUserId(resourceMD.getContactId());
@@ -266,7 +268,7 @@ public class ResourceImportManagerTest {
     }
 
     @Test
-    public void testResourceCreationWitInterfaceImplementation_UnknownOperation() throws IOException {
+    void testResourceCreationWitInterfaceImplementation_UnknownOperation() throws IOException {
         UploadResourceInfo resourceMD = createDummyResourceMD();
         User user = new User();
         user.setUserId(resourceMD.getContactId());
@@ -290,7 +292,7 @@ public class ResourceImportManagerTest {
     }
     
     @Test
-    public void testResourceCreationFailedVendorReleaseAlreadyExists() throws IOException {
+    void testResourceCreationFailedVendorReleaseAlreadyExists() throws IOException {
         UploadResourceInfo resourceMD = createDummyResourceMD();
 
         User user = new User();
@@ -301,34 +303,27 @@ public class ResourceImportManagerTest {
         when(userAdmin.getUser(Mockito.anyString(), Mockito.anyBoolean())).thenReturn(user);
 
         setResourceBusinessLogicMock();
-
-        Either<Component, StorageOperationStatus> notFound = Either.left(Mockito.mock(Resource.class));
+        final Either<Component, StorageOperationStatus> foundResourceEither = Either.left(Mockito.mock(Resource.class));
         when(toscaOperationFacade.getComponentByNameAndVendorRelease(any(ComponentTypeEnum.class), anyString(), anyString(),
-            any(JsonParseFlagEnum.class))).thenReturn(notFound);
-        
+            any(JsonParseFlagEnum.class))).thenReturn(foundResourceEither);
+        when(toscaOperationFacade.isNodeAssociatedToModel(eq(null), any(Resource.class))).thenReturn(true);
+
         String jsonContent = ImportUtilsTest.loadFileNameToJsonString("normative-types-new-blockStorage.yml");
-        
-        ComponentException errorInfoFromTest = null;
-        try {
-            when(toscaOperationFacade
-                .getLatestByToscaResourceNameAndModel(resourceMD.getName(), StringUtils.EMPTY)).thenReturn(Either.left(new Resource()));
-            importManager.importNormativeResource(jsonContent, resourceMD, user, true, true);
-        }catch (ComponentException e){
-            errorInfoFromTest = e;
-        }
-        assertNotNull(errorInfoFromTest);
-        assertEquals(ActionStatus.COMPONENT_VERSION_ALREADY_EXIST, errorInfoFromTest.getActionStatus());
+
+        var actualException = assertThrows(ByActionStatusComponentException.class,
+            () -> importManager.importNormativeResource(jsonContent, resourceMD, user, true, true));
+        assertEquals(ActionStatus.COMPONENT_WITH_VENDOR_RELEASE_ALREADY_EXISTS, actualException.getActionStatus());
     }
 
     private void setResourceBusinessLogicMock() {
         when(resourceBusinessLogic.getUserAdmin()).thenReturn(userAdmin);
-        when(resourceBusinessLogic.createOrUpdateResourceByImport(Mockito.any(Resource.class), Mockito.any(User.class), Mockito.anyBoolean(), Mockito.anyBoolean(), Mockito.anyBoolean(), Mockito.eq(null), Mockito.eq(null), Mockito.eq(false)))
+        when(resourceBusinessLogic.createOrUpdateResourceByImport(Mockito.any(Resource.class), Mockito.any(User.class), Mockito.anyBoolean(), Mockito.anyBoolean(), Mockito.anyBoolean(), eq(null), eq(null), eq(false)))
                 .thenAnswer((Answer<ImmutablePair<Resource, ActionStatus>>) invocation -> {
                     Object[] args = invocation.getArguments();
                     return new ImmutablePair<>((Resource) args[0], ActionStatus.CREATED);
 
                 });
-        when(resourceBusinessLogic.propagateStateToCertified(Mockito.any(User.class), Mockito.any(Resource.class), Mockito.any(LifecycleChangeInfoWithAction.class), Mockito.eq(false), Mockito.eq(true), Mockito.eq(false)))
+        when(resourceBusinessLogic.propagateStateToCertified(Mockito.any(User.class), Mockito.any(Resource.class), Mockito.any(LifecycleChangeInfoWithAction.class), eq(false), eq(true), eq(false)))
                 .thenAnswer((Answer<Resource>) invocation -> {
                     Object[] args = invocation.getArguments();
                     return (Resource) args[1];
@@ -339,7 +334,7 @@ public class ResourceImportManagerTest {
             return Either.left((Resource) args[0]);
 
         });
-        when(resourceBusinessLogic.validateResourceBeforeCreate(Mockito.any(Resource.class), Mockito.any(User.class), Mockito.any(AuditingActionEnum.class), Mockito.eq(false), Mockito.eq(null))).thenAnswer((Answer<Either<Resource, ResponseFormat>>) invocation -> {
+        when(resourceBusinessLogic.validateResourceBeforeCreate(Mockito.any(Resource.class), Mockito.any(User.class), Mockito.any(AuditingActionEnum.class), eq(false), eq(null))).thenAnswer((Answer<Either<Resource, ResponseFormat>>) invocation -> {
             Object[] args = invocation.getArguments();
             return Either.left((Resource) args[0]);
 
@@ -476,10 +471,10 @@ public class ResourceImportManagerTest {
 
     private void testSetConstantMetaData(Resource resource) {
         assertEquals(resource.getVersion(), TypeUtils.getFirstCertifiedVersionVersion());
-        assertSame(resource.getLifecycleState(), ImportUtils.Constants.NORMATIVE_TYPE_LIFE_CYCLE);
-        assertEquals(resource.isHighestVersion(), ImportUtils.Constants.NORMATIVE_TYPE_HIGHEST_VERSION);
-        assertEquals(resource.getVendorName(), ImportUtils.Constants.VENDOR_NAME);
-        assertEquals(resource.getVendorRelease(), ImportUtils.Constants.VENDOR_RELEASE);
+        assertSame(ImportUtils.Constants.NORMATIVE_TYPE_LIFE_CYCLE, resource.getLifecycleState());
+        assertEquals(ImportUtils.Constants.NORMATIVE_TYPE_HIGHEST_VERSION, resource.isHighestVersion());
+        assertEquals(ImportUtils.Constants.VENDOR_NAME, resource.getVendorName());
+        assertEquals(ImportUtils.Constants.VENDOR_RELEASE, resource.getVendorRelease());
     }
 
 }
index 4728833..50f2ae9 100644 (file)
@@ -53,7 +53,7 @@ public enum ActionStatus {
     COMPONENT_MISSING_CATEGORY, COMPONENT_INVALID_CATEGORY, COMPONENT_ELEMENT_INVALID_NAME_FORMAT, COMPONENT_ELEMENT_INVALID_NAME_LENGTH, COMPONENT_CATEGORY_ALREADY_EXISTS, COMPONENT_CATEGORY_NOT_FOUND, COMPONENT_SUB_CATEGORY_NOT_FOUND_FOR_CATEGORY, COMPONENT_SUB_CATEGORY_EXISTS_FOR_CATEGORY, COMPONENT_GROUPING_EXISTS_FOR_SUB_CATEGORY,
     // Model related
     MODEL_ALREADY_EXISTS, INVALID_MODEL, MODEL_IMPORTS_IS_EMPTY, COULD_NOT_READ_MODEL_IMPORTS, MODEL_NOT_FOUND, MODEL_NAME_CANNOT_BE_EMPTY,
-    COMPONENT_WITH_MODEL_ALREADY_EXIST,
+    COMPONENT_WITH_MODEL_ALREADY_EXIST, COMPONENT_WITH_VENDOR_RELEASE_ALREADY_EXISTS, COMPONENT_WITH_VENDOR_RELEASE_ALREADY_EXISTS_IN_MODEL,
     // Service API URL
     INVALID_SERVICE_API_URL,
     // Property related
index 25bac16..ec5721b 100644 (file)
@@ -523,27 +523,26 @@ public class ToscaOperationFacade {
         return predicateCriteria;
     }
 
-    public Optional<GraphVertex> isNodeAssociatedToModel(final String model, Resource resource) {
-        return getNodeModelVertices(resource, model);
+    public boolean isNodeAssociatedToModel(final String model, final Resource resource) {
+        final List<GraphVertex> modelElementVertices = getResourceModelElementVertices(resource);
+        if (model == null) {
+            return modelElementVertices.isEmpty();
+        }
+        return modelElementVertices.stream().anyMatch(graphVertex -> graphVertex.getMetadataProperty(GraphPropertyEnum.NAME).equals(model));
     }
 
-    public Optional<GraphVertex> getNodeModelVertices(final Resource resource, final String model) {
-        final Either<GraphVertex, JanusGraphOperationStatus> vertex = janusGraphDao
-            .getVertexById(resource.getUniqueId(), JsonParseFlagEnum.NoParse);
+    public List<GraphVertex> getResourceModelElementVertices(final Resource resource) {
+        final Either<GraphVertex, JanusGraphOperationStatus> vertex =
+            janusGraphDao.getVertexById(resource.getUniqueId(), JsonParseFlagEnum.NoParse);
         if (vertex.isRight() || Objects.isNull(vertex.left().value())) {
-            return Optional.empty();
+            return Collections.emptyList();
         }
-        return getElementModelVertex(model, vertex.left().value());
-    }
-
-    private Optional<GraphVertex> getElementModelVertex(final String model, final GraphVertex vertex) {
-        final Either<List<GraphVertex>, JanusGraphOperationStatus> nodeModelVertices = janusGraphDao
-            .getParentVertices(vertex, EdgeLabelEnum.MODEL_ELEMENT, JsonParseFlagEnum.NoParse);
-        if (nodeModelVertices.isRight() || Objects.isNull(nodeModelVertices.left().value())) {
-            return Optional.empty();
+        final Either<List<GraphVertex>, JanusGraphOperationStatus> nodeModelVertices =
+            janusGraphDao.getParentVertices(vertex.left().value(), EdgeLabelEnum.MODEL_ELEMENT, JsonParseFlagEnum.NoParse);
+        if (nodeModelVertices.isRight() || nodeModelVertices.left().value() == null) {
+            return Collections.emptyList();
         }
-        return nodeModelVertices.left().value().stream().filter(graphVertex -> graphVertex.getMetadataProperty(GraphPropertyEnum.NAME).equals(model))
-            .findFirst();
+        return nodeModelVertices.left().value();
     }
 
     private boolean isValidForVendorRelease(final GraphVertex resource, final String vendorRelease) {