Sonar Fixes policy/models, removing model-yaml
[policy/models.git] / models-interactions / model-yaml / src / test / java / org / onap / policy / controlloop / policy / ControlLoopPolicyBuilderTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * policy-yaml unit test
4  * ================================================================================
5  * Copyright (C) 2017-2020 AT&T Intellectual Property. All rights reserved.
6  * Modifications Copyright (C) 2019-2020 Nordix Foundation.
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  * ============LICENSE_END=========================================================
20  */
21
22 package org.onap.policy.controlloop.policy;
23
24 import static org.assertj.core.api.Assertions.assertThatThrownBy;
25 import static org.junit.Assert.assertEquals;
26 import static org.junit.Assert.assertFalse;
27 import static org.junit.Assert.assertNotNull;
28 import static org.junit.Assert.assertNull;
29 import static org.junit.Assert.assertTrue;
30
31 import java.io.File;
32 import java.io.FileInputStream;
33 import java.io.InputStream;
34 import java.util.UUID;
35 import org.junit.Ignore;
36 import org.junit.Test;
37 import org.onap.aai.domain.yang.Pnf;
38 import org.onap.policy.controlloop.policy.builder.BuilderException;
39 import org.onap.policy.controlloop.policy.builder.ControlLoopPolicyBuilder;
40 import org.onap.policy.controlloop.policy.builder.Message;
41 import org.onap.policy.controlloop.policy.builder.MessageLevel;
42 import org.onap.policy.controlloop.policy.builder.Results;
43 import org.onap.policy.sdc.Resource;
44 import org.onap.policy.sdc.ResourceType;
45 import org.onap.policy.sdc.Service;
46 import org.yaml.snakeyaml.Yaml;
47 import org.yaml.snakeyaml.constructor.Constructor;
48 import org.yaml.snakeyaml.error.YAMLException;
49
50 public class ControlLoopPolicyBuilderTest {
51
52     private static final String RESOURCE1 = "resource1";
53     private static final String TRIGGER_RESTART = "Upon getting the trigger event, restart the VM";
54     private static final String UNKNOWN_POLICY = "Unknown policy ";
55     private static final String RESTART = "Restart";
56     private static final String RESTART_VM = "Restart the VM";
57     private static final String REBUILD = "Rebuild";
58     private static final String REBUILD_VM = "Rebuild VM";
59     private static final String REBUILD_RESTART = "If the restart fails, rebuild it.";
60
61     @Test
62     public void testControlLoop() throws BuilderException {
63         //
64         // Create a builder for our policy
65         //
66         ControlLoopPolicyBuilder builder =
67             ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
68         //
69         // Test add services
70         //
71         Service scp = new Service("vSCP");
72         Service usp = new Service("vUSP");
73         Service trinity = new Service("Trinity");
74         builder = builder.addService(scp, usp, trinity);
75         assertTrue(builder.getControlLoop().getServices().size() == 3);
76         //
77         // Test remove services
78         //
79         builder = builder.removeService(scp);
80         assertTrue(builder.getControlLoop().getServices().size() == 2);
81         builder = builder.removeAllServices();
82         assertTrue(builder.getControlLoop().getServices().isEmpty());
83         //
84         // Test add resources
85         //
86         Resource cts = new Resource("vCTS", ResourceType.VF);
87         Resource com = new Resource("vCTS", ResourceType.VF);
88         Resource rar = new Resource("vCTS", ResourceType.VF);
89         builder = builder.addResource(cts, com, rar);
90         assertTrue(builder.getControlLoop().getResources().size() == 3);
91         //
92         // Test remove resources
93         //
94         builder = builder.removeResource(cts);
95         assertTrue(builder.getControlLoop().getResources().size() == 2);
96         builder = builder.removeAllResources();
97         assertTrue(builder.getControlLoop().getResources().isEmpty());
98     }
99
100     @Test
101     public void testAddNullService() throws BuilderException {
102         ControlLoopPolicyBuilder builder =
103             ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
104
105         assertThatThrownBy(() -> {
106             builder.addService((Service) null);
107         }).isInstanceOf(BuilderException.class).hasMessage("Service must not be null");
108     }
109
110     @Test
111     public void testAddInvalidService() throws BuilderException {
112         ControlLoopPolicyBuilder builder =
113             ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
114
115         assertThatThrownBy(() -> {
116             builder.addService(new Service());
117         }).isInstanceOf(BuilderException.class)
118             .hasMessage("Invalid service - need either a serviceUUID or serviceName");
119     }
120
121     @Test
122     public void testAddServiceWithUuid() throws BuilderException {
123         ControlLoopPolicyBuilder builder =
124             ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
125         UUID uuid = UUID.randomUUID();
126         Service serviceWithUuid = new Service(uuid);
127         builder.addService(serviceWithUuid);
128         assertTrue(builder.getControlLoop().getServices().size() == 1);
129     }
130
131     @Test
132     public void testAddNullResource() throws BuilderException {
133         ControlLoopPolicyBuilder builder =
134             ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
135
136         assertThatThrownBy(() -> {
137             builder.addResource((Resource) null);
138         }).isInstanceOf(BuilderException.class).hasMessage("Resource must not be null");
139     }
140
141     @Test
142     public void testAddInvalidResource() throws BuilderException {
143         ControlLoopPolicyBuilder builder =
144             ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
145
146         assertThatThrownBy(() -> {
147             builder.addResource(new Resource());
148         }).isInstanceOf(BuilderException.class)
149             .hasMessage("Invalid resource - need either resourceUUID or resourceName");
150     }
151
152     @Test
153     public void testAddAndRemoveResourceWithUuid() throws BuilderException {
154         ControlLoopPolicyBuilder builder =
155             ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
156         UUID uuid = UUID.randomUUID();
157         Resource resourceWithUuid = new Resource(uuid);
158         builder.addResource(resourceWithUuid);
159         assertTrue(builder.getControlLoop().getResources().size() == 1);
160
161         builder.removeResource(resourceWithUuid);
162         assertTrue(builder.getControlLoop().getResources().isEmpty());
163     }
164
165     @Test
166     public void testRemoveNullResource() throws BuilderException {
167         ControlLoopPolicyBuilder builder =
168             ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
169         Resource resource = new Resource(RESOURCE1, ResourceType.VF);
170         builder.addResource(resource);
171
172         assertThatThrownBy(() -> {
173             builder.removeResource((Resource) null);
174         }).isInstanceOf(BuilderException.class).hasMessage("Resource must not be null");
175     }
176
177     @Test
178     public void testRemoveResourceNoExistingResources() throws BuilderException {
179         ControlLoopPolicyBuilder builder =
180             ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
181
182         assertThatThrownBy(() -> {
183             builder.removeResource(new Resource(RESOURCE1, ResourceType.VF));
184         }).isInstanceOf(BuilderException.class).hasMessage("No existing resources to remove");
185     }
186
187     @Test
188     public void testRemoveInvalidResource() throws BuilderException {
189         ControlLoopPolicyBuilder builder =
190             ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
191         Resource resource = new Resource(RESOURCE1, ResourceType.VF);
192         builder.addResource(resource);
193
194         assertThatThrownBy(() -> {
195             builder.removeResource(new Resource());
196         }).isInstanceOf(BuilderException.class)
197             .hasMessage("Invalid resource - need either a resourceUUID or resourceName");
198     }
199
200     @Test
201     public void testRemoveUnknownResource() throws BuilderException {
202         ControlLoopPolicyBuilder builder =
203             ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
204         Resource resource = new Resource(RESOURCE1, ResourceType.VF);
205         builder.addResource(resource);
206         final String unknownResourceName = "reource2";
207
208         assertThatThrownBy(() -> {
209             builder.removeResource(new Resource(unknownResourceName, ResourceType.VF));
210         }).isInstanceOf(BuilderException.class).hasMessage("Unknown resource " + unknownResourceName);
211     }
212
213     @Test
214     public void testControlLoopWithInitialResourceAndServices() throws BuilderException {
215         Resource cts = new Resource("vCTS", ResourceType.VF);
216         Service scp = new Service("vSCP");
217         Service usp = new Service("vUSP");
218         ControlLoopPolicyBuilder builder =
219             ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400, cts, scp, usp);
220         assertTrue(builder.getControlLoop().getResources().size() == 1);
221         assertTrue(builder.getControlLoop().getServices().size() == 2);
222     }
223
224     @Test
225     public void testControlLoopWithInitialResourcesAndService() throws BuilderException {
226         Resource cts = new Resource("vCTS", ResourceType.VF);
227         Resource com = new Resource("vCTS", ResourceType.VF);
228         Service scp = new Service("vSCP");
229         ControlLoopPolicyBuilder builder =
230             ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400, scp, cts, com);
231         assertTrue(builder.getControlLoop().getServices().size() == 1);
232         assertTrue(builder.getControlLoop().getResources().size() == 2);
233     }
234
235     @Test
236     @Ignore
237     // I'VE MARKED THIS TEST CASE AS IGNORE BECAUSE THE TEST CASE FAILS
238     // This test case fails because builder.getControlLoop() returns an instance of ControlLoop
239     // copied using
240     // the ControlLoop(ControlLoop controlLoop) constructor.
241     // This constructor does not copy the value of pnf into the newly created object
242     // On the face of it, this looks like a bug, but perhaps there is a reason for this
243     // PLEASE ADVISE IF THE BEHAVIOUR IS INCORRECT OR THE TEST CASE IS INVALID
244     public void testControlLoopForPnf() throws BuilderException {
245         Pnf pnf = new Pnf();
246         // pnf.setPnfType(PnfType.ENODEB);
247         ControlLoopPolicyBuilder builder =
248             ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400, pnf);
249         assertEquals(pnf, builder.getControlLoop().getPnf());
250
251         builder.removePnf();
252         assertNull(builder.getControlLoop().getPnf());
253     }
254
255     @Test
256     @Ignore
257     // Fails for the same reason as the above test case
258     public void testSetAndRemovePnf() throws BuilderException {
259         ControlLoopPolicyBuilder builder =
260             ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
261         assertNull(builder.getControlLoop().getPnf());
262
263         Pnf pnf = new Pnf();
264         // pnf.setPnfType(PnfType.ENODEB);
265         builder.setPnf(pnf);
266         assertEquals(pnf, builder.getControlLoop().getPnf());
267
268         builder.removePnf();
269         assertNull(builder.getControlLoop().getPnf());
270     }
271
272     @Test
273     public void testSetNullPnf() throws BuilderException {
274         ControlLoopPolicyBuilder builder =
275             ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
276
277         assertThatThrownBy(() -> {
278             builder.setPnf(null);
279         }).isInstanceOf(BuilderException.class).hasMessage("PNF must not be null");
280     }
281
282     @Test
283     public void testSetInvalidPnf() throws BuilderException {
284         ControlLoopPolicyBuilder builder =
285             ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
286
287         assertThatThrownBy(() -> {
288             builder.setPnf(new Pnf());
289         }).isInstanceOf(BuilderException.class).hasMessage("Invalid PNF - need either pnfName or pnfType");
290     }
291
292     @Test
293     public void testSetAbatement() throws BuilderException {
294         ControlLoopPolicyBuilder builder =
295             ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
296         assertFalse(builder.getControlLoop().getAbatement());
297         builder = builder.setAbatement(true);
298         assertTrue(builder.getControlLoop().getAbatement());
299     }
300
301     @Test
302     public void testSetNullAbatement() throws BuilderException {
303         assertThatThrownBy(() -> {
304             ControlLoopPolicyBuilder builder =
305                 ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
306
307             builder = builder.setAbatement(null);
308         }).isInstanceOf(BuilderException.class).hasMessage("abatement must not be null");
309     }
310
311     @Test
312     public void testTimeout() throws BuilderException {
313         //
314         // Create a builder for our policy
315         //
316         ControlLoopPolicyBuilder builder =
317             ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
318         //
319         // Test setTimeout
320         //
321         assertTrue(builder.getControlLoop().getTimeout() == 2400);
322         builder = builder.setTimeout(800);
323         assertTrue(builder.getControlLoop().getTimeout() == 800);
324         //
325         // Test calculateTimeout
326         //
327         // @formatter:off
328         Policy trigger = builder.setTriggerPolicy(PolicyParam.builder().id(UUID.randomUUID().toString())
329             .name(RESTART_VM)
330             .description(TRIGGER_RESTART)
331             .actor("APPC").target(new Target(TargetType.VM))
332             .recipe(RESTART)
333             .payload(null)
334             .retries(2)
335             .timeout(300)
336             .build());
337
338         @SuppressWarnings("unused")
339         Policy onRestartFailurePolicy = builder.setPolicyForPolicyResult(
340             PolicyParam.builder()
341                 .name(REBUILD_VM)
342                 .description("If the restart fails, rebuild it").actor("APPC")
343                 .target(new Target(TargetType.VM))
344                 .recipe(REBUILD)
345                 .payload(null)
346                 .retries(1)
347                 .timeout(600)
348                 .id(trigger.getId())
349                 .build(),
350             PolicyResult.FAILURE, PolicyResult.FAILURE_RETRIES, PolicyResult.FAILURE_TIMEOUT);
351         assertEquals(Integer.valueOf(300 + 600), builder.calculateTimeout());
352         // @formatter:on
353     }
354
355     @Test
356     public void testTriggerPolicyMethods() throws BuilderException {
357         ControlLoopPolicyBuilder builder =
358             ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
359         //
360         // Test isOpenLoop
361         //
362         assertTrue(builder.isOpenLoop());
363         //
364         // Test set initial trigger policy
365         //
366         // @formatter:off
367         Policy triggerPolicy1 = builder.setTriggerPolicy(PolicyParam.builder().id(UUID.randomUUID().toString())
368             .name(RESTART_VM)
369             .description(TRIGGER_RESTART)
370             .actor("APPC")
371             .target(new Target(TargetType.VM))
372             .recipe(RESTART)
373             .payload(null)
374             .retries(2)
375             .timeout(300)
376             .build());
377         assertFalse(builder.isOpenLoop());
378         assertEquals(builder.getControlLoop().getTrigger_policy(), triggerPolicy1.getId());
379         //
380         // Set trigger policy to a new policy
381         //
382         @SuppressWarnings("unused")
383         Policy triggerPolicy2 = builder.setTriggerPolicy(PolicyParam.builder().id(UUID.randomUUID().toString())
384             .name("Rebuild the VM")
385             .description("Upon getting the trigger event, rebuild the VM").actor("APPC")
386             .target(new Target(TargetType.VM))
387             .recipe(REBUILD)
388             .payload(null)
389             .retries(2)
390             .timeout(300)
391             .build());
392         // @formatter:on
393         //
394         // Test set trigger policy to another existing policy
395         //
396         @SuppressWarnings("unused")
397         ControlLoop cl = builder.setExistingTriggerPolicy(triggerPolicy1.getId());
398         assertTrue(builder.getControlLoop().getTrigger_policy().equals(triggerPolicy1.getId()));
399         //
400         // Test get trigger policy
401         //
402         assertTrue(builder.getTriggerPolicy().equals(triggerPolicy1));
403     }
404
405     @Test
406     public void testSetTriggerPolicyNullPolicyId() throws BuilderException {
407         ControlLoopPolicyBuilder builder =
408             ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
409
410         assertThatThrownBy(() -> {
411             builder.setExistingTriggerPolicy(null);
412         }).isInstanceOf(BuilderException.class).hasMessage("Id must not be null");
413     }
414
415     @Test
416     public void testSetTriggerPolicyNoPoliciesExist() throws BuilderException {
417         ControlLoopPolicyBuilder builder =
418             ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
419         final String unknownPolicyId = "100";
420
421         assertThatThrownBy(() -> {
422             builder.setExistingTriggerPolicy(unknownPolicyId);
423         }).isInstanceOf(BuilderException.class).hasMessage(UNKNOWN_POLICY + unknownPolicyId);
424     }
425
426     @Test
427     public void testSetTriggerPolicyUnknownPolicy() throws BuilderException {
428         ControlLoopPolicyBuilder builder =
429             ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
430         // @formatter:off
431         builder.setTriggerPolicy(PolicyParam.builder().id(UUID.randomUUID().toString())
432             .name(RESTART_VM)
433             .description(TRIGGER_RESTART)
434             .actor("APPC")
435             .target(new Target(TargetType.VM))
436             .recipe(RESTART)
437             .payload(null)
438             .retries(2)
439             .timeout(300)
440             .build());
441         // @formatter:on
442         final String unknownPolicyId = "100";
443
444         assertThatThrownBy(() -> {
445             builder.setExistingTriggerPolicy(unknownPolicyId);
446         }).isInstanceOf(BuilderException.class).hasMessage(UNKNOWN_POLICY + unknownPolicyId);
447     }
448
449     @Test
450     public void testAddRemovePolicies() throws BuilderException {
451         ControlLoopPolicyBuilder builder =
452             ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
453         // @formatter:off
454         Policy triggerPolicy = builder.setTriggerPolicy(PolicyParam.builder().id(UUID.randomUUID().toString())
455             .name(RESTART_VM)
456             .description(TRIGGER_RESTART)
457             .actor("APPC")
458             .target(new Target(TargetType.VM))
459             .recipe(RESTART)
460             .payload(null)
461             .retries(2)
462             .timeout(300)
463             .build());
464         //
465         // Test create a policy and chain it to the results of trigger policy
466         //
467         Policy onRestartFailurePolicy1 = builder.setPolicyForPolicyResult(PolicyParam.builder()
468             .name(REBUILD_VM)
469             .description(REBUILD_RESTART)
470             .actor("APPC")
471             .target(new Target(TargetType.VM))
472             .recipe(REBUILD).payload(null)
473             .retries(1)
474             .timeout(600)
475             .id(triggerPolicy.getId())
476             .build(),
477             PolicyResult.FAILURE, PolicyResult.FAILURE_EXCEPTION, PolicyResult.FAILURE_RETRIES,
478             PolicyResult.FAILURE_TIMEOUT, PolicyResult.FAILURE_GUARD);
479         //
480         assertTrue(builder.getTriggerPolicy().getFailure().equals(onRestartFailurePolicy1.getId()));
481         assertTrue(builder.getTriggerPolicy().getFailure_exception().equals(onRestartFailurePolicy1.getId()));
482         assertTrue(builder.getTriggerPolicy().getFailure_retries().equals(onRestartFailurePolicy1.getId()));
483         assertTrue(builder.getTriggerPolicy().getFailure_timeout().equals(onRestartFailurePolicy1.getId()));
484         assertTrue(builder.getTriggerPolicy().getFailure_guard().equals(onRestartFailurePolicy1.getId()));
485
486         //
487         // Test create a policy and chain it to the results of trigger policy success
488         //
489         Policy onSuccessPolicy1 = builder.setPolicyForPolicyResult(PolicyParam.builder()
490             .name("Do something")
491             .description("If the restart succeeds, do something else.")
492             .actor("APPC")
493             .target(new Target(TargetType.VM))
494             .recipe("SomethingElse")
495             .payload(null)
496             .retries(1)
497             .timeout(600)
498             .id(triggerPolicy.getId())
499             .build(),
500             PolicyResult.SUCCESS);
501         //
502         // @formatter:on
503         assertTrue(builder.getTriggerPolicy().getSuccess().equals(onSuccessPolicy1.getId()));
504
505         //
506         // Test remove policy
507         //
508         boolean removed = builder.removePolicy(onRestartFailurePolicy1.getId());
509         assertTrue(removed);
510         assertTrue(builder.getTriggerPolicy().getFailure().equals(FinalResult.FINAL_FAILURE.toString()));
511         assertTrue(
512             builder.getTriggerPolicy().getFailure_retries().equals(FinalResult.FINAL_FAILURE_RETRIES.toString()));
513         assertTrue(
514             builder.getTriggerPolicy().getFailure_timeout().equals(FinalResult.FINAL_FAILURE_TIMEOUT.toString()));
515         assertTrue(builder.getTriggerPolicy().getFailure_guard().equals(FinalResult.FINAL_FAILURE_GUARD.toString()));
516         //
517         // Create another policy and chain it to the results of trigger policy
518         //
519         // @formatter:off
520         final Policy onRestartFailurePolicy2 = builder.setPolicyForPolicyResult(
521             PolicyParam.builder()
522                 .name(REBUILD_VM)
523                 .description(REBUILD_RESTART)
524                 .actor("APPC")
525                 .target(new Target(TargetType.VM))
526                 .recipe(REBUILD)
527                 .payload(null)
528                 .retries(2)
529                 .timeout(600)
530                 .id(triggerPolicy.getId())
531                 .build(),
532             PolicyResult.FAILURE, PolicyResult.FAILURE_RETRIES, PolicyResult.FAILURE_TIMEOUT);
533         // @formatter:on
534         //
535         // Test reset policy results
536         //
537         triggerPolicy = builder.resetPolicyResults(triggerPolicy.getId());
538         assertTrue(builder.getTriggerPolicy().getFailure().equals(FinalResult.FINAL_FAILURE.toString()));
539         assertTrue(
540             builder.getTriggerPolicy().getFailure_retries().equals(FinalResult.FINAL_FAILURE_RETRIES.toString()));
541         assertTrue(
542             builder.getTriggerPolicy().getFailure_timeout().equals(FinalResult.FINAL_FAILURE_TIMEOUT.toString()));
543         //
544         // Test set the policy results to an existing operational policy
545         //
546         Policy onRestartFailurePolicy3 = builder.setPolicyForPolicyResult(onRestartFailurePolicy2.getId(),
547             triggerPolicy.getId(), PolicyResult.FAILURE, PolicyResult.FAILURE_RETRIES, PolicyResult.FAILURE_TIMEOUT);
548         assertTrue(builder.getTriggerPolicy().getFailure().equals(onRestartFailurePolicy3.getId()));
549         assertTrue(builder.getTriggerPolicy().getFailure_retries().equals(onRestartFailurePolicy3.getId()));
550         assertTrue(builder.getTriggerPolicy().getFailure_timeout().equals(onRestartFailurePolicy3.getId()));
551         //
552         // Test set the policy result for success to an existing operational policy
553         //
554         Policy onRestartFailurePolicy4 = builder.setPolicyForPolicyResult(onRestartFailurePolicy2.getId(),
555             triggerPolicy.getId(), PolicyResult.FAILURE, PolicyResult.FAILURE_EXCEPTION, PolicyResult.FAILURE_GUARD,
556             PolicyResult.FAILURE_RETRIES, PolicyResult.FAILURE_TIMEOUT, PolicyResult.SUCCESS);
557         assertTrue(builder.getTriggerPolicy().getFailure().equals(onRestartFailurePolicy4.getId()));
558         assertTrue(builder.getTriggerPolicy().getFailure_exception().equals(onRestartFailurePolicy4.getId()));
559         assertTrue(builder.getTriggerPolicy().getFailure_guard().equals(onRestartFailurePolicy4.getId()));
560         assertTrue(builder.getTriggerPolicy().getFailure_retries().equals(onRestartFailurePolicy4.getId()));
561         assertTrue(builder.getTriggerPolicy().getFailure_timeout().equals(onRestartFailurePolicy4.getId()));
562         assertTrue(builder.getTriggerPolicy().getSuccess().equals(onRestartFailurePolicy4.getId()));
563
564         //
565         // Test remove all existing operational policies
566         //
567         builder = builder.removeAllPolicies();
568         assertTrue(builder.getControlLoop().getTrigger_policy().equals(FinalResult.FINAL_OPENLOOP.toString()));
569     }
570
571     @Test
572     public void testAddToUnknownPolicy() throws BuilderException {
573         ControlLoopPolicyBuilder builder =
574             ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
575         final String policyId = "100";
576
577         assertThatThrownBy(() -> {
578             // @formatter:off
579             builder.setPolicyForPolicyResult(
580                 PolicyParam.builder()
581                     .name(REBUILD_VM)
582                     .description(REBUILD_RESTART)
583                     .actor("APPC")
584                     .target(new Target(TargetType.VM))
585                     .recipe(REBUILD)
586                     .payload(null)
587                     .retries(1)
588                     .timeout(600)
589                     .id(policyId)
590                     .build(),
591                 PolicyResult.FAILURE, PolicyResult.FAILURE_RETRIES, PolicyResult.FAILURE_TIMEOUT,
592                 PolicyResult.FAILURE_GUARD);
593             // @formatter:on
594         }).isInstanceOf(BuilderException.class).hasMessage(UNKNOWN_POLICY + policyId);
595
596     }
597
598     @Test
599     public void testAddExistingPolicyToUnknownPolicy() throws BuilderException {
600         ControlLoopPolicyBuilder builder =
601             ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
602         // @formatter:off
603         Policy triggerPolicy = builder.setTriggerPolicy(PolicyParam.builder()
604             .id(UUID.randomUUID().toString())
605             .name(RESTART_VM)
606             .description(TRIGGER_RESTART)
607             .actor("APPC")
608             .target(new Target(TargetType.VM))
609             .recipe(RESTART)
610             .payload(null)
611             .retries(2)
612             .timeout(300)
613             .build());
614
615         Policy onRestartFailurePolicy = builder.setPolicyForPolicyResult(PolicyParam.builder()
616             .name(REBUILD_VM)
617             .description(REBUILD_RESTART)
618             .actor("APPC")
619             .target(new Target(TargetType.VM))
620             .recipe(REBUILD)
621             .payload(null)
622             .retries(1)
623             .timeout(600)
624             .id(triggerPolicy.getId())
625             .build(),
626             PolicyResult.FAILURE);
627
628         // @formatter:on
629         final String unknownPolicyId = "100";
630
631         assertThatThrownBy(() -> {
632             builder.setPolicyForPolicyResult(onRestartFailurePolicy.getId(), unknownPolicyId, PolicyResult.FAILURE);
633         }).isInstanceOf(BuilderException.class).hasMessage(unknownPolicyId + " does not exist");
634
635     }
636
637     @Test
638     public void testAddUnknownExistingPolicyToPolicy() throws BuilderException {
639         ControlLoopPolicyBuilder builder =
640             ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
641         // @formatter:off
642         Policy triggerPolicy = builder.setTriggerPolicy(PolicyParam.builder()
643             .id(UUID.randomUUID().toString())
644             .name(RESTART_VM)
645             .description(TRIGGER_RESTART)
646             .actor("APPC")
647             .target(new Target(TargetType.VM))
648             .recipe(RESTART)
649             .payload(null)
650             .retries(2)
651             .timeout(300)
652             .build());
653         // @formatter:on
654
655         final String unknownPolicyId = "100";
656
657         assertThatThrownBy(() -> {
658             builder.setPolicyForPolicyResult(unknownPolicyId, triggerPolicy.getId(), PolicyResult.FAILURE);
659         }).isInstanceOf(BuilderException.class).hasMessage("Operational policy " + unknownPolicyId + " does not exist");
660
661     }
662
663     @Test
664     public void testAddOperationsAccumulateParams() throws BuilderException {
665         ControlLoopPolicyBuilder builder =
666             ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 2400);
667         // @formatter:off
668         Policy triggerPolicy =
669             builder.setTriggerPolicy(PolicyParam.builder()
670                 .id(UUID.randomUUID().toString())
671                 .name("Restart the eNodeB")
672                 .description("Upon getting the trigger event, restart the eNodeB")
673                 .actor("RANController")
674                 .target(new Target(TargetType.PNF))
675                 .recipe(RESTART)
676                 .payload(null)
677                 .retries(2)
678                 .timeout(300)
679                 .build());
680         // @formatter:on
681         //
682         // Add the operationsAccumulateParams
683         //
684         triggerPolicy =
685             builder.addOperationsAccumulateParams(triggerPolicy.getId(), new OperationsAccumulateParams("15m", 5));
686         assertNotNull(builder.getTriggerPolicy().getOperationsAccumulateParams());
687         assertEquals("15m", builder.getTriggerPolicy().getOperationsAccumulateParams().getPeriod());
688         assertTrue(builder.getTriggerPolicy().getOperationsAccumulateParams().getLimit() == 5);
689     }
690
691     @Test
692     public void testBuildSpecification() throws BuilderException {
693         //
694         // Create the builder
695         //
696         ControlLoopPolicyBuilder builder =
697             ControlLoopPolicyBuilder.Factory.buildControlLoop(UUID.randomUUID().toString(), 800);
698         //
699         // Set the first invalid trigger policy
700         //
701         // @formatter:off
702         final Policy policy1 = builder.setTriggerPolicy(
703             PolicyParam.builder()
704                 .id(UUID.randomUUID().toString())
705                 .name(RESTART_VM)
706                 .description(TRIGGER_RESTART)
707                 .actor(null)
708                 .target(null)
709                 .recipe(null)
710                 .payload(null)
711                 .retries(2)
712                 .timeout(300)
713                 .build());
714         Results results = builder.buildSpecification();
715         // @formatter:on
716         //
717         // Check that ERRORs are in results for invalid policy arguments
718         //
719         boolean invalidActor = false;
720         boolean invalidRecipe = false;
721         boolean invalidTarget = false;
722         for (Message m : results.getMessages()) {
723             if ("Policy actor is null".equals(m.getMessage()) && m.getLevel() == MessageLevel.ERROR) {
724                 invalidActor = true;
725             }
726             if ("Policy recipe is null".equals(m.getMessage()) && m.getLevel() == MessageLevel.ERROR) {
727                 invalidRecipe = true;
728             }
729             if ("Policy target is null".equals(m.getMessage()) && m.getLevel() == MessageLevel.ERROR) {
730                 invalidTarget = true;
731             }
732         }
733         //
734         assertTrue(invalidActor);
735         assertTrue(invalidRecipe);
736         assertTrue(invalidTarget);
737         //
738         // Remove the invalid policy
739         //
740         // @SuppressWarnings("unused")
741         boolean removed = builder.removePolicy(policy1.getId());
742         assertTrue(removed);
743         assertTrue(builder.getTriggerPolicy() == null);
744         //
745         // Set a valid trigger policy
746         //
747         // @formatter:off
748         Policy policy1a = builder.setTriggerPolicy(PolicyParam.builder()
749             .id(UUID.randomUUID().toString())
750             .name(REBUILD_VM)
751             .description(REBUILD_RESTART)
752             .actor("APPC")
753             .target(new Target(TargetType.VM))
754             .recipe(REBUILD)
755             .payload(null)
756             .retries(1)
757             .timeout(600)
758             .build());
759         //
760         // Set a second valid trigger policy
761         //
762         final Policy policy2 = builder.setTriggerPolicy(PolicyParam.builder()
763             .id(UUID.randomUUID().toString())
764             .name(RESTART_VM)
765             .description(TRIGGER_RESTART)
766             .actor("APPC")
767             .target(new Target(TargetType.VM))
768             .recipe(RESTART)
769             .payload(null)
770             .retries(2)
771             .timeout(300)
772             .build());
773         // @formatter:on
774         //
775         // Now, we have policy1 unreachable
776         //
777         results = builder.buildSpecification();
778         boolean unreachable = false;
779         for (Message m : results.getMessages()) {
780             if (m.getMessage().equals("Policy " + policy1a.getId() + " is not reachable.")
781                 && m.getLevel() == MessageLevel.WARNING) {
782                 unreachable = true;
783                 break;
784             }
785         }
786         assertTrue(unreachable);
787         //
788         // Set policy1a for the failure results of policy2
789         //
790         policy1a = builder.setPolicyForPolicyResult(policy1a.getId(), policy2.getId(), PolicyResult.FAILURE,
791             PolicyResult.FAILURE_RETRIES, PolicyResult.FAILURE_TIMEOUT);
792         results = builder.buildSpecification();
793         boolean invalidTimeout = false;
794         for (Message m : results.getMessages()) {
795             if ("controlLoop overall timeout is less than the sum of operational policy timeouts."
796                 .equals(m.getMessage()) && m.getLevel() == MessageLevel.ERROR) {
797                 invalidTimeout = true;
798                 break;
799             }
800         }
801         assertTrue(invalidTimeout);
802         //
803         // Remove policy2 (revert controlLoop back to open loop)
804         //
805         removed = builder.removePolicy(policy2.getId());
806         //
807         // ControlLoop is open loop now, but it still has policies (policy1)
808         //
809         results = builder.buildSpecification();
810         unreachable = false;
811         for (Message m : results.getMessages()) {
812             if ("Open Loop policy contains policies. The policies will never be invoked.".equals(m.getMessage())
813                 && m.getLevel() == MessageLevel.WARNING) {
814                 unreachable = true;
815                 break;
816             }
817         }
818         assertTrue(unreachable);
819     }
820
821     @Test
822     public void test1() throws Exception {
823         this.test("src/test/resources/v1.0.0/policy_Test.yaml");
824     }
825
826     @Test
827     public void testEvilYaml() throws Exception {
828         try (InputStream is = new FileInputStream(new File("src/test/resources/v1.0.0/test_evil.yaml"))) {
829             //
830             // Attempt to read the yaml into our Java Object
831             //
832             Yaml yaml = new Yaml(new Constructor(ControlLoopPolicy.class));
833             assertThatThrownBy(() -> yaml.load(is)).isInstanceOf(YAMLException.class);
834         }
835     }
836
837     /**
838      * Does the actual test.
839      *
840      * @param testFile input file
841      * @throws Exception if an error occurs
842      */
843     public void test(String testFile) throws Exception {
844         try (InputStream is = new FileInputStream(new File(testFile))) {
845             //
846             // Read the yaml into our Java Object
847             //
848             Yaml yaml = new Yaml(new Constructor(ControlLoopPolicy.class));
849             Object obj = yaml.load(is);
850             assertNotNull(obj);
851             assertTrue(obj instanceof ControlLoopPolicy);
852             ControlLoopPolicy policyTobuild = (ControlLoopPolicy) obj;
853             //
854             // Now we're going to try to use the builder to build this.
855             //
856             ControlLoopPolicyBuilder builder = ControlLoopPolicyBuilder.Factory.buildControlLoop(
857                 policyTobuild.getControlLoop().getControlLoopName(), policyTobuild.getControlLoop().getTimeout());
858             //
859             // Add services
860             //
861             if (policyTobuild.getControlLoop().getServices() != null) {
862                 builder = builder.addService(policyTobuild.getControlLoop().getServices()
863                     .toArray(new Service[policyTobuild.getControlLoop().getServices().size()]));
864             }
865             //
866             // Add resources
867             //
868             if (policyTobuild.getControlLoop().getResources() != null) {
869                 builder = builder.addResource(policyTobuild.getControlLoop().getResources()
870                     .toArray(new Resource[policyTobuild.getControlLoop().getResources().size()]));
871             }
872             //
873             // Set pnf
874             //
875             if (policyTobuild.getControlLoop().getPnf() != null) {
876                 builder = builder.setPnf(policyTobuild.getControlLoop().getPnf());
877             }
878             //
879             // Add the policies and be sure to set the trigger policy
880             //
881             if (policyTobuild.getPolicies() != null) {
882                 setTriggerPolicies(policyTobuild, builder);
883             }
884
885             // Question : how to change policy ID and results by using builder ??
886
887             @SuppressWarnings("unused")
888             Results results = builder.buildSpecification();
889         }
890
891     }
892
893     private void setTriggerPolicies(ControlLoopPolicy policyTobuild, ControlLoopPolicyBuilder builder)
894         throws BuilderException {
895         for (Policy policy : policyTobuild.getPolicies()) {
896             if (policy.getId() == policyTobuild.getControlLoop().getTrigger_policy()) {
897                 // @formatter:off
898                 builder.setTriggerPolicy(PolicyParam.builder().id(UUID.randomUUID().toString())
899                         .name(policy.getName())
900                         .description(policy.getDescription())
901                         .actor(policy.getActor())
902                         .target(policy.getTarget())
903                         .recipe(policy.getRecipe())
904                         .payload(null)
905                         .retries(policy.getRetry())
906                         .timeout(policy.getTimeout())
907                         .build());
908                 // @formatter:on
909             }
910         }
911     }
912 }