logic to handle null values for vf module index 17/77917/1
authorBenjamin, Max (mb388a) <mb388a@us.att.com>
Tue, 5 Feb 2019 22:11:54 +0000 (17:11 -0500)
committerBenjamin, Max (mb388a) <mb388a@us.att.com>
Tue, 5 Feb 2019 22:12:15 +0000 (17:12 -0500)
added logic to handle null values for vf module index

Change-Id: I53f4ed8b307a92187c22f19dbc7bb101d037fbd8
Issue-ID: SO-1465
Signed-off-by: Benjamin, Max (mb388a) <mb388a@us.att.com>
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAICreateTasks.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAICreateTasksTest.java

index 55e7433..4dd0147 100644 (file)
@@ -21,7 +21,6 @@
 package org.onap.so.bpmn.infrastructure.aai.tasks;
 
 import java.util.Arrays;
-import java.util.Set;
 import java.util.TreeSet;
 
 import org.camunda.bpm.engine.delegate.BpmnError;
@@ -54,6 +53,8 @@ import org.onap.so.client.orchestration.AAIVolumeGroupResources;
 import org.onap.so.client.orchestration.AAIVpnBindingResources;
 import org.onap.so.logger.MessageEnum;
 import org.onap.so.logger.MsoLogger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Component;
@@ -62,6 +63,8 @@ import org.springframework.stereotype.Component;
 public class AAICreateTasks {
 
        private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, AAICreateTasks.class);
+       private static final Logger logger = LoggerFactory.getLogger(AAICreateTasks.class.getName());
+       
        private static final String networkTypeProvider = "PROVIDER";
        private static String NETWORK_COLLECTION_NAME = "networkCollectionName";
        @Autowired
@@ -452,23 +455,45 @@ public class AAICreateTasks {
                
                
                if (genericVnf != null && genericVnf.getVfModules() != null && !genericVnf.getVfModules().isEmpty()) {
-                       Set<Integer> moduleIndices = new TreeSet<>();
+                       TreeSet<Integer> moduleIndices = new TreeSet<>();
+                       int nullIndexFound = 0;
                        for (VfModule vfModule : genericVnf.getVfModules()) {
                                if (vfModule.getModelInfoVfModule() != null) {
                                        if (vfModule.getModelInfoVfModule().getModelInvariantUUID().equals(newVfModuleModelInvariantUUID)) {
-                                               moduleIndices.add(vfModule.getModuleIndex());
+                                               if (vfModule.getModuleIndex() != null) {
+                                                       moduleIndices.add(vfModule.getModuleIndex());
+                                               } else {
+                                                       nullIndexFound++;
+                                                       logger.warn("Found null index for vf-module-id {} and model-invariant-uuid {}", vfModule.getVfModuleId(), vfModule.getModelInfoVfModule().getModelInvariantUUID());
+                                               }
                                        }
                                }
                        }
-                       Object[] array = moduleIndices.toArray();
-                       for (int i=0; i < array.length; i++) {
-                               if ((int) array[i] != i) {
-                                       return i;
-                               }
-                       }
-                       return array.length;
+                       
+                       return calculateUnusedIndex(moduleIndices, nullIndexFound);
                } else {
                        return 0;
                }
        }
+       
+       protected int calculateUnusedIndex(TreeSet<Integer> moduleIndices, int nullIndexFound) {
+               //pad array with nulls
+               Integer[] temp = new Integer[moduleIndices.size() + nullIndexFound];
+               Integer[] array = moduleIndices.toArray(temp);
+               int result = 0;
+               //when a null is found skip that potential value
+               //effectively creates something like, [0,1,3,null,null] -> [0,1,null(2),3,null(4)]
+               for (int i=0; i < array.length; i++, result++) {
+                       if (Integer.valueOf(result) != array[i]) {
+                               if (nullIndexFound > 0) {
+                                       nullIndexFound--;
+                                       i--;
+                               } else {
+                                       break;
+                               }
+                       }
+               }
+               
+               return result;
+       }
 }
index 8e261cf..5b92d85 100644 (file)
@@ -30,6 +30,9 @@ import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import java.util.Arrays;
+import java.util.TreeSet;
+
 import org.camunda.bpm.engine.delegate.BpmnError;
 import org.junit.Before;
 import org.junit.Rule;
@@ -515,15 +518,32 @@ public class AAICreateTasksTest extends BaseTaskTest{
                vfModule3.setModuleIndex(3);
                
                //B
-               vfModule4.setModuleIndex(0);
+               vfModule4.setModuleIndex(null);
                vfModule5.setModuleIndex(1);
 
-               assertEquals(aaiCreateTasks.getLowestUnusedVfModuleIndexFromAAIVnfResponse(vnf, newVfModuleA), 1);
+               assertEquals(1, aaiCreateTasks.getLowestUnusedVfModuleIndexFromAAIVnfResponse(vnf, newVfModuleA));
 
-               assertEquals(aaiCreateTasks.getLowestUnusedVfModuleIndexFromAAIVnfResponse(vnf, newVfModuleB), 2);
+               assertEquals(2, aaiCreateTasks.getLowestUnusedVfModuleIndexFromAAIVnfResponse(vnf, newVfModuleB));
                
-               assertEquals(aaiCreateTasks.getLowestUnusedVfModuleIndexFromAAIVnfResponse(vnf, newVfModuleC), 0);
-
+               assertEquals(0, aaiCreateTasks.getLowestUnusedVfModuleIndexFromAAIVnfResponse(vnf, newVfModuleC));
                
        }
+       
+       @Test
+       public void calculateUnusedIndexTest() {
+               
+               TreeSet<Integer> a = new TreeSet<>(Arrays.asList(0,1,3));
+               TreeSet<Integer> b = new TreeSet<>(Arrays.asList(0,1,8));
+               TreeSet<Integer> c = new TreeSet<>(Arrays.asList(0,2,4));
+               assertEquals(2, aaiCreateTasks.calculateUnusedIndex(a, 0));
+               assertEquals(5, aaiCreateTasks.calculateUnusedIndex(a, 2));
+               
+               assertEquals(4, aaiCreateTasks.calculateUnusedIndex(b, 2));
+               assertEquals(3, aaiCreateTasks.calculateUnusedIndex(b, 1));
+               
+               assertEquals(5, aaiCreateTasks.calculateUnusedIndex(c, 2));
+               assertEquals(9, aaiCreateTasks.calculateUnusedIndex(c, 6));
+               assertEquals(1, aaiCreateTasks.calculateUnusedIndex(c, 0));
+
+       }
 }