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("============");