2 * ============LICENSE_START=======================================================
3 * policy-yaml unit test
4 * ================================================================================
5 * Copyright (C) 2017 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.policy;
23 import static org.junit.Assert.assertFalse;
24 import static org.junit.Assert.assertNotNull;
25 import static org.junit.Assert.assertTrue;
26 import static org.junit.Assert.fail;
29 import java.io.FileInputStream;
30 import java.io.FileNotFoundException;
31 import java.io.IOException;
32 import java.io.InputStream;
33 import java.util.UUID;
35 import org.junit.Test;
36 import org.onap.policy.controlloop.policy.builder.BuilderException;
37 import org.onap.policy.controlloop.policy.builder.ControlLoopPolicyBuilder;
38 import org.onap.policy.controlloop.policy.builder.Message;
39 import org.onap.policy.controlloop.policy.builder.MessageLevel;
40 import org.onap.policy.controlloop.policy.builder.Results;
41 import org.onap.policy.sdc.Resource;
42 import org.onap.policy.sdc.ResourceType;
43 import org.onap.policy.sdc.Service;
44 import org.yaml.snakeyaml.Yaml;
45 import org.yaml.snakeyaml.constructor.Constructor;
46 import org.yaml.snakeyaml.error.YAMLException;
49 public class ControlLoopPolicyBuilderTest {
52 public void testControlLoop() {
55 // Create a builder for our policy
57 ControlLoopPolicyBuilder builder = ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
61 Service vSCP = new Service("vSCP");
62 Service vUSP = new Service("vUSP");
63 Service vTrinity = new Service("Trinity");
64 builder = builder.addService(vSCP, vUSP, vTrinity);
65 assertTrue(builder.getControlLoop().getServices().size() == 3);
67 // Test remove services
69 builder = builder.removeService(vSCP);
70 assertTrue(builder.getControlLoop().getServices().size() == 2);
71 builder = builder.removeAllServices();
72 assertTrue(builder.getControlLoop().getServices().size() == 0);
76 Resource vCTS = new Resource("vCTS", ResourceType.VF);
77 Resource vCOM = new Resource("vCTS", ResourceType.VF);
78 Resource vRAR = new Resource("vCTS", ResourceType.VF);
79 builder = builder.addResource(vCTS, vCOM, vRAR);
80 assertTrue(builder.getControlLoop().getResources().size() == 3);
82 // Test remove resources
84 builder = builder.removeResource(vCTS);
85 assertTrue(builder.getControlLoop().getResources().size() == 2);
86 builder = builder.removeAllResources();
87 assertTrue(builder.getControlLoop().getResources().size() == 0);
91 assertFalse(builder.getControlLoop().getAbatement());
92 builder = builder.setAbatement(true);
93 assertTrue(builder.getControlLoop().getAbatement());
94 } catch (BuilderException e) {
100 public void testTimeout() {
103 // Create a builder for our policy
105 ControlLoopPolicyBuilder builder = ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
109 assertTrue(builder.getControlLoop().getTimeout() == 2400);
110 builder = builder.setTimeout(800);
111 assertTrue(builder.getControlLoop().getTimeout() == 800);
113 // Test calculateTimeout
115 Policy trigger = builder.setTriggerPolicy(
117 "Upon getting the trigger event, restart the VM",
119 new Target(TargetType.VM),
124 @SuppressWarnings("unused")
125 Policy onRestartFailurePolicy = builder.setPolicyForPolicyResult(
127 "If the restart fails, rebuild it",
129 new Target(TargetType.VM),
135 PolicyResult.FAILURE,
136 PolicyResult.FAILURE_RETRIES,
137 PolicyResult.FAILURE_TIMEOUT);
138 assertTrue(builder.calculateTimeout().equals(new Integer(300 + 600)));
140 } catch (BuilderException e) {
141 fail(e.getMessage());
146 public void testTriggerPolicyMethods() {
148 ControlLoopPolicyBuilder builder = ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
152 assertTrue(builder.isOpenLoop());
154 // Test set initial trigger policy
156 Policy triggerPolicy1 = builder.setTriggerPolicy(
158 "Upon getting the trigger event, restart the VM",
160 new Target(TargetType.VM),
165 assertTrue(builder.isOpenLoop() == false);
166 assertTrue(builder.getControlLoop().getTrigger_policy().equals(triggerPolicy1.getId()));
168 // Set trigger policy to a new policy
170 @SuppressWarnings("unused")
171 Policy triggerPolicy2 = builder.setTriggerPolicy(
173 "Upon getting the trigger event, rebuild the VM",
175 new Target(TargetType.VM),
181 // Test set trigger policy to another existing policy
183 @SuppressWarnings("unused")
184 ControlLoop cl = builder.setTriggerPolicy(triggerPolicy1.getId());
185 assertTrue(builder.getControlLoop().getTrigger_policy().equals(triggerPolicy1.getId()));
187 // Test get trigger policy
189 assertTrue(builder.getTriggerPolicy().equals(triggerPolicy1));
191 } catch (BuilderException e) {
192 fail(e.getMessage());
197 public void testAddRemovePolicies() {
199 ControlLoopPolicyBuilder builder = ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
200 Policy triggerPolicy = builder.setTriggerPolicy(
202 "Upon getting the trigger event, restart the VM",
204 new Target(TargetType.VM),
210 // Test create a policy and chain it to the results of trigger policy
212 Policy onRestartFailurePolicy1 = builder.setPolicyForPolicyResult(
214 "If the restart fails, rebuild it.",
216 new Target(TargetType.VM),
221 triggerPolicy.getId(),
222 PolicyResult.FAILURE,
223 PolicyResult.FAILURE_RETRIES,
224 PolicyResult.FAILURE_TIMEOUT,
225 PolicyResult.FAILURE_GUARD);
227 assertTrue(builder.getTriggerPolicy().getFailure().equals(onRestartFailurePolicy1.getId()));
228 assertTrue(builder.getTriggerPolicy().getFailure_retries().equals(onRestartFailurePolicy1.getId()));
229 assertTrue(builder.getTriggerPolicy().getFailure_timeout().equals(onRestartFailurePolicy1.getId()));
230 assertTrue(builder.getTriggerPolicy().getFailure_guard().equals(onRestartFailurePolicy1.getId()));
232 // Test remove policy
234 boolean removed = builder.removePolicy(onRestartFailurePolicy1.getId());
236 assertTrue(builder.getTriggerPolicy().getFailure().equals(FinalResult.FINAL_FAILURE.toString()));
237 assertTrue(builder.getTriggerPolicy().getFailure_retries().equals(FinalResult.FINAL_FAILURE_RETRIES.toString()));
238 assertTrue(builder.getTriggerPolicy().getFailure_timeout().equals(FinalResult.FINAL_FAILURE_TIMEOUT.toString()));
239 assertTrue(builder.getTriggerPolicy().getFailure_guard().equals(FinalResult.FINAL_FAILURE_GUARD.toString()));
241 // Create another policy and chain it to the results of trigger policy
243 Policy onRestartFailurePolicy2 = builder.setPolicyForPolicyResult(
245 "If the restart fails, rebuild it.",
247 new Target(TargetType.VM),
252 triggerPolicy.getId(),
253 PolicyResult.FAILURE,
254 PolicyResult.FAILURE_RETRIES,
255 PolicyResult.FAILURE_TIMEOUT);
257 // Test reset policy results
259 triggerPolicy = builder.resetPolicyResults(triggerPolicy.getId());
260 assertTrue(builder.getTriggerPolicy().getFailure().equals(FinalResult.FINAL_FAILURE.toString()));
261 assertTrue(builder.getTriggerPolicy().getFailure_retries().equals(FinalResult.FINAL_FAILURE_RETRIES.toString()));
262 assertTrue(builder.getTriggerPolicy().getFailure_timeout().equals(FinalResult.FINAL_FAILURE_TIMEOUT.toString()));
264 // Test set the policy results to an existing operational policy
266 onRestartFailurePolicy2 = builder.setPolicyForPolicyResult(
267 onRestartFailurePolicy2.getId(),
268 triggerPolicy.getId(),
269 PolicyResult.FAILURE,
270 PolicyResult.FAILURE_RETRIES,
271 PolicyResult.FAILURE_TIMEOUT);
272 assertTrue(builder.getTriggerPolicy().getFailure().equals(onRestartFailurePolicy2.getId()));
273 assertTrue(builder.getTriggerPolicy().getFailure_retries().equals(onRestartFailurePolicy2.getId()));
274 assertTrue(builder.getTriggerPolicy().getFailure_timeout().equals(onRestartFailurePolicy2.getId()));
277 // Test remove all existing operational policies
279 builder = builder.removeAllPolicies();
280 assertTrue(builder.getControlLoop().getTrigger_policy().equals(FinalResult.FINAL_OPENLOOP.toString()));
282 } catch (BuilderException e) {
283 fail(e.getMessage());
288 public void testAddOperationsAccumulateParams() {
290 ControlLoopPolicyBuilder builder = ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
291 Policy triggerPolicy = builder.setTriggerPolicy(
292 "Restart the eNodeB",
293 "Upon getting the trigger event, restart the eNodeB",
295 new Target(TargetType.PNF),
301 // Add the operationsAccumulateParams
303 triggerPolicy = builder.addOperationsAccumulateParams(triggerPolicy.getId(), new OperationsAccumulateParams("15m", 5));
304 assertNotNull(builder.getTriggerPolicy().getOperationsAccumulateParams());
305 assertTrue(builder.getTriggerPolicy().getOperationsAccumulateParams().getPeriod().equals("15m"));
306 assertTrue(builder.getTriggerPolicy().getOperationsAccumulateParams().getLimit() == 5);
308 } catch (BuilderException e) {
309 fail(e.getMessage());
315 public void testBuildSpecification() {
318 // Create the builder
320 ControlLoopPolicyBuilder builder = ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 800);
322 // Set the first invalid trigger policy
324 Policy policy1 = builder.setTriggerPolicy(
326 "Upon getting the trigger event, restart the VM",
333 Results results = builder.buildSpecification();
335 // Check that ERRORs are in results for invalid policy arguments
337 boolean invalid_actor = false;
338 boolean invalid_recipe = false;
339 boolean invalid_target = false;
340 for (Message m : results.getMessages()) {
341 if (m.getMessage().equals("Policy actor is null") && m.getLevel() == MessageLevel.ERROR) {
342 invalid_actor = true;
344 if (m.getMessage().equals("Policy recipe is invalid") && m.getLevel() == MessageLevel.ERROR) {
345 invalid_recipe = true;
347 if (m.getMessage().equals("Policy target is null") && m.getLevel() == MessageLevel.ERROR) {
348 invalid_target = true;
352 assertTrue(invalid_actor);
353 assertTrue(invalid_recipe);
354 assertTrue(invalid_target);
356 // Remove the invalid policy
358 //@SuppressWarnings("unused")
359 boolean removed = builder.removePolicy(policy1.getId());
361 assertTrue(builder.getTriggerPolicy() == null);
363 // Set a valid trigger policy
365 policy1 = builder.setTriggerPolicy(
367 "If the restart fails, rebuild it.",
369 new Target(TargetType.VM),
375 // Set a second valid trigger policy
377 Policy policy2 = builder.setTriggerPolicy(
379 "Upon getting the trigger event, restart the VM",
381 new Target(TargetType.VM),
387 // Now, we have policy1 unreachable
389 results = builder.buildSpecification();
390 boolean unreachable = false;
391 for (Message m : results.getMessages()) {
392 if (m.getMessage().equals("Policy " + policy1.getId() + " is not reachable.") && m.getLevel() == MessageLevel.WARNING) {
397 assertTrue(unreachable);
399 // Set policy1 for the failure results of policy2
401 policy1 = builder.setPolicyForPolicyResult(
404 PolicyResult.FAILURE,
405 PolicyResult.FAILURE_RETRIES,
406 PolicyResult.FAILURE_TIMEOUT);
407 results = builder.buildSpecification();
408 boolean invalid_timeout = false;
409 for (Message m : results.getMessages()) {
410 if (m.getMessage().equals("controlLoop overall timeout is less than the sum of operational policy timeouts.") && m.getLevel() == MessageLevel.ERROR) {
411 invalid_timeout = true;
415 assertTrue(invalid_timeout);
417 // Remove policy2 (revert controlLoop back to open loop)
419 removed = builder.removePolicy(policy2.getId());
421 // ControlLoop is open loop now, but it still has policies (policy1)
423 results = builder.buildSpecification();
425 for (Message m : results.getMessages()) {
426 if (m.getMessage().equals("Open Loop policy contains policies. The policies will never be invoked.") && m.getLevel() == MessageLevel.WARNING) {
431 assertTrue(unreachable);
433 } catch (BuilderException e) {
434 fail(e.getMessage());
441 this.test("src/test/resources/v1.0.0/policy_Test.yaml");
445 public void testEvilYaml() {
446 try (InputStream is = new FileInputStream(new File("src/test/resources/v1.0.0/test_evil.yaml"))) {
448 // Read the yaml into our Java Object
450 Yaml yaml = new Yaml(new Constructor(ControlLoopPolicy.class));
452 } catch (FileNotFoundException e) {
453 fail(e.getLocalizedMessage());
454 } catch (IOException e) {
455 fail(e.getLocalizedMessage());
456 } catch (YAMLException e) {
463 public void test(String testFile) {
464 try (InputStream is = new FileInputStream(new File(testFile))) {
466 // Read the yaml into our Java Object
468 Yaml yaml = new Yaml(new Constructor(ControlLoopPolicy.class));
469 Object obj = yaml.load(is);
471 assertTrue(obj instanceof ControlLoopPolicy);
472 ControlLoopPolicy policyTobuild = (ControlLoopPolicy) obj;
474 // Now we're going to try to use the builder to build this.
476 ControlLoopPolicyBuilder builder = ControlLoopPolicyBuilder.Factory.buildControlLoop(
477 policyTobuild.getControlLoop().getControlLoopName(),
478 policyTobuild.getControlLoop().getTimeout());
482 if (policyTobuild.getControlLoop().getServices() != null) {
483 builder = builder.addService(policyTobuild.getControlLoop().getServices().toArray(new Service[policyTobuild.getControlLoop().getServices().size()]));
488 if (policyTobuild.getControlLoop().getResources() != null) {
489 builder = builder.addResource(policyTobuild.getControlLoop().getResources().toArray(new Resource[policyTobuild.getControlLoop().getResources().size()]));
494 if (policyTobuild.getControlLoop().getPnf() != null) {
495 builder = builder.setPNF(policyTobuild.getControlLoop().getPnf());
498 // Add the policies and be sure to set the trigger policy
500 if (policyTobuild.getPolicies() != null) {
501 for (Policy policy : policyTobuild.getPolicies()) {
502 if (policy.getId() == policyTobuild.getControlLoop().getTrigger_policy()) {
503 builder.setTriggerPolicy(policy.getName(), policy.getDescription(), policy.getActor(), policy.getTarget(), policy.getRecipe(), null, policy.getRetry(), policy.getTimeout());
508 // Question : how to change policy ID and results by using builder ??
510 @SuppressWarnings("unused")
511 Results results = builder.buildSpecification();
513 } catch (FileNotFoundException e) {
514 fail(e.getLocalizedMessage());
515 } catch (IOException e) {
516 fail(e.getLocalizedMessage());
517 } catch (BuilderException e) {
518 fail(e.getLocalizedMessage());