2  * ============LICENSE_START=======================================================
 
   3  * AppcServiceProviderTest
 
   4  * ================================================================================
 
   5  * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
 
   6  * ================================================================================
 
   7  * Licensed under the Apache License, Version 2.0 (the "License");
 
   8  * you may not use this file except in compliance with the License.
 
   9  * You may obtain a copy of the License at
 
  11  *      http://www.apache.org/licenses/LICENSE-2.0
 
  13  * Unless required by applicable law or agreed to in writing, software
 
  14  * distributed under the License is distributed on an "AS IS" BASIS,
 
  15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  16  * See the License for the specific language governing permissions and
 
  17  * limitations under the License.
 
  18  * ============LICENSE_END=========================================================
 
  21 package org.onap.policy.controlloop.actor.appclcm;
 
  23 import static org.junit.Assert.assertEquals;
 
  24 import static org.junit.Assert.assertNotNull;
 
  25 import static org.junit.Assert.fail;
 
  27 import java.time.Instant;
 
  28 import java.util.AbstractMap;
 
  29 import java.util.HashMap;
 
  30 import java.util.UUID;
 
  32 import org.junit.AfterClass;
 
  33 import org.junit.BeforeClass;
 
  34 import org.junit.Test;
 
  35 import org.onap.policy.aai.util.AAIException;
 
  36 import org.onap.policy.appclcm.LCMCommonHeader;
 
  37 import org.onap.policy.appclcm.LCMRequest;
 
  38 import org.onap.policy.appclcm.LCMRequestWrapper;
 
  39 import org.onap.policy.appclcm.LCMResponse;
 
  40 import org.onap.policy.appclcm.LCMResponseWrapper;
 
  41 import org.onap.policy.controlloop.ControlLoopEventStatus;
 
  42 import org.onap.policy.controlloop.ControlLoopOperation;
 
  43 import org.onap.policy.controlloop.ControlLoopTargetType;
 
  44 import org.onap.policy.controlloop.VirtualControlLoopEvent;
 
  45 import org.onap.policy.controlloop.policy.Policy;
 
  46 import org.onap.policy.controlloop.policy.PolicyResult;
 
  47 import org.onap.policy.controlloop.policy.Target;
 
  48 import org.onap.policy.controlloop.policy.TargetType;
 
  49 import org.onap.policy.drools.http.server.HttpServletServer;
 
  50 import org.onap.policy.drools.system.PolicyEngine;
 
  51 import org.onap.policy.simulators.Util;
 
  52 import org.slf4j.Logger;
 
  53 import org.slf4j.LoggerFactory;
 
  55 public class AppcLcmServiceProviderTest {
 
  57     private static final Logger logger = LoggerFactory.getLogger(AppcLcmServiceProviderTest.class);
 
  59     private static VirtualControlLoopEvent onsetEvent;
 
  60     private static ControlLoopOperation operation;
 
  61     private static Policy policy;
 
  62     private static LCMRequestWrapper dmaapRequest;
 
  63     private static LCMResponseWrapper dmaapResponse;
 
  67          * Construct an onset with an AAI subtag containing generic-vnf.vnf-id and a target type of
 
  70         onsetEvent = new VirtualControlLoopEvent();
 
  71         onsetEvent.setClosedLoopControlName("closedLoopControlName-Test");
 
  72         onsetEvent.setRequestID(UUID.randomUUID());
 
  73         onsetEvent.setClosedLoopEventClient("tca.instance00001");
 
  74         onsetEvent.setTargetType(ControlLoopTargetType.VM);
 
  75         onsetEvent.setTarget("generic-vnf.vnf-name");
 
  76         onsetEvent.setFrom("DCAE");
 
  77         onsetEvent.setClosedLoopAlarmStart(Instant.now());
 
  78         onsetEvent.setAAI(new HashMap<>());
 
  79         onsetEvent.getAAI().put("generic-vnf.vnf-name", "fw0001vm001fw001");
 
  80         onsetEvent.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
 
  82         /* Construct an operation with an APPC actor and restart operation. */
 
  83         operation = new ControlLoopOperation();
 
  84         operation.setActor("APPC");
 
  85         operation.setOperation("Restart");
 
  86         operation.setTarget("VM");
 
  87         operation.setEnd(Instant.now());
 
  88         operation.setSubRequestId("1");
 
  90         /* Construct a policy specifying to restart vm. */
 
  91         policy = new Policy();
 
  92         policy.setName("Restart the VM");
 
  93         policy.setDescription("Upon getting the trigger event, restart the VM");
 
  94         policy.setActor("APPC");
 
  95         policy.setTarget(new Target(TargetType.VNF));
 
  96         policy.setRecipe("Restart");
 
  97         policy.setPayload(null);
 
  99         policy.setTimeout(300);
 
 101         /* A sample DMAAP request wrapper. */
 
 102         dmaapRequest = new LCMRequestWrapper();
 
 103         dmaapRequest.setCorrelationId(onsetEvent.getRequestID().toString() + "-" + "1");
 
 104         dmaapRequest.setRpcName(policy.getRecipe().toLowerCase());
 
 105         dmaapRequest.setType("request");
 
 107         /* A sample DMAAP response wrapper */
 
 108         dmaapResponse = new LCMResponseWrapper();
 
 109         dmaapResponse.setCorrelationId(onsetEvent.getRequestID().toString() + "-" + "1");
 
 110         dmaapResponse.setRpcName(policy.getRecipe().toLowerCase());
 
 111         dmaapResponse.setType("response");
 
 113         /* Set environment properties */
 
 114         PolicyEngine.manager.setEnvironmentProperty("aai.url", "http://localhost:6666");
 
 115         PolicyEngine.manager.setEnvironmentProperty("aai.username", "AAI");
 
 116         PolicyEngine.manager.setEnvironmentProperty("aai.password", "AAI");
 
 118         /* A sample APPC LCM request. */
 
 119         LCMRequest appcRequest = new LCMRequest();
 
 121         /* The following code constructs a sample APPC LCM Request */
 
 122         appcRequest.setAction("restart");
 
 124         HashMap<String, String> actionIdentifiers = new HashMap<>();
 
 125         actionIdentifiers.put("vnf-id", "trial-vnf-003");
 
 127         appcRequest.setActionIdentifiers(actionIdentifiers);
 
 129         LCMCommonHeader commonHeader = new LCMCommonHeader();
 
 130         commonHeader.setRequestId(onsetEvent.getRequestID());
 
 131         commonHeader.setSubRequestId("1");
 
 132         commonHeader.setOriginatorId(onsetEvent.getRequestID().toString());
 
 134         appcRequest.setCommonHeader(commonHeader);
 
 136         appcRequest.setPayload(null);
 
 138         dmaapRequest.setBody(appcRequest);
 
 140         /* The following code constructs a sample APPC LCM Response */
 
 141         LCMResponse appcResponse = new LCMResponse(appcRequest);
 
 142         appcResponse.getStatus().setCode(400);
 
 143         appcResponse.getStatus().setMessage("Restart Successful");
 
 145         dmaapResponse.setBody(appcResponse);
 
 149      * Set up before test class.
 
 152     public static void setUpSimulator() {
 
 155         } catch (Exception e) {
 
 156             fail(e.getMessage());
 
 161      * Tear down after test class.
 
 164     public static void tearDownSimulator() {
 
 165         HttpServletServer.factory.destroy();
 
 169      * A test to construct an APPC LCM restart request.
 
 172     public void constructRestartRequestTest() {
 
 174         LCMRequestWrapper dmaapRequest =
 
 175                 AppcLcmActorServiceProvider.constructRequest(onsetEvent, operation, policy, "vnf01");
 
 177         /* The service provider must return a non null DMAAP request wrapper */
 
 178         assertNotNull(dmaapRequest);
 
 180         /* The DMAAP wrapper's type field must be request */
 
 181         assertEquals("request", dmaapRequest.getType());
 
 183         /* The DMAAP wrapper's body field cannot be null */
 
 184         assertNotNull(dmaapRequest.getBody());
 
 186         LCMRequest appcRequest = dmaapRequest.getBody();
 
 188         /* A common header is required and cannot be null */
 
 189         assertNotNull(appcRequest.getCommonHeader());
 
 190         assertEquals(appcRequest.getCommonHeader().getRequestId(), onsetEvent.getRequestID());
 
 192         /* An action is required and cannot be null */
 
 193         assertNotNull(appcRequest.getAction());
 
 194         assertEquals("Restart", appcRequest.getAction());
 
 196         /* Action Identifiers are required and cannot be null */
 
 197         assertNotNull(appcRequest.getActionIdentifiers());
 
 198         assertNotNull(appcRequest.getActionIdentifiers().get("vnf-id"));
 
 199         assertEquals("vnf01", appcRequest.getActionIdentifiers().get("vnf-id"));
 
 201         logger.debug("APPC Request: \n" + appcRequest.toString());
 
 205      * A test to process a successful APPC restart response.
 
 208     public void processRestartResponseSuccessTest() {
 
 209         AbstractMap.SimpleEntry<PolicyResult, String> result =
 
 210                 AppcLcmActorServiceProvider.processResponse(dmaapResponse);
 
 211         assertEquals(PolicyResult.SUCCESS, result.getKey());
 
 212         assertEquals("Restart Successful", result.getValue());
 
 216      * A test to map APPC response results to corresponding Policy results.
 
 219     public void appcToPolicyResultTest() {
 
 221         AbstractMap.SimpleEntry<PolicyResult, String> result;
 
 223         /* If APPC accepts, PolicyResult is null */
 
 224         dmaapResponse.getBody().getStatus().setCode(100);
 
 225         dmaapResponse.getBody().getStatus().setMessage("ACCEPTED");
 
 226         result = AppcLcmActorServiceProvider.processResponse(dmaapResponse);
 
 227         assertEquals(null, result.getKey());
 
 229         /* If APPC is successful, PolicyResult is success */
 
 230         dmaapResponse.getBody().getStatus().setCode(400);
 
 231         dmaapResponse.getBody().getStatus().setMessage("SUCCESS");
 
 232         result = AppcLcmActorServiceProvider.processResponse(dmaapResponse);
 
 233         assertEquals(PolicyResult.SUCCESS, result.getKey());
 
 235         /* If APPC returns an error, PolicyResult is failure exception */
 
 236         dmaapResponse.getBody().getStatus().setCode(200);
 
 237         dmaapResponse.getBody().getStatus().setMessage("ERROR");
 
 238         result = AppcLcmActorServiceProvider.processResponse(dmaapResponse);
 
 239         assertEquals(PolicyResult.FAILURE_EXCEPTION, result.getKey());
 
 241         /* If APPC rejects, PolicyResult is failure exception */
 
 242         dmaapResponse.getBody().getStatus().setCode(300);
 
 243         dmaapResponse.getBody().getStatus().setMessage("REJECT");
 
 244         result = AppcLcmActorServiceProvider.processResponse(dmaapResponse);
 
 245         assertEquals(PolicyResult.FAILURE_EXCEPTION, result.getKey());
 
 247         /* Test multiple reject codes */
 
 248         dmaapResponse.getBody().getStatus().setCode(306);
 
 249         dmaapResponse.getBody().getStatus().setMessage("REJECT");
 
 250         result = AppcLcmActorServiceProvider.processResponse(dmaapResponse);
 
 251         assertEquals(PolicyResult.FAILURE_EXCEPTION, result.getKey());
 
 253         dmaapResponse.getBody().getStatus().setCode(313);
 
 254         dmaapResponse.getBody().getStatus().setMessage("REJECT");
 
 255         result = AppcLcmActorServiceProvider.processResponse(dmaapResponse);
 
 256         assertEquals(PolicyResult.FAILURE_EXCEPTION, result.getKey());
 
 258         /* If APPC returns failure, PolicyResult is failure */
 
 259         dmaapResponse.getBody().getStatus().setCode(401);
 
 260         dmaapResponse.getBody().getStatus().setMessage("FAILURE");
 
 261         result = AppcLcmActorServiceProvider.processResponse(dmaapResponse);
 
 262         assertEquals(PolicyResult.FAILURE, result.getKey());
 
 264         /* Test multiple failure codes */
 
 265         dmaapResponse.getBody().getStatus().setCode(406);
 
 266         dmaapResponse.getBody().getStatus().setMessage("FAILURE");
 
 267         result = AppcLcmActorServiceProvider.processResponse(dmaapResponse);
 
 268         assertEquals(PolicyResult.FAILURE, result.getKey());
 
 270         dmaapResponse.getBody().getStatus().setCode(450);
 
 271         dmaapResponse.getBody().getStatus().setMessage("FAILURE");
 
 272         result = AppcLcmActorServiceProvider.processResponse(dmaapResponse);
 
 273         assertEquals(PolicyResult.FAILURE, result.getKey());
 
 275         /* If APPC returns partial success, PolicyResult is failure exception */
 
 276         dmaapResponse.getBody().getStatus().setCode(500);
 
 277         dmaapResponse.getBody().getStatus().setMessage("PARTIAL SUCCESS");
 
 278         result = AppcLcmActorServiceProvider.processResponse(dmaapResponse);
 
 279         assertEquals(PolicyResult.FAILURE_EXCEPTION, result.getKey());
 
 281         /* If APPC returns partial failure, PolicyResult is failure exception */
 
 282         dmaapResponse.getBody().getStatus().setCode(501);
 
 283         dmaapResponse.getBody().getStatus().setMessage("PARTIAL FAILURE");
 
 284         result = AppcLcmActorServiceProvider.processResponse(dmaapResponse);
 
 285         assertEquals(PolicyResult.FAILURE_EXCEPTION, result.getKey());
 
 287         /* Test multiple partial failure codes */
 
 288         dmaapResponse.getBody().getStatus().setCode(599);
 
 289         dmaapResponse.getBody().getStatus().setMessage("PARTIAL FAILURE");
 
 290         result = AppcLcmActorServiceProvider.processResponse(dmaapResponse);
 
 291         assertEquals(PolicyResult.FAILURE_EXCEPTION, result.getKey());
 
 293         dmaapResponse.getBody().getStatus().setCode(550);
 
 294         dmaapResponse.getBody().getStatus().setMessage("PARTIAL FAILURE");
 
 295         result = AppcLcmActorServiceProvider.processResponse(dmaapResponse);
 
 296         assertEquals(PolicyResult.FAILURE_EXCEPTION, result.getKey());
 
 298         /* If APPC code is unknown to Policy, PolicyResult is failure exception */
 
 299         dmaapResponse.getBody().getStatus().setCode(700);
 
 300         dmaapResponse.getBody().getStatus().setMessage("UNKNOWN");
 
 301         result = AppcLcmActorServiceProvider.processResponse(dmaapResponse);
 
 302         assertEquals(PolicyResult.FAILURE_EXCEPTION, result.getKey());
 
 306      * This test ensures that that if the the source entity is also the target entity, the source
 
 307      * will be used for the APPC request.
 
 310     public void sourceIsTargetTest() {
 
 311         String resourceId = "82194af1-3c2c-485a-8f44-420e22a9eaa4";
 
 312         String targetVnfId = null;
 
 314             targetVnfId = AppcLcmActorServiceProvider.vnfNamedQuery(resourceId, "vnf01");
 
 315         } catch (AAIException e) {
 
 316             logger.warn(e.toString());
 
 317             fail("no vnf-id found");
 
 319         assertNotNull(targetVnfId);
 
 320         assertEquals("vnf01", targetVnfId);
 
 324      * THis test exercises getters not exercised in other tests.
 
 327     public void testMethods() {
 
 328         AppcLcmActorServiceProvider sp = new AppcLcmActorServiceProvider();
 
 330         assertEquals("APPC", sp.actor());
 
 331         assertEquals(4, sp.recipes().size());
 
 332         assertEquals("VM", sp.recipeTargets("Restart").get(0));
 
 333         assertEquals("vm-id", sp.recipePayloads("Restart").get(0));