Prevent AAI re-query 31/44531/5
authorJim Hahn <jrh3@att.com>
Tue, 24 Apr 2018 21:15:52 +0000 (17:15 -0400)
committerJim Hahn <jrh3@att.com>
Wed, 25 Apr 2018 14:34:18 +0000 (10:34 -0400)
Modified event manager code to not query AAI if there's already
a response from a previous query.
Modified code to store AAI properties in local variables instead
of static to prevent any chance of a race condition in a multi-threaded
situation.
Updated junit tests to use a new manager for each subsequent
query.
Update license.
Change variable name, in junit test, from onsetEvent to event,
because it can be any type of event.
Included fix to prevent initial AAI query if AAI data was already
available in the initial onset event.

Change-Id: Idf3e15ea8c5e297f22f23570c22fd837b72ba200
Issue-ID: POLICY-754
Signed-off-by: Jim Hahn <jrh3@att.com>
controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManager.java
controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManagerTest.java

index 92b618f..bc9d3df 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * controlloop event manager
  * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -80,9 +80,6 @@ public class ControlLoopEventManager implements LockCallback, Serializable {
     private transient TargetLock targetLock = null;
     private AaiGetVnfResponse vnfResponse = null;
     private AaiGetVserverResponse vserverResponse = null;
-    private static String aaiHostURL;
-    private static String aaiUser;
-    private static String aaiPassword;
 
     private static Collection<String> requiredAAIKeys = new ArrayList<>();
 
@@ -643,10 +640,21 @@ public class ControlLoopEventManager implements LockCallback, Serializable {
      * @param event the event
      * @throws AaiException if an error occurs retrieving information from A&AI
      */
-    public void queryAai(VirtualControlLoopEvent event) throws AaiException {
-        if ((event.getAai().get(VSERVER_IS_CLOSED_LOOP_DISABLED) != null
-                || event.getAai().get(GENERIC_VNF_IS_CLOSED_LOOP_DISABLED) != null) && isClosedLoopDisabled(event)) {
-            throw new AaiException("is-closed-loop-disabled is set to true on VServer or VNF");
+    public void queryAai(VirtualControlLoopEvent event) throws AaiException {        
+        if (event.getAai().get(VSERVER_IS_CLOSED_LOOP_DISABLED) != null
+                || event.getAai().get(GENERIC_VNF_IS_CLOSED_LOOP_DISABLED) != null) {
+            
+            if(isClosedLoopDisabled(event)) {
+                throw new AaiException("is-closed-loop-disabled is set to true on VServer or VNF");
+            }
+            
+            // no need to query, as we already have the data
+            return;
+        }
+        
+        if(vnfResponse != null || vserverResponse != null) {
+            // query has already been performed
+            return;
         }
 
         try {
@@ -740,9 +748,9 @@ public class ControlLoopEventManager implements LockCallback, Serializable {
 
         try {
             if (vserverName != null) {
-                aaiHostURL = PolicyEngine.manager.getEnvironmentProperty("aai.url");
-                aaiUser = PolicyEngine.manager.getEnvironmentProperty("aai.username");
-                aaiPassword = PolicyEngine.manager.getEnvironmentProperty("aai.password");
+                String aaiHostURL = PolicyEngine.manager.getEnvironmentProperty("aai.url");
+                String aaiUser = PolicyEngine.manager.getEnvironmentProperty("aai.username");
+                String aaiPassword = PolicyEngine.manager.getEnvironmentProperty("aai.password");
                 String aaiGetQueryByVserver = "/aai/v11/nodes/vservers?vserver-name=";
                 String url = aaiHostURL + aaiGetQueryByVserver;
                 logger.info("AAI Host URL by VServer: {}", url);
@@ -770,9 +778,9 @@ public class ControlLoopEventManager implements LockCallback, Serializable {
         String vnfName = event.getAai().get(GENERIC_VNF_VNF_NAME);
         String vnfId = event.getAai().get(GENERIC_VNF_VNF_ID);
 
-        aaiHostURL = PolicyEngine.manager.getEnvironmentProperty("aai.url");
-        aaiUser = PolicyEngine.manager.getEnvironmentProperty("aai.username");
-        aaiPassword = PolicyEngine.manager.getEnvironmentProperty("aai.password");
+        String aaiHostURL = PolicyEngine.manager.getEnvironmentProperty("aai.url");
+        String aaiUser = PolicyEngine.manager.getEnvironmentProperty("aai.username");
+        String aaiPassword = PolicyEngine.manager.getEnvironmentProperty("aai.password");
 
         try {
             if (vnfName != null) {
index 700d1ab..5bd361a 100644 (file)
@@ -213,8 +213,7 @@ public class ControlLoopEventManagerTest {
         event.setTarget("generic-vnf.vnf-id");
         event.setClosedLoopAlarmStart(Instant.now());
         event.setClosedLoopEventStatus(ControlLoopEventStatus.ABATED);
-        ControlLoopEventManager manager =
-                new ControlLoopEventManager(event.getClosedLoopControlName(), event.getRequestId());
+        ControlLoopEventManager manager = makeManager(event);
         assertNull(manager.getVnfResponse());
         assertNull(manager.getVserverResponse());
         try {
@@ -253,8 +252,7 @@ public class ControlLoopEventManagerTest {
         event.setAai(new HashMap<>());
         event.getAai().put("generic-vnf.vnf-name", "onsetOne");
 
-        ControlLoopEventManager manager =
-                new ControlLoopEventManager(event.getClosedLoopControlName(), event.getRequestId());
+        ControlLoopEventManager manager = makeManager(event);
         VirtualControlLoopNotification notification = manager.activate(event);
 
         assertNotNull(notification);
@@ -501,8 +499,7 @@ public class ControlLoopEventManagerTest {
         event.setAai(new HashMap<>());
         event.getAai().put("generic-vnf.vnf-name", "onsetOne");
 
-        ControlLoopEventManager manager =
-                new ControlLoopEventManager(event.getClosedLoopControlName(), event.getRequestId());
+        ControlLoopEventManager manager = makeManager(event);
         manager.setActivated(true);
         VirtualControlLoopNotification notification = manager.activate(event);
         assertEquals(ControlLoopNotificationType.REJECTED, notification.getNotification());
@@ -526,8 +523,7 @@ public class ControlLoopEventManagerTest {
         event.setAai(new HashMap<>());
         event.getAai().put("generic-vnf.vnf-name", "onsetOne");
 
-        ControlLoopEventManager manager =
-                new ControlLoopEventManager(event.getClosedLoopControlName(), event.getRequestId());
+        ControlLoopEventManager manager = makeManager(event);
 
         // Null YAML should fail
         VirtualControlLoopNotification notificationNull = manager.activate(null, event);
@@ -569,8 +565,7 @@ public class ControlLoopEventManagerTest {
         event.setAai(new HashMap<>());
         event.getAai().put("generic-vnf.vnf-name", "onsetOne");
 
-        ControlLoopEventManager manager =
-                new ControlLoopEventManager(event.getClosedLoopControlName(), event.getRequestId());
+        ControlLoopEventManager manager = makeManager(event);
         try {
             manager.isControlLoopFinal();
             fail("test should throw an exception here");
@@ -640,8 +635,7 @@ public class ControlLoopEventManagerTest {
         event.setAai(new HashMap<>());
         event.getAai().put("generic-vnf.vnf-name", "onsetOne");
 
-        ControlLoopEventManager manager =
-                new ControlLoopEventManager(event.getClosedLoopControlName(), event.getRequestId());
+        ControlLoopEventManager manager = makeManager(event);
         try {
             manager.processControlLoop();
             fail("test should throw an exception here");
@@ -725,8 +719,7 @@ public class ControlLoopEventManagerTest {
         event.setAai(new HashMap<>());
         event.getAai().put("generic-vnf.vnf-name", "onsetOne");
 
-        ControlLoopEventManager manager =
-                new ControlLoopEventManager(event.getClosedLoopControlName(), event.getRequestId());
+        ControlLoopEventManager manager = makeManager(event);
         try {
             manager.finishOperation(null);
             fail("test should throw an exception here");
@@ -780,8 +773,7 @@ public class ControlLoopEventManagerTest {
         // This call should be exception free
         manager.finishOperation(clom);
 
-        ControlLoopEventManager otherManager =
-                new ControlLoopEventManager(event.getClosedLoopControlName(), event.getRequestId());
+        ControlLoopEventManager otherManager = makeManager(event);
         VirtualControlLoopNotification otherNotification = otherManager.activate(yamlStringStd, event);
         assertNotNull(otherNotification);
         assertEquals(ControlLoopNotificationType.ACTIVE, otherNotification.getNotification());
@@ -817,8 +809,7 @@ public class ControlLoopEventManagerTest {
         abatedEvent.setAai(new HashMap<>());
         abatedEvent.getAai().put("generic-vnf.vnf-name", "onsetOne");
 
-        ControlLoopEventManager manager =
-                new ControlLoopEventManager(onsetEvent.getClosedLoopControlName(), onsetEvent.getRequestId());
+        ControlLoopEventManager manager = makeManager(onsetEvent);
         VirtualControlLoopNotification notification = manager.activate(yamlString, onsetEvent);
         assertNotNull(notification);
         assertEquals(ControlLoopNotificationType.ACTIVE, notification.getNotification());
@@ -927,8 +918,7 @@ public class ControlLoopEventManagerTest {
         onsetEvent.setAai(new HashMap<>());
         onsetEvent.getAai().put("generic-vnf.vnf-name", "onsetOne");
 
-        ControlLoopEventManager manager =
-                new ControlLoopEventManager(onsetEvent.getClosedLoopControlName(), onsetEvent.getRequestId());
+        ControlLoopEventManager manager = makeManager(onsetEvent);
         assertTrue(0 == manager.getControlLoopTimeout(null));
         assertTrue(120 == manager.getControlLoopTimeout(120));
 
@@ -954,70 +944,78 @@ public class ControlLoopEventManagerTest {
         onsetEvent.setAai(new HashMap<>());
         onsetEvent.getAai().put("generic-vnf.vnf-name", "onsetOne");
 
-        ControlLoopEventManager manager =
-                new ControlLoopEventManager(onsetEvent.getClosedLoopControlName(), onsetEvent.getRequestId());
+        ControlLoopEventManager manager = makeManager(onsetEvent);
         manager.queryAai(onsetEvent);
 
         VirtualControlLoopNotification notification = manager.activate(yamlString, onsetEvent);
         assertNotNull(notification);
         assertEquals(ControlLoopNotificationType.ACTIVE, notification.getNotification());
 
+        // repeat query with same manager
         manager.queryAai(onsetEvent);
+        
+        // remaining queries each use their own manager so they will be re-executed
+        
+        makeManager(onsetEvent).queryAai(onsetEvent);
 
         onsetEvent.getAai().put("generic-vnf.is-closed-loop-disabled", "true");
         try {
-            manager.queryAai(onsetEvent);
+            makeManager(onsetEvent).queryAai(onsetEvent);
             fail("test should throw an exception here");
         } catch (Exception e) {
             assertEquals("is-closed-loop-disabled is set to true on VServer or VNF", e.getMessage());
         }
         onsetEvent.getAai().put("vserver.is-closed-loop-disabled", "true");
         try {
-            manager.queryAai(onsetEvent);
+            makeManager(onsetEvent).queryAai(onsetEvent);
             fail("test should throw an exception here");
         } catch (Exception e) {
             assertEquals("is-closed-loop-disabled is set to true on VServer or VNF", e.getMessage());
         }
         onsetEvent.getAai().remove("generic-vnf.is-closed-loop-disabled");
         try {
-            manager.queryAai(onsetEvent);
+            makeManager(onsetEvent).queryAai(onsetEvent);
             fail("test should throw an exception here");
         } catch (Exception e) {
             assertEquals("is-closed-loop-disabled is set to true on VServer or VNF", e.getMessage());
         }
         onsetEvent.getAai().remove("vserver.is-closed-loop-disabled");
-        manager.queryAai(onsetEvent);
+        makeManager(onsetEvent).queryAai(onsetEvent);
 
         onsetEvent.getAai().put("generic-vnf.is-closed-loop-disabled", "false");
-        manager.queryAai(onsetEvent);
+        makeManager(onsetEvent).queryAai(onsetEvent);
+
+        onsetEvent.getAai().remove("generic-vnf.is-closed-loop-disabled");
         onsetEvent.getAai().put("vserver.is-closed-loop-disabled", "false");
-        manager.queryAai(onsetEvent);
+        makeManager(onsetEvent).queryAai(onsetEvent);
 
         onsetEvent.getAai().remove("generic-vnf.vnf-id");
         onsetEvent.getAai().remove("generic-vnf.vnf-name");
         onsetEvent.getAai().remove("vserver.vserver-name");
-        manager.queryAai(onsetEvent);
+        onsetEvent.getAai().remove("generic-vnf.is-closed-loop-disabled");
+        onsetEvent.getAai().remove("vserver.is-closed-loop-disabled");
+        makeManager(onsetEvent).queryAai(onsetEvent);
 
         onsetEvent.getAai().put("vserver.vserver-name", "AVserver");
-        manager.queryAai(onsetEvent);
+        makeManager(onsetEvent).queryAai(onsetEvent);
 
         onsetEvent.getAai().put("generic-vnf.vnf-name", "AVNFName");
-        manager.queryAai(onsetEvent);
+        makeManager(onsetEvent).queryAai(onsetEvent);
 
         onsetEvent.getAai().put("generic-vnf.vnf-id", "AVNFID");
-        manager.queryAai(onsetEvent);
+        makeManager(onsetEvent).queryAai(onsetEvent);
 
         onsetEvent.getAai().remove("vserver.vserver-name");
-        manager.queryAai(onsetEvent);
+        makeManager(onsetEvent).queryAai(onsetEvent);
 
         onsetEvent.getAai().remove("generic-vnf.vnf-name");
-        manager.queryAai(onsetEvent);
+        makeManager(onsetEvent).queryAai(onsetEvent);
 
         // Force AAI errors
         PolicyEngine.manager.setEnvironmentProperty("aai.url", "http://localhost:9999");
 
         try {
-            manager.queryAai(onsetEvent);
+            makeManager(onsetEvent).queryAai(onsetEvent);
             fail("test should throw an exception here");
         } catch (Exception e) {
             assertEquals("Exception from queryAai: org.onap.policy.aai.util.AaiException: AAI Response is null "
@@ -1027,7 +1025,7 @@ public class ControlLoopEventManagerTest {
         onsetEvent.getAai().remove("generic-vnf.vnf-id");
         onsetEvent.getAai().put("generic-vnf.vnf-name", "AVNFName");
         try {
-            manager.queryAai(onsetEvent);
+            makeManager(onsetEvent).queryAai(onsetEvent);
             fail("test should throw an exception here");
         } catch (Exception e) {
             assertEquals("Exception from queryAai: org.onap.policy.aai.util.AaiException: AAI Response is null "
@@ -1037,7 +1035,7 @@ public class ControlLoopEventManagerTest {
         onsetEvent.getAai().remove("generic-vnf.vnf-name");
         onsetEvent.getAai().put("vserver.vserver-name", "AVserver");
         try {
-            manager.queryAai(onsetEvent);
+            makeManager(onsetEvent).queryAai(onsetEvent);
             fail("test should throw an exception here");
         } catch (Exception e) {
             assertEquals("Exception from queryAai: org.onap.policy.aai.util.AaiException: AAI Response is null "
@@ -1046,4 +1044,8 @@ public class ControlLoopEventManagerTest {
 
         PolicyEngine.manager.setEnvironmentProperty("aai.url", "http://localhost:6666");
     }
+
+    private ControlLoopEventManager makeManager(VirtualControlLoopEvent event) {
+        return new ControlLoopEventManager(event.getClosedLoopControlName(), event.getRequestId());
+    }
 }