40df82cdb0d1cfbf16f9c1cc85bc6e82ba5e5be9
[policy/apex-pdp.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2016-2018 Ericsson. All rights reserved.
4  * ================================================================================
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * SPDX-License-Identifier: Apache-2.0
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.policy.apex.examples.adaptive;
22
23 import static org.junit.Assert.assertEquals;
24 import static org.junit.Assert.assertNotNull;
25 import static org.junit.Assert.assertTrue;
26
27 import java.io.IOException;
28 import java.util.Random;
29
30 import org.junit.After;
31 import org.junit.Before;
32 import org.junit.Test;
33 import org.onap.policy.apex.context.impl.schema.java.JavaSchemaHelperParameters;
34 import org.onap.policy.apex.context.parameters.ContextParameterConstants;
35 import org.onap.policy.apex.context.parameters.ContextParameters;
36 import org.onap.policy.apex.context.parameters.SchemaParameters;
37 import org.onap.policy.apex.core.engine.EngineParameters;
38 import org.onap.policy.apex.core.engine.engine.ApexEngine;
39 import org.onap.policy.apex.core.engine.engine.impl.ApexEngineFactory;
40 import org.onap.policy.apex.core.engine.event.EnEvent;
41 import org.onap.policy.apex.core.infrastructure.threading.ThreadUtilities;
42 import org.onap.policy.apex.examples.adaptive.model.AdaptiveDomainModelFactory;
43 import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
44 import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
45 import org.onap.policy.apex.model.basicmodel.concepts.AxValidationResult;
46 import org.onap.policy.apex.model.policymodel.concepts.AxPolicyModel;
47 import org.onap.policy.apex.plugins.executor.java.JavaExecutorParameters;
48 import org.onap.policy.apex.plugins.executor.mvel.MvelExecutorParameters;
49 import org.onap.policy.common.parameters.ParameterService;
50 import org.slf4j.ext.XLogger;
51 import org.slf4j.ext.XLoggerFactory;
52
53 /**
54  * This policy passes, and recieves a Double event context filed called "EVCDouble".<br>
55  * The policy tries to detect anomalies in the pattern of values for EVCDouble<br>
56  * See the 2 test cases below (1 short, 1 long)
57  *
58  * @author John Keeney (John.Keeney@ericsson.com)
59  */
60 public class AnomalyDetectionTslUseCaseTest {
61     private static final XLogger LOGGER = XLoggerFactory.getXLogger(AnomalyDetectionTslUseCaseTest.class);
62
63     private static final int MAXITERATIONS = 3660;
64     private static final Random RAND = new Random(System.currentTimeMillis());
65
66     private SchemaParameters schemaParameters;
67     private ContextParameters contextParameters;
68     private EngineParameters engineParameters;
69
70     /**
71      * Before test.
72      */
73     @Before
74     public void beforeTest() {
75         schemaParameters = new SchemaParameters();
76         
77         schemaParameters.setName(ContextParameterConstants.SCHEMA_GROUP_NAME);
78         schemaParameters.getSchemaHelperParameterMap().put("JAVA", new JavaSchemaHelperParameters());
79
80         ParameterService.register(schemaParameters);
81         
82         contextParameters = new ContextParameters();
83
84         contextParameters.setName(ContextParameterConstants.MAIN_GROUP_NAME);
85         contextParameters.getDistributorParameters().setName(ContextParameterConstants.DISTRIBUTOR_GROUP_NAME);
86         contextParameters.getLockManagerParameters().setName(ContextParameterConstants.LOCKING_GROUP_NAME);
87         contextParameters.getPersistorParameters().setName(ContextParameterConstants.PERSISTENCE_GROUP_NAME);
88
89         ParameterService.register(contextParameters);
90         ParameterService.register(contextParameters.getDistributorParameters());
91         ParameterService.register(contextParameters.getLockManagerParameters());
92         ParameterService.register(contextParameters.getPersistorParameters());
93         
94         engineParameters = new EngineParameters();
95         engineParameters.getExecutorParameterMap().put("MVEL", new MvelExecutorParameters());
96         engineParameters.getExecutorParameterMap().put("JAVA", new JavaExecutorParameters());
97         ParameterService.register(engineParameters);
98     }
99
100     /**
101      * After test.
102      */
103     @After
104     public void afterTest() {
105         ParameterService.deregister(engineParameters);
106         
107         ParameterService.deregister(contextParameters.getDistributorParameters());
108         ParameterService.deregister(contextParameters.getLockManagerParameters());
109         ParameterService.deregister(contextParameters.getPersistorParameters());
110         ParameterService.deregister(contextParameters);
111
112         ParameterService.deregister(schemaParameters);
113     }
114
115     /**
116      * Test anomaly detection tsl.
117      *
118      * @throws ApexException the apex exception
119      * @throws InterruptedException the interrupted exception
120      * @throws IOException Signals that an I/O exception has occurred.
121      */
122     @Test
123     // once through the long running test below
124     public void testAnomalyDetectionTsl() throws ApexException, InterruptedException, IOException {
125         final AxPolicyModel apexPolicyModel = new AdaptiveDomainModelFactory().getAnomalyDetectionPolicyModel();
126         assertNotNull(apexPolicyModel);
127
128         final AxValidationResult validationResult = new AxValidationResult();
129         apexPolicyModel.validate(validationResult);
130         assertTrue(validationResult.isValid());
131
132         final AxArtifactKey key = new AxArtifactKey("AnomalyTSLApexEngine", "0.0.1");
133
134         final ApexEngine apexEngine1 = new ApexEngineFactory().createApexEngine(key);
135
136         final TestApexActionListener listener1 = new TestApexActionListener("TestListener1");
137         apexEngine1.addEventListener("listener", listener1);
138         apexEngine1.updateModel(apexPolicyModel);
139         apexEngine1.start();
140         final EnEvent triggerEvent =
141                 apexEngine1.createEvent(new AxArtifactKey("AnomalyDetectionTriggerEvent", "0.0.1"));
142         final double rval = RAND.nextGaussian();
143         triggerEvent.put("Iteration", 0);
144         triggerEvent.put("MonitoredValue", rval);
145         LOGGER.info("Triggering policy in Engine 1 with " + triggerEvent);
146         apexEngine1.handleEvent(triggerEvent);
147         final EnEvent result = listener1.getResult();
148         LOGGER.info("Receiving action event {} ", result);
149         assertEquals("ExecutionIDs are different", triggerEvent.getExecutionId(), result.getExecutionId());
150         triggerEvent.clear();
151         result.clear();
152         ThreadUtilities.sleep(1);
153         apexEngine1.stop();
154     }
155
156     /**
157      * This policy passes, and recieves a Double event context filed called "EVCDouble"<br>
158      * The policy tries to detect anomalies in the pattern of values for EVCDouble <br>
159      * This test case generates a SineWave-like pattern for the parameter, repeating every 360 iterations. (These Period
160      * should probably be set using TaskParameters!) Every 361st value is a random number!, so should be identified as
161      * an Anomaly. The policy has 3 Decide Tasks, and the Decide TaskSelectionLogic picks one depending on the
162      * 'Anomaliness' of the input data. <br>
163      * To plot the results grep debug results for the string "************", paste into excel and delete non-relevant
164      * columns<br>
165      *
166      * @throws ApexException the apex exception
167      * @throws InterruptedException the interrupted exception
168      * @throws IOException Signals that an I/O exception has occurred.
169      */
170     // Test is disabled by default. uncomment below, or execute using the main() method
171     // @Test
172     // EG Dos command: apex-core.engine> mvn
173     // -Dtest=org.onap.policy.apex.core.engine.ml.TestAnomalyDetectionTslUseCase test | findstr /L /C:"Apex [main] DEBUG
174     // c.e.a.e.TaskSelectionExecutionLogging -
175     // TestAnomalyDetectionTSL_Policy0000DecideStateTaskSelectionLogic.getTask():"
176     public void testAnomalyDetectionTslmain() throws ApexException, InterruptedException, IOException {
177
178         final AxPolicyModel apexPolicyModel = new AdaptiveDomainModelFactory().getAnomalyDetectionPolicyModel();
179         assertNotNull(apexPolicyModel);
180
181         final AxValidationResult validationResult = new AxValidationResult();
182         apexPolicyModel.validate(validationResult);
183         assertTrue(validationResult.isValid());
184
185         final AxArtifactKey key = new AxArtifactKey("AnomalyTSLApexEngine", "0.0.1");
186         final EngineParameters parameters = new EngineParameters();
187         parameters.getExecutorParameterMap().put("MVEL", new MvelExecutorParameters());
188         parameters.getExecutorParameterMap().put("JAVA", new JavaExecutorParameters());
189
190         final ApexEngine apexEngine1 = new ApexEngineFactory().createApexEngine(key);
191
192         final TestApexActionListener listener1 = new TestApexActionListener("TestListener1");
193         apexEngine1.addEventListener("listener1", listener1);
194         apexEngine1.updateModel(apexPolicyModel);
195         apexEngine1.start();
196
197         final EnEvent triggerEvent =
198                 apexEngine1.createEvent(new AxArtifactKey("AnomalyDetectionTriggerEvent", "0.0.1"));
199         assertNotNull(triggerEvent);
200
201         for (int iteration = 0; iteration < MAXITERATIONS; iteration++) {
202             // Trigger the policy in engine 1
203
204             double value = (Math.sin(Math.toRadians(iteration))) + (RAND.nextGaussian() / 25.0);
205             // lets make every 361st number a random value to perhaps flag as an anomaly
206             if (((iteration + 45) % 361) == 0) {
207                 value = (RAND.nextGaussian() * 2.0);
208             }
209             triggerEvent.put("Iteration", iteration);
210             triggerEvent.put("MonitoredValue", value);
211             LOGGER.info("Iteration " + iteration + ":\tTriggering policy in Engine 1 with " + triggerEvent);
212             apexEngine1.handleEvent(triggerEvent);
213             final EnEvent result = listener1.getResult();
214             LOGGER.info("Iteration " + iteration + ":\tReceiving action event {} ", result);
215             triggerEvent.clear();
216             result.clear();
217         }
218         apexEngine1.stop();
219         ThreadUtilities.sleep(1000);
220     }
221
222     /**
223      * The main method.
224      *
225      * @param args the arguments
226      * @throws ApexException the apex exception
227      * @throws InterruptedException the interrupted exception
228      * @throws IOException Signals that an I/O exception has occurred.
229      */
230     public static void main(final String[] args) throws ApexException, InterruptedException, IOException {
231         new AnomalyDetectionTslUseCaseTest().testAnomalyDetectionTslmain();
232     }
233 }