PNF support changes for drools-application

Conditional checks for enrichment and validation by target-types
PNF specific AAI enrichment
Fixed Unit Tests

Issue-ID: POLICY-1187
Signed-off-by: Rashmi Pujar <rashmi.pujar@bell.ca>
Change-Id: I78bf73e454828253ca69695f9196047449b4d9d6
diff --git a/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManager.java b/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManager.java
index 6afb08d..be22e76 100644
--- a/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManager.java
+++ b/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManager.java
@@ -20,11 +20,14 @@
 
 package org.onap.policy.controlloop.eventmanager;
 
+import static org.onap.policy.controlloop.ControlLoopTargetType.PNF;
+import static org.onap.policy.controlloop.ControlLoopTargetType.VM;
+import static org.onap.policy.controlloop.ControlLoopTargetType.VNF;
+
 import java.io.Serializable;
 import java.io.UnsupportedEncodingException;
 import java.net.URLDecoder;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -36,6 +39,7 @@
 import java.util.Set;
 import java.util.UUID;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 import org.apache.commons.lang3.StringUtils;
 import org.onap.policy.aai.AaiCqResponse;
 import org.onap.policy.aai.AaiGetVnfResponse;
@@ -78,8 +82,11 @@
     public static final String VSERVER_VSERVER_NAME = "vserver.vserver-name";
     public static final String GENERIC_VNF_IS_CLOSED_LOOP_DISABLED = "generic-vnf.is-closed-loop-disabled";
     public static final String VSERVER_IS_CLOSED_LOOP_DISABLED = "vserver.is-closed-loop-disabled";
+    private static final String PNF_IS_IN_MAINT = "pnf.in-maint";
     public static final String GENERIC_VNF_PROV_STATUS = "generic-vnf.prov-status";
     public static final String VSERVER_PROV_STATUS = "vserver.prov-status";
+    public static final String PNF_ID = "pnf.pnf-id";
+    public static final String PNF_NAME = "pnf.pnf-name";
 
     public static final String AAI_URL = "aai.url";
     public static final String AAI_USERNAME_PROPERTY = "aai.username";
@@ -101,9 +108,8 @@
 
     static {
         VALID_TARGETS = Collections.unmodifiableSet(new HashSet<>(
-                        Arrays.asList(VM_NAME, VNF_NAME, VSERVER_VSERVER_NAME,
-                                        GENERIC_VNF_VNF_ID, GENERIC_VNF_VNF_NAME)
-                        .stream().map(String::toLowerCase).collect(Collectors.toList())));
+                Stream.of(VM_NAME, VNF_NAME, VSERVER_VSERVER_NAME, GENERIC_VNF_VNF_ID, GENERIC_VNF_VNF_NAME, PNF_NAME)
+                        .map(String::toLowerCase).collect(Collectors.toList())));
     }
 
     public final String closedLoopControlName;
@@ -733,13 +739,26 @@
     }
 
     private void validateAaiData(VirtualControlLoopEvent event) throws ControlLoopException {
-        if (event.getAai() == null) {
+        Map<String, String> eventAai = event.getAai();
+        if (eventAai == null) {
             throw new ControlLoopException("AAI is null");
         }
-        if (event.getAai().get(GENERIC_VNF_VNF_ID) == null && event.getAai().get(VSERVER_VSERVER_NAME) == null
-                && event.getAai().get(GENERIC_VNF_VNF_NAME) == null) {
-            throw new ControlLoopException(
-                    "generic-vnf.vnf-id or generic-vnf.vnf-name or vserver.vserver-name information missing");
+        switch (event.getTargetType()) {
+            case VM:
+            case VNF:
+                if (eventAai.get(GENERIC_VNF_VNF_ID) == null && eventAai.get(VSERVER_VSERVER_NAME) == null
+                            && eventAai.get(GENERIC_VNF_VNF_NAME) == null) {
+                    throw new ControlLoopException(
+                            "generic-vnf.vnf-id or generic-vnf.vnf-name or vserver.vserver-name information missing");
+                }
+                return;
+            case PNF:
+                if (eventAai.get(PNF_NAME) == null) {
+                    throw new ControlLoopException("AAI PNF object key pnf-name is missing");
+                }
+                return;
+            default:
+                throw new ControlLoopException("The target type is not supported");
         }
     }
 
@@ -753,14 +772,16 @@
 
         Map<String, String> aai = event.getAai();
 
-        if (aai.containsKey(VSERVER_IS_CLOSED_LOOP_DISABLED) || aai.containsKey(GENERIC_VNF_IS_CLOSED_LOOP_DISABLED)) {
+        if (aai.containsKey(VSERVER_IS_CLOSED_LOOP_DISABLED) || aai.containsKey(GENERIC_VNF_IS_CLOSED_LOOP_DISABLED)
+                    || aai.containsKey(PNF_IS_IN_MAINT)) {
 
             if (isClosedLoopDisabled(event)) {
-                throw new AaiException("is-closed-loop-disabled is set to true on VServer or VNF");
+                throw new AaiException(
+                        "is-closed-loop-disabled is set to true on VServer or VNF or in-maint is set to true for PNF");
             }
 
             if (isProvStatusInactive(event)) {
-                throw new AaiException("prov-status is not ACTIVE on VServer or VNF");
+                throw new AaiException("prov-status is not ACTIVE on VServer or VNF or PNF");
             }
 
             // no need to query, as we already have the data
@@ -854,7 +875,8 @@
     public static boolean isClosedLoopDisabled(VirtualControlLoopEvent event) {
         Map<String, String> aai = event.getAai();
         return (isAaiTrue(aai.get(VSERVER_IS_CLOSED_LOOP_DISABLED))
-                || isAaiTrue(aai.get(GENERIC_VNF_IS_CLOSED_LOOP_DISABLED)));
+                || isAaiTrue(aai.get(GENERIC_VNF_IS_CLOSED_LOOP_DISABLED))
+                || isAaiTrue(aai.get(PNF_IS_IN_MAINT)));
     }
 
     /**
@@ -1091,6 +1113,34 @@
 
     }
 
+    /**
+     * Get the specified pnf data from aai.
+     * @param event the event containing pnf id.
+     * @return pnf key value data.
+     * @throws AaiException if an aai error occurs.
+     */
+    public Map<String, String> getPnf(VirtualControlLoopEvent event) throws AaiException {
+        Map<String, String> aai = event.getAai();
+
+        if (!aai.containsKey(PNF_NAME)) {
+            throw new AaiException("Missing unique identifier for PNF AAI object in the event.");
+        }
+
+        UUID reqId = event.getRequestId();
+        String pnfName = event.getAai().get(PNF_NAME);
+        String aaiHostUrl = PolicyEngineConstants.getManager().getEnvironmentProperty(AAI_URL);
+        String aaiUser = PolicyEngineConstants.getManager().getEnvironmentProperty(AAI_USERNAME_PROPERTY);
+        String aaiPassword = PolicyEngineConstants.getManager().getEnvironmentProperty(AAI_PASS_PROPERTY);
+
+        Map<String, String> pnfParams =
+                new AaiManager(new RestManager()).getPnf(aaiHostUrl, aaiUser, aaiPassword, reqId, pnfName);
+
+        if (pnfParams == null) {
+            throw new AaiException("Aai response is undefined");
+        }
+        return pnfParams;
+    }
+
 
     // the following methods may be overridden by junit tests
 
diff --git a/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManager.java b/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManager.java
index 87e76c3..5702741 100644
--- a/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManager.java
+++ b/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManager.java
@@ -37,6 +37,7 @@
 import javax.persistence.EntityManager;
 import javax.persistence.Persistence;
 
+import org.apache.commons.lang3.StringUtils;
 import org.eclipse.persistence.config.PersistenceUnitProperties;
 import org.onap.aai.domain.yang.GenericVnf;
 import org.onap.aai.domain.yang.ServiceInstance;
@@ -85,6 +86,7 @@
     private static final String GENERIC_VNF_VNF_ID = "generic-vnf.vnf-id";
 
     private static final String AAI_SERVICE_INSTANCE_ID_KEY = "service-instance.service-instance-id";
+    private static final String PNF_NAME = "pnf.pnf-name";
 
     //
     // These properties are not changeable, but accessible
@@ -123,9 +125,13 @@
         this.eventManager = em;
 
         try {
-
-            if (Boolean.valueOf(PolicyEngineConstants.getManager().getEnvironmentProperty(AAI_CUSTOM_QUERY))) {
-                this.aaiCqResponse = this.eventManager.getCqResponse((VirtualControlLoopEvent) onset);
+            if (TargetType.VNF.equals(policy.getTarget().getType())
+                        || TargetType.VFMODULE.equals(policy.getTarget().getType())) {
+                String aaiCqEnvProp =
+                        PolicyEngineConstants.getManager().getEnvironmentProperty(AAI_CUSTOM_QUERY);
+                if (StringUtils.isBlank(aaiCqEnvProp) || Boolean.valueOf(aaiCqEnvProp)) {
+                    this.aaiCqResponse = this.eventManager.getCqResponse((VirtualControlLoopEvent) onset);
+                }
             }
 
             this.targetEntity = getTarget(policy);
@@ -250,7 +256,7 @@
 
         switch (policy.getTarget().getType()) {
             case PNF:
-                throw new ControlLoopException("PNF target is not supported");
+                return getPnfTarget();
             case VM:
             case VNF:
                 return getVfModuleTarget();
@@ -299,6 +305,15 @@
         throw new ControlLoopException("Target does not match target type");
     }
 
+    private String getPnfTarget() throws ControlLoopException {
+        VirtualControlLoopEvent virtualOnsetEvent = (VirtualControlLoopEvent) this.onset;
+        if (!PNF_NAME.equalsIgnoreCase(onset.getTarget())) {
+            throw new ControlLoopException(
+                    "Target in the onset event is either null or does not match target key expected in AAI section.");
+        }
+        return virtualOnsetEvent.getAai().get(PNF_NAME);
+    }
+
     /**
      * Start an operation.
      *
@@ -485,7 +500,8 @@
                 result.put(AAI_SERVICE_INSTANCE_ID_KEY, serviceInstance.getServiceInstanceId());
                 result.put(GENERIC_VNF_VNF_ID, genericVnf.getVnfId());
             }
-
+        } else if (TargetType.PNF.equals(policy.getTarget().getType())) {
+            result = this.eventManager.getPnf((VirtualControlLoopEvent) onset);
         }
 
         return result;
diff --git a/controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManagerTest.java b/controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManagerTest.java
index 8efdb1f..c920290 100644
--- a/controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManagerTest.java
+++ b/controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManagerTest.java
@@ -66,6 +66,7 @@
 import org.onap.policy.controlloop.ControlLoopEventStatus;
 import org.onap.policy.controlloop.ControlLoopException;
 import org.onap.policy.controlloop.ControlLoopNotificationType;
+import org.onap.policy.controlloop.ControlLoopTargetType;
 import org.onap.policy.controlloop.SupportUtil;
 import org.onap.policy.controlloop.VirtualControlLoopEvent;
 import org.onap.policy.controlloop.VirtualControlLoopNotification;
@@ -126,6 +127,7 @@
         PolicyEngineConstants.getManager().setEnvironmentProperty(AAI_USERNAME, "AAI");
         PolicyEngineConstants.getManager().setEnvironmentProperty(AAI_PASS, "AAI");
         PolicyEngineConstants.getManager().setEnvironmentProperty(AAI_URL, "http://localhost:6666");
+        PolicyEngineConstants.getManager().setEnvironmentProperty("aai.customQuery", "false");
     }
 
     @AfterClass
@@ -145,11 +147,12 @@
         onset.setRequestId(UUID.randomUUID());
         onset.setTarget("VM_NAME");
         onset.setClosedLoopAlarmStart(Instant.now());
-        onset.setAai(new HashMap<String, String>());
+        onset.setAai(new HashMap<>());
         onset.getAai().put("cloud-region.identity-url", "foo");
         onset.getAai().put("vserver.selflink", "bar");
         onset.getAai().put(VNF_ID, VNF_UUID);
         onset.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
+        onset.setTargetType(ControlLoopTargetType.VNF);
 
         PolicyEngineConstants.getManager().setEnvironmentProperty(AAI_URL, "http://localhost:6666");
     }
@@ -212,6 +215,7 @@
         event.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
         event.setAai(new HashMap<>());
         event.getAai().put(VNF_NAME, ONSET_ONE);
+        event.setTargetType(ControlLoopTargetType.VNF);
 
         ControlLoopEventManager manager = makeManager(event);
         VirtualControlLoopNotification notification = manager.activate(event);
@@ -236,6 +240,7 @@
         event2.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
         event2.setAai(new HashMap<>());
         event2.getAai().put(VNF_NAME, "onsetTwo");
+        event2.setTargetType(ControlLoopTargetType.VNF);
 
 
         status = manager.onNewEvent(event2);
@@ -440,6 +445,7 @@
         event.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
         event.setAai(new HashMap<>());
         event.getAai().put(VNF_NAME, ONSET_ONE);
+        event.setTargetType(ControlLoopTargetType.VNF);
 
         ControlLoopEventManager manager = makeManager(event);
         manager.setActivated(true);
@@ -459,6 +465,7 @@
         event.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
         event.setAai(new HashMap<>());
         event.getAai().put(VNF_NAME, ONSET_ONE);
+        event.setTargetType(ControlLoopTargetType.VNF);
 
         ControlLoopEventManager manager = makeManager(event);
 
@@ -505,6 +512,7 @@
         event.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
         event.setAai(new HashMap<>());
         event.getAai().put(VNF_NAME, ONSET_ONE);
+        event.setTargetType(ControlLoopTargetType.VNF);
 
         ControlLoopEventManager manager = makeManager(event);
         ControlLoopEventManager manager2 = manager;
@@ -572,6 +580,8 @@
         event.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
         event.setAai(new HashMap<>());
         event.getAai().put(VNF_NAME, ONSET_ONE);
+        event.getAai().put(VSERVER_NAME, "test-vserver");
+        event.setTargetType(ControlLoopTargetType.VNF);
 
         ControlLoopEventManager manager = makeManager(event);
         ControlLoopEventManager manager2 = manager;
@@ -781,6 +791,7 @@
         onsetEvent.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
         onsetEvent.setAai(new HashMap<>());
         onsetEvent.getAai().put(VNF_NAME, ONSET_ONE);
+        onsetEvent.setTargetType(ControlLoopTargetType.VNF);
 
         VirtualControlLoopEvent abatedEvent = new VirtualControlLoopEvent();
         abatedEvent.setClosedLoopControlName(TWO_ONSET_TEST);
@@ -846,6 +857,9 @@
         checkSyntaxEvent.setAai(new HashMap<>());
         assertEquals(NewEventStatus.SYNTAX_ERROR, manager.onNewEvent(checkSyntaxEvent));
 
+        checkSyntaxEvent.setTargetType("");
+        assertEquals(NewEventStatus.SYNTAX_ERROR, manager.onNewEvent(checkSyntaxEvent));
+
         checkSyntaxEvent.setTarget("");
         assertEquals(NewEventStatus.SYNTAX_ERROR, manager.onNewEvent(checkSyntaxEvent));
 
@@ -900,6 +914,7 @@
         onsetEvent.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
         onsetEvent.setAai(new HashMap<>());
         onsetEvent.getAai().put(VNF_NAME, ONSET_ONE);
+        onsetEvent.setTargetType(ControlLoopTargetType.VNF);
 
         ControlLoopEventManager manager = makeManager(onsetEvent);
         assertTrue(0 == manager.getControlLoopTimeout(null));
@@ -926,6 +941,7 @@
         onsetEvent.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
         onsetEvent.setAai(new HashMap<>());
         onsetEvent.getAai().put(VNF_NAME, ONSET_ONE);
+        onsetEvent.setTargetType(ControlLoopTargetType.VNF);
 
         ControlLoopEventManager manager = makeManager(onsetEvent);
 
@@ -951,6 +967,7 @@
         onsetEvent.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
         onsetEvent.setAai(new HashMap<>());
         onsetEvent.getAai().put(VNF_NAME, ONSET_ONE);
+        onsetEvent.setTargetType(ControlLoopTargetType.VNF);
 
         ControlLoopEventManager manager = makeManager(onsetEvent);
 
@@ -972,8 +989,8 @@
 
         ControlLoopEventManager mgr = makeManager(onset);
 
-        assertThatThrownBy(() -> mgr.queryAai(onset)).isInstanceOf(AaiException.class)
-                        .hasMessage("is-closed-loop-disabled is set to true on VServer or VNF");
+        assertThatThrownBy(() -> mgr.queryAai(onset)).isInstanceOf(AaiException.class).hasMessage(
+                "is-closed-loop-disabled is set to true on VServer or VNF or in-maint is set to true for PNF");
         assertNull(mgr.getVnfResponse());
         assertNull(mgr.getVserverResponse());
     }
@@ -986,7 +1003,7 @@
         ControlLoopEventManager mgr = makeManager(onset);
 
         assertThatThrownBy(() -> mgr.queryAai(onset)).isInstanceOf(AaiException.class)
-                        .hasMessage("prov-status is not ACTIVE on VServer or VNF");
+                        .hasMessage("prov-status is not ACTIVE on VServer or VNF or PNF");
         assertNull(mgr.getVnfResponse());
         assertNull(mgr.getVserverResponse());
     }
@@ -1343,6 +1360,8 @@
         event.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
         event.setAai(new HashMap<>());
         event.getAai().put(VNF_ID, ONSET_ONE);
+        event.getAai().put(VSERVER_NAME, "test-vserver");
+        event.setTargetType(ControlLoopTargetType.VNF);
         return event;
     }
 
diff --git a/controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManagerTest.java b/controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManagerTest.java
index 480bc29..b3e2e21 100644
--- a/controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManagerTest.java
+++ b/controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManagerTest.java
@@ -64,6 +64,7 @@
 import org.onap.policy.controlloop.SupportUtil;
 import org.onap.policy.controlloop.VirtualControlLoopEvent;
 import org.onap.policy.controlloop.VirtualControlLoopNotification;
+import org.onap.policy.controlloop.policy.ControlLoop;
 import org.onap.policy.controlloop.policy.ControlLoopPolicy;
 import org.onap.policy.controlloop.policy.Policy;
 import org.onap.policy.controlloop.policy.PolicyResult;
@@ -108,12 +109,15 @@
         onset.setClosedLoopAlarmStart(Instant.now());
         onset.setAai(new HashMap<>());
         onset.getAai().put(VNF_NAME, "testTriggerSource");
+        onset.getAai().put(VSERVER_NAME, "testVserverName");
         onset.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
+        onset.setTargetType(ControlLoopTargetType.VNF);
 
         /* Set environment properties */
         PolicyEngineConstants.getManager().setEnvironmentProperty("aai.url", "http://localhost:6666");
         PolicyEngineConstants.getManager().setEnvironmentProperty("aai.username", "AAI");
         PolicyEngineConstants.getManager().setEnvironmentProperty("aai.password", "AAI");
+        PolicyEngineConstants.getManager().setEnvironmentProperty("aai.customQuery", "false");
     }
 
     private static EntityManagerFactory emf;
@@ -390,10 +394,12 @@
         onsetEvent.setClosedLoopControlName(TWO_ONSET_TEST);
         onsetEvent.setRequestId(requestId);
         onsetEvent.setTarget(VNF_ID);
+        onsetEvent.setTargetType(ControlLoopTargetType.VNF);
         onsetEvent.setClosedLoopAlarmStart(Instant.now());
         onsetEvent.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
         onsetEvent.setAai(new HashMap<>());
         onsetEvent.getAai().put(VNF_NAME, ONSET_ONE);
+        onsetEvent.getAai().put(VSERVER_NAME, "testVserverName");
 
         ControlLoopEventManager manager =
                 new ControlLoopEventManager(onsetEvent.getClosedLoopControlName(), onsetEvent.getRequestId());
@@ -428,7 +434,8 @@
         policy.setTarget(savedTarget);
 
         policy.getTarget().setType(TargetType.PNF);
-        assertThatThrownBy(() -> clom.getTarget(policy)).hasMessage("PNF target is not supported");
+        assertThatThrownBy(() -> clom.getTarget(policy)).hasMessage(
+                "Target in the onset event is either null or does not match target key expected in AAI section.");
 
         onsetEvent.setTarget("Oz");
         onsetEvent.getAai().remove(VNF_NAME);
@@ -495,10 +502,12 @@
         onsetEvent.setClosedLoopControlName(TWO_ONSET_TEST);
         onsetEvent.setRequestId(requestId);
         onsetEvent.setTarget(VNF_ID);
+        onsetEvent.setTargetType(ControlLoopTargetType.VNF);
         onsetEvent.setClosedLoopAlarmStart(Instant.now());
         onsetEvent.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
         onsetEvent.setAai(new HashMap<>());
         onsetEvent.getAai().put(VNF_NAME, ONSET_ONE);
+        onsetEvent.getAai().put(VSERVER_NAME, "testVserverName");
 
         ControlLoopEventManager manager =
                 new ControlLoopEventManager(onsetEvent.getClosedLoopControlName(), onsetEvent.getRequestId());
@@ -543,10 +552,12 @@
         onsetEvent.setClosedLoopControlName(TWO_ONSET_TEST);
         onsetEvent.setRequestId(requestId);
         onsetEvent.setTarget(VNF_ID);
+        onsetEvent.setTargetType(ControlLoopTargetType.VNF);
         onsetEvent.setClosedLoopAlarmStart(Instant.now());
         onsetEvent.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
         onsetEvent.setAai(new HashMap<>());
         onsetEvent.getAai().put(VNF_NAME, ONSET_ONE);
+        onsetEvent.getAai().put(VSERVER_NAME, "testVserverName");
 
         ControlLoopEventManager manager =
                 new ControlLoopEventManager(onsetEvent.getClosedLoopControlName(), onsetEvent.getRequestId());
@@ -631,10 +642,12 @@
         onsetEvent.setClosedLoopControlName(TWO_ONSET_TEST);
         onsetEvent.setRequestId(requestId);
         onsetEvent.setTarget(VNF_ID);
+        onsetEvent.setTargetType(ControlLoopTargetType.VNF);
         onsetEvent.setClosedLoopAlarmStart(Instant.now());
         onsetEvent.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
         onsetEvent.setAai(new HashMap<>());
         onsetEvent.getAai().put(VNF_NAME, ONSET_ONE);
+        onsetEvent.getAai().put(VSERVER_NAME, "testVserverName");
 
         ControlLoopEventManager manager =
                 new ControlLoopEventManager(onsetEvent.getClosedLoopControlName(), onsetEvent.getRequestId());
@@ -726,10 +739,12 @@
         onsetEvent.setClosedLoopControlName(TWO_ONSET_TEST);
         onsetEvent.setRequestId(requestId);
         onsetEvent.setTarget(VNF_ID);
+        onsetEvent.setTargetType(ControlLoopTargetType.VNF);
         onsetEvent.setClosedLoopAlarmStart(Instant.now());
         onsetEvent.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
         onsetEvent.setAai(new HashMap<>());
         onsetEvent.getAai().put(VNF_NAME, ONSET_ONE);
+        onsetEvent.getAai().put(VSERVER_NAME, "testVserverName");
 
         ControlLoopEventManager manager =
                 new ControlLoopEventManager(onsetEvent.getClosedLoopControlName(), onsetEvent.getRequestId());
@@ -772,6 +787,7 @@
         event.setClosedLoopControlName(TWO_ONSET_TEST);
         event.setRequestId(requestId);
         event.setTarget(VNF_ID);
+        event.setTargetType(ControlLoopTargetType.VNF);
         event.setClosedLoopAlarmStart(Instant.now());
         event.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
         event.setAai(new HashMap<>());
@@ -801,7 +817,7 @@
     @Test
     public void testCommitAbatement() throws Exception {
 
-        String yamlString = null;
+        String yamlString;
         try (InputStream is = new FileInputStream(new File(TEST_YAML))) {
             yamlString = IOUtils.toString(is, StandardCharsets.UTF_8);
         }
@@ -811,10 +827,12 @@
         onsetEvent.setClosedLoopControlName(TWO_ONSET_TEST);
         onsetEvent.setRequestId(requestId);
         onsetEvent.setTarget(VNF_ID);
+        onsetEvent.setTargetType(ControlLoopTargetType.VNF);
         onsetEvent.setClosedLoopAlarmStart(Instant.now());
         onsetEvent.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
         onsetEvent.setAai(new HashMap<>());
         onsetEvent.getAai().put(VNF_NAME, ONSET_ONE);
+        onsetEvent.getAai().put(VSERVER_NAME, "testVserverName");
 
         ControlLoopEventManager manager =
                 new ControlLoopEventManager(onsetEvent.getClosedLoopControlName(), onsetEvent.getRequestId());
@@ -850,10 +868,12 @@
         onsetEvent.setClosedLoopControlName(TWO_ONSET_TEST);
         onsetEvent.setRequestId(requestId);
         onsetEvent.setTarget(VNF_ID);
+        onsetEvent.setTargetType(ControlLoopTargetType.VNF);
         onsetEvent.setClosedLoopAlarmStart(Instant.now());
         onsetEvent.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
         onsetEvent.setAai(new HashMap<>());
         onsetEvent.getAai().put(VNF_NAME, ONSET_ONE);
+        onsetEvent.getAai().put(VSERVER_NAME, "testVserverName");
 
         ControlLoopEventManager manager =
                 new ControlLoopEventManager(onsetEvent.getClosedLoopControlName(), onsetEvent.getRequestId());
diff --git a/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/ControlLoopFailureTest.java b/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/ControlLoopFailureTest.java
index 1647fa0..e340914 100644
--- a/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/ControlLoopFailureTest.java
+++ b/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/ControlLoopFailureTest.java
@@ -39,6 +39,7 @@
 import org.onap.policy.common.endpoints.event.comm.TopicSink;
 import org.onap.policy.controlloop.ControlLoopEventStatus;
 import org.onap.policy.controlloop.ControlLoopNotificationType;
+import org.onap.policy.controlloop.ControlLoopTargetType;
 import org.onap.policy.controlloop.VirtualControlLoopEvent;
 import org.onap.policy.controlloop.VirtualControlLoopNotification;
 import org.onap.policy.controlloop.policy.ControlLoopPolicy;
@@ -267,6 +268,7 @@
         event.setClosedLoopControlName(policy.getControlLoop().getControlLoopName());
         event.setRequestId(requestId);
         event.setTarget("generic-vnf.vnf-id");
+        event.setTargetType(ControlLoopTargetType.VNF);
         event.setClosedLoopAlarmStart(Instant.now());
         event.setAai(new HashMap<>());
         event.getAai().put("generic-vnf.vnf-id", target);
diff --git a/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/VdnsControlLoopCqTest.java b/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/VdnsControlLoopCqTest.java
index e69e507..1a5bf39 100644
--- a/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/VdnsControlLoopCqTest.java
+++ b/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/VdnsControlLoopCqTest.java
@@ -35,6 +35,7 @@
 import org.onap.policy.common.endpoints.event.comm.TopicSink;
 import org.onap.policy.controlloop.ControlLoopEventStatus;
 import org.onap.policy.controlloop.ControlLoopNotificationType;
+import org.onap.policy.controlloop.ControlLoopTargetType;
 import org.onap.policy.controlloop.VirtualControlLoopEvent;
 import org.onap.policy.controlloop.VirtualControlLoopNotification;
 import org.onap.policy.controlloop.policy.ControlLoopPolicy;
@@ -231,6 +232,7 @@
         event.setClosedLoopControlName(policy.getControlLoop().getControlLoopName());
         event.setRequestId(requestId);
         event.setTarget("vserver.vserver-name");
+        event.setTargetType(ControlLoopTargetType.VNF);
         event.setClosedLoopAlarmStart(Instant.now());
         event.setAai(new HashMap<>());
         event.getAai().put("vserver.vserver-name", "Ete_vFWCLvFWSNK_7ba1fbde_0");
@@ -246,6 +248,7 @@
         event.setClosedLoopControlName(policy.getControlLoop().getControlLoopName());
         event.setRequestId(requestId);
         event.setTarget("vserver.vserver-name");
+        event.setTargetType(ControlLoopTargetType.VNF);
         event.setClosedLoopAlarmStart(Instant.now());
         event.setAai(new HashMap<>());
         event.getAai().put("vserver.vserver-name", vserverName);
diff --git a/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/VdnsControlLoopTest.java b/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/VdnsControlLoopTest.java
index d1453f7..3c658c1 100644
--- a/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/VdnsControlLoopTest.java
+++ b/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/VdnsControlLoopTest.java
@@ -35,6 +35,7 @@
 import org.onap.policy.common.endpoints.event.comm.TopicSink;
 import org.onap.policy.controlloop.ControlLoopEventStatus;
 import org.onap.policy.controlloop.ControlLoopNotificationType;
+import org.onap.policy.controlloop.ControlLoopTargetType;
 import org.onap.policy.controlloop.VirtualControlLoopEvent;
 import org.onap.policy.controlloop.VirtualControlLoopNotification;
 import org.onap.policy.controlloop.policy.ControlLoopPolicy;
@@ -263,6 +264,7 @@
         event.setClosedLoopControlName(policy.getControlLoop().getControlLoopName());
         event.setRequestId(requestId);
         event.setTarget("vserver.vserver-name");
+        event.setTargetType(ControlLoopTargetType.VNF);
         event.setClosedLoopAlarmStart(Instant.now());
         event.setAai(new HashMap<>());
         event.getAai().put("vserver.vserver-name", "dfw1lb01lb01");
@@ -278,6 +280,7 @@
         event.setClosedLoopControlName(policy.getControlLoop().getControlLoopName());
         event.setRequestId(requestId);
         event.setTarget("vserver.vserver-name");
+        event.setTargetType(ControlLoopTargetType.VNF);
         event.setClosedLoopAlarmStart(Instant.now());
         event.setAai(new HashMap<>());
         event.getAai().put("vserver.vserver-name", vserverName);
diff --git a/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/VfwControlLoopCdsTest.java b/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/VfwControlLoopCdsTest.java
index 435faf2..a86f97d 100644
--- a/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/VfwControlLoopCdsTest.java
+++ b/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/VfwControlLoopCdsTest.java
@@ -30,6 +30,7 @@
 import java.io.IOException;
 import java.time.Instant;
 import java.util.HashMap;
+import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.atomic.AtomicReference;
 
@@ -48,6 +49,7 @@
 import org.onap.policy.common.endpoints.event.comm.TopicSink;
 import org.onap.policy.controlloop.ControlLoopEventStatus;
 import org.onap.policy.controlloop.ControlLoopNotificationType;
+import org.onap.policy.controlloop.ControlLoopTargetType;
 import org.onap.policy.controlloop.VirtualControlLoopEvent;
 import org.onap.policy.controlloop.VirtualControlLoopNotification;
 import org.onap.policy.controlloop.policy.ControlLoopPolicy;
@@ -254,12 +256,16 @@
         VirtualControlLoopEvent event = new VirtualControlLoopEvent();
         event.setClosedLoopControlName(policy.getControlLoop().getControlLoopName());
         event.setRequestId(requestId);
+        event.setTargetType(ControlLoopTargetType.VNF);
         event.setTarget("generic-vnf.vnf-name");
         event.setClosedLoopAlarmStart(Instant.now());
         event.setAai(new HashMap<>());
         event.getAai().put("generic-vnf.vnf-name", "testGenericVnfID");
         event.getAai().put("vserver.vserver-name", "OzVServer");
         event.setClosedLoopEventStatus(status);
+        Map<String, String> map = new HashMap<>();
+        map.put("my-key", "my-value");
+        event.setAdditionalEventParams(map);
         kieSession.insert(event);
     }
 
diff --git a/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/VfwControlLoopTest.java b/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/VfwControlLoopTest.java
index 221ef5e..c326da1 100644
--- a/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/VfwControlLoopTest.java
+++ b/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/VfwControlLoopTest.java
@@ -38,6 +38,7 @@
 import org.onap.policy.common.endpoints.event.comm.TopicSink;
 import org.onap.policy.controlloop.ControlLoopEventStatus;
 import org.onap.policy.controlloop.ControlLoopNotificationType;
+import org.onap.policy.controlloop.ControlLoopTargetType;
 import org.onap.policy.controlloop.VirtualControlLoopEvent;
 import org.onap.policy.controlloop.VirtualControlLoopNotification;
 import org.onap.policy.controlloop.policy.ControlLoopPolicy;
@@ -280,6 +281,7 @@
         event.setClosedLoopControlName(policy.getControlLoop().getControlLoopName());
         event.setRequestId(requestId);
         event.setTarget("generic-vnf.vnf-name");
+        event.setTargetType(ControlLoopTargetType.VNF);
         event.setClosedLoopAlarmStart(Instant.now());
         event.setAai(new HashMap<>());
         event.getAai().put("generic-vnf.vnf-name", "testGenericVnfID");
@@ -300,6 +302,7 @@
         event.setClosedLoopControlName(policy.getControlLoop().getControlLoopName());
         event.setRequestId(requestId);
         event.setTarget("generic-vnf.vnf-name");
+        event.setTargetType(ControlLoopTargetType.VNF);
         event.setClosedLoopAlarmStart(Instant.now());
         event.setAai(new HashMap<>());
         event.getAai().put("generic-vnf.vnf-name", vnfId);