2  * ============LICENSE_START=======================================================
 
   4  * ================================================================================
 
   5  * Copyright (C) 2017 Intel Corp. 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.template.demo;
 
  23 import static org.junit.Assert.assertEquals;
 
  24 import static org.junit.Assert.assertNotNull;
 
  25 import static org.junit.Assert.assertTrue;
 
  26 import static org.junit.Assert.fail;
 
  28 import java.io.IOException;
 
  29 import java.net.URLEncoder;
 
  30 import java.nio.file.Files;
 
  31 import java.nio.file.Path;
 
  32 import java.nio.file.Paths;
 
  33 import java.time.Instant;
 
  34 import java.util.HashMap;
 
  35 import java.util.UUID;
 
  36 import java.util.regex.Matcher;
 
  37 import java.util.regex.Pattern;
 
  39 import org.junit.AfterClass;
 
  40 import org.junit.BeforeClass;
 
  41 import org.junit.Test;
 
  42 import org.kie.api.KieServices;
 
  43 import org.kie.api.builder.KieBuilder;
 
  44 import org.kie.api.builder.KieFileSystem;
 
  45 import org.kie.api.builder.Message;
 
  46 import org.kie.api.builder.ReleaseId;
 
  47 import org.kie.api.builder.Results;
 
  48 import org.kie.api.builder.model.KieModuleModel;
 
  49 import org.kie.api.runtime.KieContainer;
 
  50 import org.kie.api.runtime.KieSession;
 
  51 import org.kie.api.runtime.rule.FactHandle;
 
  52 import org.onap.policy.controlloop.ControlLoopEventStatus;
 
  53 import org.onap.policy.controlloop.ControlLoopLogger;
 
  54 import org.onap.policy.controlloop.ControlLoopTargetType;
 
  55 import org.onap.policy.controlloop.VirtualControlLoopEvent;
 
  56 import org.onap.policy.controlloop.impl.ControlLoopLoggerStdOutImpl;
 
  57 import org.onap.policy.controlloop.policy.ControlLoopPolicy;
 
  58 import org.onap.policy.drools.http.server.HttpServletServer;
 
  59 import org.onap.policy.drools.impl.PolicyEngineJUnitImpl;
 
  60 import org.onap.policy.drools.system.PolicyEngine;
 
  61 import org.onap.policy.vfc.util.Serialization;
 
  62 import org.slf4j.Logger;
 
  63 import org.slf4j.LoggerFactory;
 
  66 public class VFCControlLoopTest {
 
  68         private static final Logger log = LoggerFactory.getLogger(VFCControlLoopTest.class);
 
  69         private KieSession kieSession;
 
  70         private Util.Pair<ControlLoopPolicy, String> pair;
 
  71         private PolicyEngineJUnitImpl engine;
 
  74             /* Set environment properties */
 
  75         PolicyEngine.manager.setEnvironmentProperty("aai.url", "http://localhost:6666");
 
  76         PolicyEngine.manager.setEnvironmentProperty("aai.username", "AAI");
 
  77         PolicyEngine.manager.setEnvironmentProperty("aai.password", "AAI");
 
  79         PolicyEngine.manager.setEnvironmentProperty("vfc.url", "http://localhost:6668");
 
  80         PolicyEngine.manager.setEnvironmentProperty("vfc.username", "VFC");
 
  81         PolicyEngine.manager.setEnvironmentProperty("vfc.password", "VFC");
 
  85         public static void setUpSimulator() {
 
  89                 } catch (Exception e) {
 
  95         public static void tearDownSimulator() {
 
  96                 HttpServletServer.factory.destroy();
 
 100         public void testVolte() throws IOException {
 
 102                 final String yaml = "src/test/resources/yaml/policy_ControlLoop_VFC.yaml";
 
 105                 // Pull info from the yaml
 
 107                 final Util.Pair<ControlLoopPolicy, String> pair = Util.loadYaml(yaml);
 
 109                 assertNotNull(pair.a);
 
 110                 assertNotNull(pair.a.getControlLoop());
 
 111                 assertNotNull(pair.a.getControlLoop().getControlLoopName());
 
 112                 assertTrue(pair.a.getControlLoop().getControlLoopName().length() > 0);
 
 113                 final String closedLoopControlName = pair.a.getControlLoop().getControlLoopName();
 
 116          * Start the kie session
 
 119                         kieSession = startSession("src/main/resources/ControlLoop_Template_xacml_guard.drl",
 
 120                                         "src/test/resources/yaml/policy_ControlLoop_VFC.yaml",
 
 121                                         "service=ServiceTest;resource=ResourceTest;type=operational",
 
 123                                         "org.onap.closed_loop.ServiceTest:VNFS:1.0.0");
 
 124                 } catch (IOException e) {
 
 126                         log.debug("Could not create kieSession");
 
 127                         fail("Could not create kieSession");
 
 132                 // Insert our globals
 
 134                 final ControlLoopLogger logger = new ControlLoopLoggerStdOutImpl();
 
 135                 kieSession.setGlobal("Logger", logger);
 
 136                 final PolicyEngineJUnitImpl engine = new PolicyEngineJUnitImpl();
 
 137                 kieSession.setGlobal("Engine", engine);
 
 140                 // Initial fire of rules
 
 142                 kieSession.fireAllRules();
 
 144                 // Kick a thread that starts testing
 
 146                 new Thread(new Runnable() {
 
 151                                 log.debug("\n************ Starting VoLTE Test *************\n");
 
 154                                 // Generate an invalid DCAE Event with requestID=null
 
 156                                 VirtualControlLoopEvent invalidEvent = new VirtualControlLoopEvent();
 
 157                                 invalidEvent.closedLoopControlName = closedLoopControlName;
 
 158                                 invalidEvent.requestID = null;
 
 159                                 invalidEvent.closedLoopEventClient = "tca.instance00009";
 
 160                                 invalidEvent.target_type = ControlLoopTargetType.VNF;
 
 161                                 invalidEvent.target = "generic-vnf.vnf-id";
 
 162                                 invalidEvent.from = "DCAE";
 
 163                                 invalidEvent.closedLoopAlarmStart = Instant.now();
 
 164                                 invalidEvent.AAI = new HashMap<String, String>();
 
 165                                 invalidEvent.AAI.put("vserver.vserver-name", "vserver-name-16102016-aai3255-data-11-1");
 
 166                                 invalidEvent.closedLoopEventStatus = ControlLoopEventStatus.ONSET;
 
 168                                 log.debug("-------- Sending Invalid ONSET --------");
 
 169                                 log.debug(Serialization.gsonPretty.toJson(invalidEvent));
 
 172                                 // Insert invalid DCAE Event into memory
 
 174                                 kieSession.insert(invalidEvent);
 
 177                                 } catch (InterruptedException e) {
 
 180                                 // Generate first DCAE ONSET Event
 
 182                                 VirtualControlLoopEvent onsetEvent = new VirtualControlLoopEvent();
 
 183                                 onsetEvent.closedLoopControlName = closedLoopControlName;
 
 184                                 onsetEvent.requestID = UUID.randomUUID();
 
 185                                 onsetEvent.closedLoopEventClient = "tca.instance00009";
 
 186                                 onsetEvent.target_type = ControlLoopTargetType.VM;
 
 187                                 onsetEvent.target = "VM_NAME";
 
 188                                 onsetEvent.from = "DCAE";
 
 189                                 onsetEvent.closedLoopAlarmStart = Instant.now();
 
 190                                 onsetEvent.AAI = new HashMap<String, String>();
 
 191                                 onsetEvent.AAI.put("vserver.vserver-name", "vserver-name-16102016-aai3255-data-11-1");
 
 192                                 onsetEvent.AAI.put("vserver.vserver-id", "vserver-id-16102016-aai3255-data-11-1");
 
 193                                 onsetEvent.AAI.put("generic-vnf.vnf-id", "vnf-id-16102016-aai3255-data-11-1");
 
 194                                 onsetEvent.AAI.put("service-instance.service-instance-id", "service-instance-id-16102016-aai3255-data-11-1");
 
 195                                 onsetEvent.AAI.put("vserver.is-closed-loop-disabled", "false");
 
 196                                 onsetEvent.closedLoopEventStatus = ControlLoopEventStatus.ONSET;
 
 198                                 log.debug("-------- Sending Valid ONSET --------");
 
 199                                 log.debug(Serialization.gsonPretty.toJson(onsetEvent));
 
 202                                 // Insert first DCAE ONSET Event into memory
 
 204                                 kieSession.insert(onsetEvent);
 
 206                                 // We have test for subsequent ONSET Events in testvFirewall()
 
 207                                 // So no need to test it again here
 
 211                                 } catch (InterruptedException e) {
 
 214                                 // Test is finished, so stop the kieSession
 
 221                 // Start firing rules
 
 223                 kieSession.fireUntilHalt();
 
 225                 // Dump working memory
 
 227                 dumpFacts(kieSession);
 
 230                 // See if there is anything left in memory, there SHOULD only be
 
 233                 assertEquals("There should only be 1 Fact left in memory.", 1, kieSession.getFactCount());
 
 234                 for (FactHandle handle : kieSession.getFactHandles()) {
 
 235                         Object fact = kieSession.getObject(handle);
 
 236                         assertEquals("Non-Param Fact left in working memory", "org.onap.policy.controlloop.Params", fact.getClass().getName());
 
 241         public static void dumpFacts(KieSession kieSession) {
 
 242                 log.debug("Fact Count: " + kieSession.getFactCount());
 
 243                 for (FactHandle handle : kieSession.getFactHandles()) {
 
 244                         log.debug("FACT: " + handle);
 
 249          * This method will start a kie session and instantiate
 
 252          * @param droolsTemplate
 
 255          *          the yaml file containing the policies
 
 260          * @param policyVersion
 
 261          *          version of the policy
 
 262          * @return the kieSession to be used to insert facts
 
 263          * @throws IOException
 
 265         private KieSession startSession(String droolsTemplate,
 
 269                                         String policyVersion) throws IOException {
 
 272          * Load policies from yaml
 
 274                 pair = Util.loadYaml(yamlFile);
 
 276                 assertNotNull(pair.a);
 
 277                 assertNotNull(pair.a.getControlLoop());
 
 278                 assertNotNull(pair.a.getControlLoop().getControlLoopName());
 
 279                 assertTrue(pair.a.getControlLoop().getControlLoopName().length() > 0);
 
 282          * Construct a kie session
 
 284                 final KieSession kieSession = Util.buildContainer(droolsTemplate,
 
 285                                 pair.a.getControlLoop().getControlLoopName(),
 
 289                                 URLEncoder.encode(pair.b, "UTF-8"));
 
 292          * Retrieve the Policy Engine
 
 294                 engine = (PolicyEngineJUnitImpl) kieSession.getGlobal("Engine");
 
 296                 log.debug("============");
 
 297                 log.debug(URLEncoder.encode(pair.b, "UTF-8"));
 
 298                 log.debug("============");