mso to validate the name uniqueness in A&AI 19/89919/1
authorGamboa, Gilbert <gilbert.g.gamboa@att.com>
Fri, 14 Jun 2019 18:15:54 +0000 (14:15 -0400)
committerBenjamin, Max (mb388a) <mb388a@us.att.com>
Fri, 14 Jun 2019 18:15:59 +0000 (14:15 -0400)
Need to change query by name using nodes query to make sure names are
globally unique.
Added new Exception type for duplicate A&AI object names.
Added tests for AAIVfModulResources.

Change-Id: I71558d0881d7060819f5f807fe58779be6edfa6f
Issue-ID: SO-2020
Signed-off-by: Benjamin, Max (mb388a) <mb388a@us.att.com>
bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/exceptions/DuplicateNameException.java [new file with mode: 0644]
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAICreateTasks.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIVfModuleResources.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIVnfResources.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIVolumeGroupResources.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAICreateTasksTest.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/orchestration/AAIVfModuleResourcesTest.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/orchestration/AAIVnfResourcesTest.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/orchestration/AAIVolumeGroupResourcesTest.java

diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/exceptions/DuplicateNameException.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/exceptions/DuplicateNameException.java
new file mode 100644 (file)
index 0000000..2f2a116
--- /dev/null
@@ -0,0 +1,18 @@
+package org.onap.so.bpmn.servicedecomposition.tasks.exceptions;
+
+public class DuplicateNameException extends Exception {
+
+    private static final long serialVersionUID = -2850043981787600326L;
+
+    public DuplicateNameException() {
+        super();
+    }
+
+    public DuplicateNameException(String message) {
+        super(message);
+    }
+
+    public DuplicateNameException(String objectType, String name) {
+        super(objectType + " with name " + name + " already exists. The name must be unique.");
+    }
+}
index 28d5363..524098b 100644 (file)
@@ -50,6 +50,7 @@ import org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup;
 import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock;
 import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
 import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB;
+import org.onap.so.bpmn.servicedecomposition.tasks.exceptions.DuplicateNameException;
 import org.onap.so.client.aai.AAIObjectPlurals;
 import org.onap.so.client.aai.entities.uri.AAIResourceUri;
 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
@@ -76,6 +77,7 @@ public class AAICreateTasks {
 
     private static final Logger logger = LoggerFactory.getLogger(AAICreateTasks.class);
     private static final String networkTypeProvider = "PROVIDER";
+    private static final String A_LA_CARTE = "aLaCarte";
     private static String NETWORK_COLLECTION_NAME = "networkCollectionName";
     private static String CONTRAIL_NETWORK_POLICY_FQDN_LIST = "contrailNetworkPolicyFqdnList";
     private static String HEAT_STACK_ID = "heatStackId";
@@ -193,7 +195,11 @@ public class AAICreateTasks {
 
     public void createVnf(BuildingBlockExecution execution) {
         try {
+            Boolean alaCarte = execution.getVariable(A_LA_CARTE);
             GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID);
+            if (Boolean.TRUE.equals(alaCarte) && aaiVnfResources.checkNameInUse(vnf.getVnfName())) {
+                throw new DuplicateNameException("generic-vnf", vnf.getVnfName());
+            }
             ServiceInstance serviceInstance =
                     extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID);
             execution.setVariable("homing", Boolean.TRUE.equals(vnf.isCallHoming()));
@@ -252,6 +258,10 @@ public class AAICreateTasks {
             GenericVnf genericVnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID);
             VolumeGroup volumeGroup = extractPojosForBB.extractByKey(execution, ResourceKey.VOLUME_GROUP_ID);
             CloudRegion cloudRegion = gBBInput.getCloudRegion();
+            Boolean alaCarte = execution.getVariable(A_LA_CARTE);
+            if (Boolean.TRUE.equals(alaCarte) && aaiVolumeGroupResources.checkNameInUse(volumeGroup)) {
+                throw new DuplicateNameException("volume-group", volumeGroup.getVolumeGroupName());
+            }
             aaiVolumeGroupResources.createVolumeGroup(volumeGroup, cloudRegion);
             aaiVolumeGroupResources.connectVolumeGroupToVnf(genericVnf, volumeGroup, cloudRegion);
             aaiVolumeGroupResources.connectVolumeGroupToTenant(volumeGroup, cloudRegion);
@@ -264,6 +274,10 @@ public class AAICreateTasks {
         try {
             GenericVnf vnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID);
             VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID);
+            Boolean alaCarte = execution.getVariable(A_LA_CARTE);
+            if (Boolean.TRUE.equals(alaCarte) && aaiVfModuleResources.checkNameInUse(vfModule)) {
+                throw new DuplicateNameException("vf-module", vfModule.getVfModuleName());
+            }
             int moduleIndex = 0;
             if (vfModule.getModelInfoVfModule() != null
                     && !Boolean.TRUE.equals(vfModule.getModelInfoVfModule().getIsBaseBoolean())) {
index 514f48f..4d1a6dc 100644 (file)
 package org.onap.so.client.orchestration;
 
 import java.util.Optional;
+import org.onap.aai.domain.yang.VfModules;
 import org.onap.so.bpmn.common.InjectionHelper;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup;
+import org.onap.so.client.aai.AAIObjectPlurals;
 import org.onap.so.client.aai.AAIObjectType;
+import org.onap.so.client.aai.entities.AAIResultWrapper;
 import org.onap.so.client.aai.entities.uri.AAIResourceUri;
 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
 import org.onap.so.client.aai.mapper.AAIObjectMapper;
@@ -108,4 +111,19 @@ public class AAIVfModuleResources {
                 cloudRegion.getCloudOwner(), cloudRegion.getLcpCloudRegionId(), volumeGroup.getVolumeGroupId());
         injectionHelper.getAaiClient().connect(vfModuleURI, volumeGroupURI);
     }
+
+    public boolean checkNameInUse(VfModule vfModule) {
+        boolean nameInUse = false;
+        AAIResourceUri vfModuleUri = AAIUriFactory.createNodesUri(AAIObjectPlurals.VF_MODULE)
+                .queryParam("vf-module-name", vfModule.getVfModuleName());
+        AAIResourceUri vfModuleUriWithCustomization = vfModuleUri.clone().queryParam("model-customization-id",
+                vfModule.getModelInfoVfModule().getModelCustomizationUUID());
+        if (injectionHelper.getAaiClient().exists(vfModuleUriWithCustomization)) {
+            // assume it's a resume case and return false
+            nameInUse = false;
+        } else {
+            nameInUse = injectionHelper.getAaiClient().exists(vfModuleUri);
+        }
+        return nameInUse;
+    }
 }
index eb66f6b..a9635d1 100644 (file)
@@ -30,8 +30,10 @@ import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.LineOfBusiness;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.Platform;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance;
+import org.onap.so.client.aai.AAIObjectPlurals;
 import org.onap.so.client.aai.AAIObjectType;
 import org.onap.so.client.aai.AAIValidatorImpl;
+import org.onap.so.client.aai.entities.AAIResultWrapper;
 import org.onap.so.client.aai.entities.uri.AAIResourceUri;
 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
 import org.onap.so.client.aai.mapper.AAIObjectMapper;
@@ -152,4 +154,10 @@ public class AAIVnfResources {
         return aaiValidatorImpl.isPhysicalServerLocked(vnf.getVnfId());
 
     }
+
+    public boolean checkNameInUse(String vnfName) {
+        AAIResourceUri vnfUri =
+                AAIUriFactory.createResourceUri(AAIObjectPlurals.GENERIC_VNF).queryParam("vnf-name", vnfName);
+        return injectionHelper.getAaiClient().exists(vnfUri);
+    }
 }
index f4c285f..b9e4aeb 100644 (file)
@@ -26,6 +26,7 @@ import org.onap.so.bpmn.common.InjectionHelper;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup;
+import org.onap.so.client.aai.AAIObjectPlurals;
 import org.onap.so.client.aai.AAIObjectType;
 import org.onap.so.client.aai.entities.uri.AAIResourceUri;
 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
@@ -93,4 +94,10 @@ public class AAIVolumeGroupResources {
         copiedVolumeGroup.setHeatStackId(volumeGroup.getHeatStackId());
         injectionHelper.getAaiClient().update(uri, aaiObjectMapper.mapVolumeGroup(copiedVolumeGroup));
     }
+
+    public boolean checkNameInUse(VolumeGroup volumeGroup) {
+        AAIResourceUri volumeGroupUri = AAIUriFactory.createNodesUri(AAIObjectPlurals.VOLUME_GROUP)
+                .queryParam("volume-group-name", volumeGroup.getVolumeGroupName());
+        return injectionHelper.getAaiClient().exists(volumeGroupUri);
+    }
 }
index b054cc1..d515997 100644 (file)
@@ -60,6 +60,7 @@ import org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup;
 import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
 import org.onap.so.bpmn.servicedecomposition.modelinfo.ModelInfoGenericVnf;
 import org.onap.so.bpmn.servicedecomposition.modelinfo.ModelInfoVfModule;
+import org.onap.so.bpmn.servicedecomposition.tasks.exceptions.DuplicateNameException;
 import org.onap.so.client.exception.BBObjectNotFoundException;
 import org.onap.so.db.catalog.beans.OrchestrationStatus;
 import org.onap.so.client.aai.entities.uri.AAIResourceUri;
@@ -140,7 +141,7 @@ public class AAICreateTasksTest extends BaseTaskTest {
     @Test
     public void createVolumeGroupTest() throws Exception {
         volumeGroup.setOrchestrationStatus(OrchestrationStatus.PRECREATED);
-
+        execution.setVariable("aLaCarte", Boolean.FALSE);
         doNothing().when(aaiVolumeGroupResources).createVolumeGroup(volumeGroup, cloudRegion);
         doNothing().when(aaiVolumeGroupResources).connectVolumeGroupToVnf(genericVnf, volumeGroup, cloudRegion);
 
@@ -151,6 +152,14 @@ public class AAICreateTasksTest extends BaseTaskTest {
         verify(aaiVolumeGroupResources, times(1)).connectVolumeGroupToTenant(volumeGroup, cloudRegion);
     }
 
+    @Test
+    public void createVolumeGroupDuplicateNameTest() throws Exception {
+        expectedException.expect(BpmnError.class);
+        execution.setVariable("aLaCarte", Boolean.TRUE);
+        doReturn(true).when(aaiVolumeGroupResources).checkNameInUse(volumeGroup);
+        aaiCreateTasks.createVolumeGroup(execution);
+    }
+
     @Test
     public void createVolumeGroupExceptionTest() throws Exception {
         expectedException.expect(BpmnError.class);
@@ -325,10 +334,19 @@ public class AAICreateTasksTest extends BaseTaskTest {
     @Test
     public void createVnfTest() throws Exception {
         doNothing().when(aaiVnfResources).createVnfandConnectServiceInstance(genericVnf, serviceInstance);
+        execution.setVariable("aLaCarte", Boolean.FALSE);
         aaiCreateTasks.createVnf(execution);
         verify(aaiVnfResources, times(1)).createVnfandConnectServiceInstance(genericVnf, serviceInstance);
     }
 
+    @Test
+    public void createVnfDuplicateNameTest() throws Exception {
+        expectedException.expect(BpmnError.class);
+        doReturn(true).when(aaiVnfResources).checkNameInUse(genericVnf.getVnfName());
+        execution.setVariable("aLaCarte", Boolean.TRUE);
+        aaiCreateTasks.createVnf(execution);
+    }
+
     @Test
     public void createVnfExceptionTest() throws Exception {
         expectedException.expect(BpmnError.class);
@@ -352,11 +370,20 @@ public class AAICreateTasksTest extends BaseTaskTest {
                 .thenReturn(newVfModule);
 
         assertEquals(null, newVfModule.getModuleIndex());
+        execution.setVariable("aLaCarte", Boolean.FALSE);
         aaiCreateTasks.createVfModule(execution);
         assertEquals(1, newVfModule.getModuleIndex().intValue());
         verify(aaiVfModuleResources, times(1)).createVfModule(newVfModule, genericVnf);
     }
 
+    @Test
+    public void createVfModuleDuplicateNameTest() throws Exception {
+        expectedException.expect(BpmnError.class);
+        execution.setVariable("aLaCarte", Boolean.TRUE);
+        doReturn(true).when(aaiVfModuleResources).checkNameInUse(vfModule);
+        aaiCreateTasks.createVfModule(execution);
+    }
+
     @Test
     public void createServiceSubscriptionTest() {
         doNothing().when(aaiServiceInstanceResources).createServiceSubscription(customer);
index ae3ebed..9e3bc4f 100644 (file)
 package org.onap.so.client.orchestration;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.ArgumentMatchers.isA;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
@@ -41,8 +44,10 @@ import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup;
+import org.onap.so.client.aai.AAIObjectPlurals;
 import org.onap.so.client.aai.AAIResourcesClient;
 import org.onap.so.client.aai.entities.uri.AAIResourceUri;
+import org.onap.so.client.aai.entities.uri.AAIUriFactory;
 import org.onap.so.client.aai.mapper.AAIObjectMapper;
 import org.onap.so.db.catalog.beans.OrchestrationStatus;
 
@@ -154,4 +159,39 @@ public class AAIVfModuleResourcesTest extends TestDataSetup {
 
         assertEquals("testContrailServiceInstanceFqdn", vfModule.getContrailServiceInstanceFqdn());
     }
+
+    @Test
+    public void checkNameInUseTrueTest() throws Exception {
+        AAIResourceUri vfModuleUri = AAIUriFactory.createNodesUri(AAIObjectPlurals.VF_MODULE)
+                .queryParam("vf-module-name", vfModule.getVfModuleName());
+        AAIResourceUri vfModuleUriWithCustomization = vfModuleUri.clone().queryParam("model-customization-id",
+                vfModule.getModelInfoVfModule().getModelCustomizationUUID());
+        doReturn(false).when(MOCK_aaiResourcesClient).exists(eq(vfModuleUriWithCustomization));
+        doReturn(true).when(MOCK_aaiResourcesClient).exists(eq(vfModuleUri));
+        boolean nameInUse = aaiVfModuleResources.checkNameInUse(vfModule);
+        assertTrue(nameInUse);
+    }
+
+    @Test
+    public void checkNameInUseFalseIsResumeTest() throws Exception {
+        AAIResourceUri vfModuleUri = AAIUriFactory.createNodesUri(AAIObjectPlurals.VF_MODULE)
+                .queryParam("vf-module-name", vfModule.getVfModuleName());
+        AAIResourceUri vfModuleUriWithCustomization = vfModuleUri.clone().queryParam("model-customization-id",
+                vfModule.getModelInfoVfModule().getModelCustomizationUUID());
+        doReturn(true).when(MOCK_aaiResourcesClient).exists(eq(vfModuleUriWithCustomization));
+        boolean nameInUse = aaiVfModuleResources.checkNameInUse(vfModule);
+        assertFalse(nameInUse);
+    }
+
+    @Test
+    public void checkNameInUseFalseTest() throws Exception {
+        AAIResourceUri vfModuleUri = AAIUriFactory.createNodesUri(AAIObjectPlurals.VF_MODULE)
+                .queryParam("vf-module-name", vfModule.getVfModuleName());
+        AAIResourceUri vfModuleUriWithCustomization = vfModuleUri.clone().queryParam("model-customization-id",
+                vfModule.getModelInfoVfModule().getModelCustomizationUUID());
+        doReturn(false).when(MOCK_aaiResourcesClient).exists(eq(vfModuleUriWithCustomization));
+        doReturn(false).when(MOCK_aaiResourcesClient).exists(eq(vfModuleUri));
+        boolean nameInUse = aaiVfModuleResources.checkNameInUse(vfModule);
+        assertFalse(nameInUse);
+    }
 }
index cdc601c..0d48a29 100644 (file)
@@ -21,6 +21,7 @@
 package org.onap.so.client.orchestration;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
@@ -45,9 +46,11 @@ import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.LineOfBusiness;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.Platform;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance;
+import org.onap.so.client.aai.AAIObjectPlurals;
 import org.onap.so.client.aai.AAIObjectType;
 import org.onap.so.client.aai.AAIResourcesClient;
 import org.onap.so.client.aai.AAIValidatorImpl;
+import org.onap.so.client.aai.entities.AAIResultWrapper;
 import org.onap.so.client.aai.entities.uri.AAIResourceUri;
 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
 import org.onap.so.client.aai.mapper.AAIObjectMapper;
@@ -227,4 +230,23 @@ public class AAIVnfResourcesTest extends TestDataSetup {
         verify(MOCK_aaiValidatorImpl, times(1)).isPhysicalServerLocked(isA(String.class));
         assertTrue(isVnfPserversLockedFlag);
     }
+
+
+    @Test
+    public void checkNameInUseTrueTest() {
+        AAIResourceUri vnfUri =
+                AAIUriFactory.createResourceUri(AAIObjectPlurals.GENERIC_VNF).queryParam("vnf-name", "vnfName");
+        doReturn(true).when(MOCK_aaiResourcesClient).exists(eq(vnfUri));
+        boolean nameInUse = aaiVnfResources.checkNameInUse("vnfName");
+        assertTrue(nameInUse);
+    }
+
+    @Test
+    public void checkNameInUseFalseTest() {
+        AAIResourceUri vnfUri =
+                AAIUriFactory.createResourceUri(AAIObjectPlurals.GENERIC_VNF).queryParam("vnf-name", "vnfName");
+        doReturn(false).when(MOCK_aaiResourcesClient).exists(eq(vnfUri));
+        boolean nameInUse = aaiVnfResources.checkNameInUse("vnfName");
+        assertFalse(nameInUse);
+    }
 }
index 2bdcf30..5772cab 100644 (file)
 package org.onap.so.client.orchestration;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.ArgumentMatchers.isA;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
@@ -39,8 +42,11 @@ import org.onap.so.bpmn.common.InjectionHelper;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup;
+import org.onap.so.client.aai.AAIObjectPlurals;
 import org.onap.so.client.aai.AAIResourcesClient;
+import org.onap.so.client.aai.entities.AAIResultWrapper;
 import org.onap.so.client.aai.entities.uri.AAIResourceUri;
+import org.onap.so.client.aai.entities.uri.AAIUriFactory;
 import org.onap.so.client.aai.mapper.AAIObjectMapper;
 import org.onap.so.db.catalog.beans.OrchestrationStatus;
 
@@ -146,4 +152,22 @@ public class AAIVolumeGroupResourcesTest extends TestDataSetup {
 
         assertEquals("testVolumeHeatStackId", volumeGroup.getHeatStackId());
     }
+
+    @Test
+    public void checkNameInUseTrueTest() {
+        AAIResourceUri volumeGroupUri = AAIUriFactory.createNodesUri(AAIObjectPlurals.VOLUME_GROUP)
+                .queryParam("volume-group-name", "testVolumeGroupName1");
+        doReturn(true).when(MOCK_aaiResourcesClient).exists(eq(volumeGroupUri));
+        boolean nameInUse = aaiVolumeGroupResources.checkNameInUse(volumeGroup);
+        assertTrue(nameInUse);
+    }
+
+    @Test
+    public void checkNameInUseFalseTest() {
+        AAIResourceUri volumeGroupUri = AAIUriFactory.createNodesUri(AAIObjectPlurals.VOLUME_GROUP)
+                .queryParam("volume-group-name", "testVolumeGroupName1");
+        doReturn(false).when(MOCK_aaiResourcesClient).exists(eq(volumeGroupUri));
+        boolean nameInUse = aaiVolumeGroupResources.checkNameInUse(volumeGroup);
+        assertFalse(nameInUse);
+    }
 }