/*- * ============LICENSE_START======================================================= * demo * ================================================================================ * Copyright (C) 2017-2020 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. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============LICENSE_END========================================================= */ package org.onap.policy.template.demo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.time.Instant; import java.util.HashMap; import java.util.UUID; import org.junit.BeforeClass; import org.junit.FixMethodOrder; import org.junit.Test; import org.junit.runners.MethodSorters; import org.onap.policy.appclcm.AppcLcmBody; import org.onap.policy.appclcm.AppcLcmDmaapWrapper; import org.onap.policy.appclcm.AppcLcmInput; import org.onap.policy.appclcm.AppcLcmOutput; import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure; import org.onap.policy.common.endpoints.event.comm.TopicListener; 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; @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class VcpeControlLoopTest extends ControlLoopBase implements TopicListener { /** * Setup the simulator. */ @BeforeClass public static void setUpBeforeClass() { ControlLoopBase.setUpBeforeClass( "../archetype-cl-amsterdam/src/main/resources/archetype-resources" + "/src/main/resources/__closedLoopControlName__.drl", "src/test/resources/yaml/policy_ControlLoop_vCPE.yaml", "service=ServiceDemo;resource=Res1Demo;type=operational", "CL_vCPE", "org.onap.closed_loop.ServiceDemo:VNFS:1.0.0"); } @Test public void testASuccess() { /* * 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 */ sendEvent(pair.first, requestId, ControlLoopEventStatus.ONSET, "OzVServer", true); kieSession.fireUntilHalt(); // allow object clean-up kieSession.fireAllRules(); /* * The only fact in memory should be Params */ assertEquals(1, kieSession.getFactCount()); /* * Print what's left in memory */ dumpFacts(kieSession); } @Test public void testBAaiGetFail() { /* * 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 */ sendEvent(pair.first, requestId, ControlLoopEventStatus.ONSET, "getFail", false); kieSession.fireUntilHalt(); // allow object clean-up kieSession.fireAllRules(); /* * The only fact in memory should be Params */ assertEquals(1, kieSession.getFactCount()); /* * Print what's left in memory */ dumpFacts(kieSession); } /* * (non-Javadoc) * * @see org.onap.policy.drools.PolicyEngineListener#newEventNotification(java.lang.String) */ @Override public void onTopicEvent(CommInfrastructure commType, String topic, String event) { /* * Pull the object that was sent out to DMAAP and make sure it is a ControlLoopNoticiation * of type active */ Object obj = null; if ("POLICY-CL-MGT".equals(topic)) { obj = org.onap.policy.controlloop.util.Serialization.gsonJunit.fromJson(event, org.onap.policy.controlloop.VirtualControlLoopNotification.class); } else if ("APPC-LCM-READ".equals(topic)) { obj = org.onap.policy.appclcm.util.Serialization.gsonJunit.fromJson(event, org.onap.policy.appclcm.AppcLcmDmaapWrapper.class); } assertNotNull(obj); if (obj instanceof VirtualControlLoopNotification) { VirtualControlLoopNotification notification = (VirtualControlLoopNotification) obj; String policyName = notification.getPolicyName(); if (policyName.endsWith("EVENT")) { logger.debug("Rule Fired: " + notification.getPolicyName()); assertTrue( ControlLoopNotificationType.ACTIVE.equals(notification.getNotification())); } else if (policyName.endsWith("GUARD_NOT_YET_QUERIED")) { logger.debug("Rule Fired: " + notification.getPolicyName()); assertTrue( ControlLoopNotificationType.OPERATION.equals(notification.getNotification())); assertNotNull(notification.getMessage()); assertTrue(notification.getMessage().startsWith("Sending guard query")); } else if (policyName.endsWith("GUARD.RESPONSE")) { logger.debug("Rule Fired: " + notification.getPolicyName()); assertTrue( ControlLoopNotificationType.OPERATION.equals(notification.getNotification())); assertNotNull(notification.getMessage()); assertTrue(notification.getMessage().toLowerCase().endsWith("permit")); } else if (policyName.endsWith("GUARD_PERMITTED")) { logger.debug("Rule Fired: " + notification.getPolicyName()); assertTrue( ControlLoopNotificationType.OPERATION.equals(notification.getNotification())); assertNotNull(notification.getMessage()); assertTrue(notification.getMessage().startsWith("actor=APPC")); } else if (policyName.endsWith("OPERATION.TIMEOUT")) { logger.debug("Rule Fired: " + notification.getPolicyName()); kieSession.halt(); logger.debug("The operation timed out"); fail("Operation Timed Out"); } else if (policyName.endsWith("APPC.LCM.RESPONSE")) { logger.debug("Rule Fired: " + notification.getPolicyName()); assertTrue(ControlLoopNotificationType.OPERATION_SUCCESS .equals(notification.getNotification())); assertNotNull(notification.getMessage()); assertTrue(notification.getMessage().startsWith("actor=APPC")); sendEvent(pair.first, requestId, ControlLoopEventStatus.ABATED); } else if (policyName.endsWith("EVENT.MANAGER")) { logger.debug("Rule Fired: " + notification.getPolicyName()); if ("getFail".equals(notification.getAai().get("generic-vnf.vnf-name"))) { assertEquals(ControlLoopNotificationType.FINAL_FAILURE, notification.getNotification()); kieSession.halt(); } else { assertEquals(ControlLoopNotificationType.FINAL_SUCCESS, notification.getNotification()); kieSession.halt(); } } else if (policyName.endsWith("EVENT.MANAGER.TIMEOUT")) { logger.debug("Rule Fired: " + notification.getPolicyName()); kieSession.halt(); logger.debug("The control loop timed out"); fail("Control Loop Timed Out"); } } else if (obj instanceof AppcLcmDmaapWrapper) { /* * The request should be of type LcmRequestWrapper and the subrequestid should be 1 */ AppcLcmDmaapWrapper dmaapRequest = (AppcLcmDmaapWrapper) obj; AppcLcmInput appcRequest = dmaapRequest.getBody().getInput(); assertTrue(appcRequest.getCommonHeader().getSubRequestId().equals("1")); assertNotNull(appcRequest.getActionIdentifiers().get("vnf-id")); logger.debug("\n============ APPC received the request!!! ===========\n"); /* * Simulate a success response from APPC and insert the response into the working memory */ AppcLcmDmaapWrapper dmaapResponse = new AppcLcmDmaapWrapper(); AppcLcmOutput appcResponse = new AppcLcmOutput(appcRequest); appcResponse.getStatus().setCode(400); appcResponse.getStatus().setMessage("AppC success"); dmaapResponse.setBody(new AppcLcmBody()); dmaapResponse.getBody().setOutput(appcResponse); kieSession.insert(dmaapResponse); } } /** * This method is used to simulate event messages from DCAE that start the control loop (onset * message) or end the control loop (abatement message). * * @param policy the controlLoopName comes from the policy * @param requestId the requestId for this event * @param status could be onset or abated */ protected void sendEvent(ControlLoopPolicy policy, UUID requestId, ControlLoopEventStatus status) { VirtualControlLoopEvent event = new VirtualControlLoopEvent(); event.setClosedLoopControlName(policy.getControlLoop().getControlLoopName()); event.setRequestId(requestId); event.setTarget("generic-vnf.vnf-name"); event.setClosedLoopAlarmStart(Instant.now()); event.setAai(new HashMap<>()); event.getAai().put("generic-vnf.vnf-name", "testGenericVnfName"); event.setClosedLoopEventStatus(status); kieSession.insert(event); } protected void sendEvent(ControlLoopPolicy policy, UUID requestId, ControlLoopEventStatus status, String vnfName, boolean isEnriched) { VirtualControlLoopEvent event = new VirtualControlLoopEvent(); 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", vnfName); event.getAai().put("vserver.vserver-name", vnfName); if (isEnriched) { event.getAai().put("generic-vnf.in-maint", "false"); event.getAai().put("generic-vnf.is-closed-loop-disabled", "false"); event.getAai().put("generic-vnf.orchestration-status", "Created"); event.getAai().put("generic-vnf.prov-status", "ACTIVE"); event.getAai().put("generic-vnf.resource-version", "1"); event.getAai().put("generic-vnf.service-id", "e8cb8968-5411-478b-906a-f28747de72cd"); event.getAai().put("generic-vnf.vnf-id", "63b31229-9a3a-444f-9159-04ce2dca3be9"); event.getAai().put("generic-vnf.vnf-type", "vCPEInfraService10/vCPEInfraService10 0"); } event.setClosedLoopEventStatus(status); kieSession.insert(event); } }