Send final failure on null vfc request 81/21081/1
authorCharles Cole <cc847m@att.com>
Fri, 27 Oct 2017 21:19:13 +0000 (16:19 -0500)
committerCharles Cole <cc847m@att.com>
Fri, 27 Oct 2017 21:33:13 +0000 (16:33 -0500)
Made sure a final failure is sent and the memroy is cleaned up if we
cannot contruct a vfc request.

Issue-Id: POLICY-350
Change-Id: Ia9bc827572042ae6ff2d2d2851d33034ee86fc49
Signed-off-by: Charles Cole <cc847m@att.com>
controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManager.java
controlloop/templates/archetype-cl-amsterdam/src/main/resources/archetype-resources/src/main/resources/__closedLoopControlName__.drl
controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/VFCControlLoopTest.java

index 1c46b99..a1b63e4 100644 (file)
@@ -165,7 +165,7 @@ public class ControlLoopOperationManager implements Serializable {
         else {
             throw new ControlLoopException("The target is null");
         }
-        return null;
+        throw new ControlLoopException("Target does not match target type");
     }
        
        public ControlLoopOperationManager(ControlLoopEvent onset, Policy policy, ControlLoopEventManager em) throws ControlLoopException, AAIException {
@@ -289,9 +289,12 @@ public class ControlLoopOperationManager implements Serializable {
 
                        return operationRequest;
                case "VFC":
-                        this.operationRequest = VFCActorServiceProvider.constructRequest((VirtualControlLoopEvent) onset, operation.operation, this.policy, this.eventManager.getVnfResponse());
-                        this.currentOperation = operation;
-                        return operationRequest;
+            this.operationRequest = VFCActorServiceProvider.constructRequest((VirtualControlLoopEvent) onset, operation.operation, this.policy, this.eventManager.getVnfResponse());
+            this.currentOperation = operation;
+            if (this.operationRequest == null) {
+                this.policyResult = PolicyResult.FAILURE;
+            }
+            return operationRequest;
 
                }
                return null;
index 2f8d861..da54bbe 100644 (file)
@@ -603,6 +603,11 @@ rule "${policyName}.EVENT.MANAGER.OPERATION.LOCKED.GUARD_PERMITTED"
                        retract($operation);
                        modify($manager) {finishOperation($operation)};
                }
+               else if ("vfc".equalsIgnoreCase($operation.policy.getActor())) {
+                   retract($opTimer);
+                       retract($operation);
+                       modify($manager) {finishOperation($operation)};
+               }
 
     }
 end
index 2581e3d..39dac81 100644 (file)
@@ -161,6 +161,56 @@ public class VFCControlLoopTest implements TopicListener {
          */
         assertEquals(1, kieSession.getFactCount());
         
+        /*
+         * Print what's left in memory
+         */
+        dumpFacts(kieSession);
+       }
+       
+       @Test
+       public void nullRequestTest() throws IOException {
+        
+        /*
+         * Allows the PolicyEngine to callback to this object to
+         * notify that there is an event ready to be pulled 
+         * from the queue
+         */
+        for (TopicSink sink : noopTopics) {
+            assertTrue(sink.start());
+            sink.register(this);
+        }
+        
+        /*
+         * Create a unique requestId
+         */
+        requestID = UUID.randomUUID();
+        
+        /* 
+         * Simulate an onset event the policy engine will 
+         * receive from DCAE to kick off processing through
+         * the rules
+         */
+        
+        VirtualControlLoopEvent event = new VirtualControlLoopEvent();
+        event.closedLoopControlName = pair.a.getControlLoop().getControlLoopName();
+        event.requestID = UUID.randomUUID();
+        event.closedLoopEventClient = "tca.instance00009";
+        event.target_type = ControlLoopTargetType.VM;
+        event.target = "vserver.vserver-name";
+        event.from = "DCAE";
+        event.closedLoopAlarmStart = Instant.now();
+        event.AAI = new HashMap<String, String>();
+        event.AAI.put("vserver.vserver-name", "nullRequest");
+        event.closedLoopEventStatus = ControlLoopEventStatus.ONSET;
+        kieSession.insert(event);
+        
+        kieSession.fireUntilHalt();
+        
+        /*
+         * The only fact in memory should be Params
+         */
+        assertEquals(1, kieSession.getFactCount());
+        
         /*
          * Print what's left in memory
          */
@@ -274,7 +324,12 @@ public class VFCControlLoopTest implements TopicListener {
             }
             else if (policyName.endsWith("EVENT.MANAGER")) {
                 logger.debug("Rule Fired: " + notification.policyName);
-                assertTrue(ControlLoopNotificationType.FINAL_SUCCESS.equals(notification.notification));
+                if ("nullRequest".equals(notification.AAI.get("vserver.vserver-name"))){
+                       assertEquals(ControlLoopNotificationType.FINAL_FAILURE, notification.notification);
+                }
+                else {
+                     assertEquals(ControlLoopNotificationType.FINAL_SUCCESS, notification.notification);
+                }
                 kieSession.halt();
             }
             else if (policyName.endsWith("EVENT.MANAGER.TIMEOUT")) {
@@ -304,7 +359,7 @@ public class VFCControlLoopTest implements TopicListener {
        event.requestID = UUID.randomUUID();
        event.closedLoopEventClient = "tca.instance00009";
        event.target_type = ControlLoopTargetType.VM;
-       event.target = "VM_NAME";
+       event.target = "vserver.vserver-name";
        event.from = "DCAE";
        event.closedLoopAlarmStart = Instant.now();
        event.AAI = new HashMap<String, String>();