2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017-2018 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.eventmanager;
23 import static org.junit.Assert.assertEquals;
24 import static org.junit.Assert.assertNotNull;
25 import static org.junit.Assert.assertNull;
26 import static org.junit.Assert.assertTrue;
27 import static org.junit.Assert.fail;
29 import java.io.FileInputStream;
30 import java.io.IOException;
31 import java.io.InputStream;
32 import java.nio.charset.StandardCharsets;
33 import java.time.Instant;
34 import java.util.HashMap;
35 import java.util.UUID;
36 import org.apache.commons.io.IOUtils;
37 import org.junit.AfterClass;
38 import org.junit.BeforeClass;
39 import org.junit.Test;
40 import org.onap.policy.aai.AaiGetVnfResponse;
41 import org.onap.policy.aai.AaiGetVserverResponse;
42 import org.onap.policy.aai.AaiNqVServer;
43 import org.onap.policy.aai.RelatedToProperty;
44 import org.onap.policy.aai.Relationship;
45 import org.onap.policy.aai.RelationshipData;
46 import org.onap.policy.aai.RelationshipList;
47 import org.onap.policy.aai.util.AaiException;
48 import org.onap.policy.common.endpoints.http.server.HttpServletServer;
49 import org.onap.policy.controlloop.ControlLoopEventStatus;
50 import org.onap.policy.controlloop.ControlLoopException;
51 import org.onap.policy.controlloop.ControlLoopNotificationType;
52 import org.onap.policy.controlloop.Util;
53 import org.onap.policy.controlloop.VirtualControlLoopEvent;
54 import org.onap.policy.controlloop.VirtualControlLoopNotification;
55 import org.onap.policy.controlloop.eventmanager.ControlLoopEventManager.NEW_EVENT_STATUS;
56 import org.onap.policy.controlloop.policy.ControlLoopPolicy;
57 import org.onap.policy.controlloop.policy.PolicyResult;
58 import org.onap.policy.drools.system.PolicyEngine;
59 import org.onap.policy.guard.GuardResult;
60 import org.onap.policy.guard.PolicyGuard;
61 import org.onap.policy.guard.PolicyGuard.LockResult;
62 import org.onap.policy.guard.TargetLock;
63 import org.slf4j.Logger;
64 import org.slf4j.LoggerFactory;
66 public class ControlLoopEventManagerTest {
67 private static final Logger logger = LoggerFactory.getLogger(ControlLoopEventManagerTest.class);
69 private static VirtualControlLoopEvent onset;
72 onset = new VirtualControlLoopEvent();
73 onset.setClosedLoopControlName("ControlLoop-vUSP");
74 onset.setRequestId(UUID.randomUUID());
75 onset.setTarget("VM_NAME");
76 onset.setClosedLoopAlarmStart(Instant.now());
77 onset.setAai(new HashMap<String, String>());
78 onset.getAai().put("cloud-region.identity-url", "foo");
79 onset.getAai().put("vserver.selflink", "bar");
80 onset.getAai().put("generic-vnf.vnf-id", "83f674e8-7555-44d7-9a39-bdc3770b0491");
81 onset.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
88 public static void setUpSimulator() {
90 org.onap.policy.simulators.Util.buildAaiSim();
91 } catch (Exception e) {
94 PolicyEngine.manager.setEnvironmentProperty("aai.username", "AAI");
95 PolicyEngine.manager.setEnvironmentProperty("aai.password", "AAI");
96 PolicyEngine.manager.setEnvironmentProperty("aai.url", "http://localhost:6666");
100 public static void tearDownSimulator() {
101 HttpServletServer.factory.destroy();
105 public void testAaiVnfInfo() {
106 final Util.Pair<ControlLoopPolicy, String> pair = Util.loadYaml("src/test/resources/test.yaml");
107 onset.setClosedLoopControlName(pair.key.getControlLoop().getControlLoopName());
109 AaiGetVnfResponse response = getQueryByVnfId2(
110 PolicyEngine.manager.getEnvironmentProperty("aai.url")
111 + "/aai/v11/network/generic-vnfs/generic-vnf/",
112 PolicyEngine.manager.getEnvironmentProperty("aai.username"),
113 PolicyEngine.manager.getEnvironmentProperty("aai.password"), UUID.randomUUID(),
114 "5e49ca06-2972-4532-9ed4-6d071588d792");
115 assertNotNull(response);
116 logger.info("testAAIVnfInfo test result is " + (response == null ? "null" : "not null"));
117 } catch (Exception e) {
118 logger.error("testAAIVnfInfo Exception: ", e);
119 fail(e.getMessage());
124 public void testAaiVnfInfo2() {
125 final Util.Pair<ControlLoopPolicy, String> pair = Util.loadYaml("src/test/resources/test.yaml");
126 onset.setClosedLoopControlName(pair.key.getControlLoop().getControlLoopName());
128 AaiGetVnfResponse response = getQueryByVnfName2(
129 PolicyEngine.manager.getEnvironmentProperty("aai.url")
130 + "/aai/v11/network/generic-vnfs/generic-vnf?vnf-name=",
131 PolicyEngine.manager.getEnvironmentProperty("aai.username"),
132 PolicyEngine.manager.getEnvironmentProperty("aai.password"), UUID.randomUUID(), "lll_vnf_010317");
133 assertNotNull(response);
134 logger.info("testAAIVnfInfo2 test result is " + (response == null ? "null" : "not null"));
135 } catch (Exception e) {
136 logger.error("testAAIVnfInfo2 Exception: ", e);
137 fail(e.getMessage());
142 public void testAaiVserver() {
143 final Util.Pair<ControlLoopPolicy, String> pair = Util.loadYaml("src/test/resources/test.yaml");
144 onset.setClosedLoopControlName(pair.key.getControlLoop().getControlLoopName());
146 AaiGetVserverResponse response = getQueryByVserverName2(
147 PolicyEngine.manager.getEnvironmentProperty("aai.url") + "/aai/v11/nodes/vservers?vserver-name=",
148 PolicyEngine.manager.getEnvironmentProperty("aai.username"),
149 PolicyEngine.manager.getEnvironmentProperty("aai.password"), UUID.randomUUID(),
150 "USMSO1SX7NJ0103UJZZ01-vjunos0");
151 assertNotNull(response);
152 logger.info("testAAIVserver test result is " + (response == null ? "null" : "not null"));
153 } catch (Exception e) {
154 logger.error("testAAIVserver Exception: ", e);
155 fail(e.getMessage());
160 public void testIsClosedLoopDisabled() {
162 // Load up the policy
164 final Util.Pair<ControlLoopPolicy, String> pair = Util.loadYaml("src/test/resources/test.yaml");
165 onset.setClosedLoopControlName(pair.key.getControlLoop().getControlLoopName());
168 logger.info("testIsClosedLoopDisabled --");
169 AaiGetVnfResponse response = getQueryByVnfId2(
170 PolicyEngine.manager.getEnvironmentProperty("aai.url")
171 + "/aai/v11/network/generic-vnfs/generic-vnf/",
172 PolicyEngine.manager.getEnvironmentProperty("aai.username"),
173 PolicyEngine.manager.getEnvironmentProperty("aai.password"), UUID.randomUUID(),
174 "5e49ca06-2972-4532-9ed4-6d071588d792");
175 assertNotNull(response);
178 // boolean disabled = ControlLoopEventManager.isClosedLoopDisabled(response);
179 // logger.info("QueryByVnfID - isClosedLoopDisabled: " + disabled);
181 response = getQueryByVnfName2(
182 PolicyEngine.manager.getEnvironmentProperty("aai.url")
183 + "/aai/v11/network/generic-vnfs/generic-vnf?vnf-name=",
184 PolicyEngine.manager.getEnvironmentProperty("aai.username"),
185 PolicyEngine.manager.getEnvironmentProperty("aai.password"), UUID.randomUUID(), "lll_vnf_010317");
186 assertNotNull(response);
188 // disabled = ControlLoopEventManager.isClosedLoopDisabled(response);
189 // logger.info("QueryByVnfName - isClosedLoopDisabled: " + disabled);
191 AaiGetVserverResponse response2 = getQueryByVserverName2(
192 PolicyEngine.manager.getEnvironmentProperty("aai.url") + "/aai/v11/nodes/vservers?vserver-name=",
193 PolicyEngine.manager.getEnvironmentProperty("aai.user"),
194 PolicyEngine.manager.getEnvironmentProperty("aai.password"), UUID.randomUUID(),
195 "USMSO1SX7NJ0103UJZZ01-vjunos0");
196 assertNotNull(response2);
198 // disabled = ControlLoopEventManager.isClosedLoopDisabled(response2);
199 // logger.info("QueryByVserverName - isClosedLoopDisabled: " + disabled);
200 } catch (Exception e) {
201 fail(e.getMessage());
206 public void abatemetCheckEventSyntaxTest() {
207 VirtualControlLoopEvent event = new VirtualControlLoopEvent();
208 event.setClosedLoopControlName("abatementAAI");
209 event.setRequestId(UUID.randomUUID());
210 event.setTarget("generic-vnf.vnf-id");
211 event.setClosedLoopAlarmStart(Instant.now());
212 event.setClosedLoopEventStatus(ControlLoopEventStatus.ABATED);
213 ControlLoopEventManager manager = makeManager(event);
214 assertNull(manager.getVnfResponse());
215 assertNull(manager.getVserverResponse());
217 manager.checkEventSyntax(event);
218 } catch (ControlLoopException e) {
219 logger.debug("ControlLoopException in abatemetCheckEventSyntaxTest: " + e.getMessage());
221 fail("Exception in check event syntax");
223 assertNull(manager.getVnfResponse());
224 assertNull(manager.getVserverResponse());
227 event.setAai(new HashMap<>());
228 event.getAai().put("generic-vnf.vnf-name", "abatementTest");
230 manager.checkEventSyntax(event);
231 } catch (ControlLoopException e) {
232 logger.debug("ControlLoopException in abatemetCheckEventSyntaxTest: " + e.getMessage());
234 fail("Exception in check event syntax");
236 assertNull(manager.getVnfResponse());
237 assertNull(manager.getVserverResponse());
241 public void subsequentOnsetTest() {
242 UUID requestId = UUID.randomUUID();
243 VirtualControlLoopEvent event = new VirtualControlLoopEvent();
244 event.setClosedLoopControlName("TwoOnsetTest");
245 event.setRequestId(requestId);
246 event.setTarget("generic-vnf.vnf-id");
247 event.setClosedLoopAlarmStart(Instant.now());
248 event.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
249 event.setAai(new HashMap<>());
250 event.getAai().put("generic-vnf.vnf-name", "onsetOne");
252 ControlLoopEventManager manager = makeManager(event);
253 VirtualControlLoopNotification notification = manager.activate(event);
255 assertNotNull(notification);
256 assertEquals(ControlLoopNotificationType.ACTIVE, notification.getNotification());
258 ControlLoopEventManager.NEW_EVENT_STATUS status = null;
260 status = manager.onNewEvent(event);
261 } catch (AaiException e) {
262 logger.warn(e.toString());
263 fail("A&AI Query Failed");
265 assertNotNull(status);
266 assertEquals(ControlLoopEventManager.NEW_EVENT_STATUS.FIRST_ONSET, status);
268 AaiGetVnfResponse response = manager.getVnfResponse();
269 assertNotNull(response);
270 assertNull(manager.getVserverResponse());
272 VirtualControlLoopEvent event2 = new VirtualControlLoopEvent();
273 event2.setClosedLoopControlName("TwoOnsetTest");
274 event2.setRequestId(requestId);
275 event2.setTarget("generic-vnf.vnf-id");
276 event2.setClosedLoopAlarmStart(Instant.now());
277 event2.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
278 event2.setAai(new HashMap<>());
279 event2.getAai().put("generic-vnf.vnf-name", "onsetTwo");
283 status = manager.onNewEvent(event2);
284 } catch (AaiException e) {
285 logger.warn(e.toString());
286 fail("A&AI Query Failed");
288 assertEquals(ControlLoopEventManager.NEW_EVENT_STATUS.SUBSEQUENT_ONSET, status);
289 AaiGetVnfResponse response2 = manager.getVnfResponse();
290 assertNotNull(response2);
291 // We should not have queried AAI, so the stored response should be the same
292 assertEquals(response, response2);
293 assertNull(manager.getVserverResponse());
297 * Simulate a response.
299 public static AaiGetVnfResponse getQueryByVnfId2(String urlGet, String username, String password, UUID requestId,
301 AaiGetVnfResponse response = new AaiGetVnfResponse();
303 response.setVnfId("83f674e8-7555-44d7-9a39-bdc3770b0491");
304 response.setVnfName("lll_vnf_010317");
305 response.setVnfType("Basa-122216-Service/VidVsamp12BaseVolume 1");
306 response.setServiceId("a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb");
307 response.setOrchestrationStatus("Created");
308 response.setInMaint(false);
309 response.setIsClosedLoopDisabled(false);
310 response.setResourceVersion("1494001988835");
311 response.setModelInvariantId("f18be3cd-d446-456e-9109-121d9b62feaa");
313 final RelationshipList relationshipList = new RelationshipList();
314 final Relationship relationship = new Relationship();
315 RelationshipData relationshipDataItem = new RelationshipData();
317 relationshipDataItem.setRelationshipKey("customer.global-customer-id");
318 relationshipDataItem.setRelationshipValue("MSO_1610_ST");
319 relationship.getRelationshipData().add(relationshipDataItem);
321 relationshipDataItem.setRelationshipKey("service-subscription.service-type");
322 relationshipDataItem.setRelationshipValue("MSO-dev-service-type");
323 relationship.getRelationshipData().add(relationshipDataItem);
325 relationshipDataItem.setRelationshipKey("service-instance.service-instance-id");
326 relationshipDataItem.setRelationshipValue("e1e9c97c-02c0-4919-9b4c-eb5d5ef68970");
327 relationship.getRelationshipData().add(relationshipDataItem);
329 RelatedToProperty item = new RelatedToProperty();
330 item.setPropertyKey("service-instance.service-instance-name");
331 item.setPropertyValue("lll_svc_010317");
332 relationship.getRelatedToProperty().add(item);
334 relationship.setRelatedTo("service-instance");
335 relationship.setRelatedLink(
336 "/aai/v11/business/customers/customer/MSO_1610_ST/service-subscriptions/service-subscription"
337 + "/MSO-dev-service-type/service-instances/service-instance/"
338 + "e1e9c97c-02c0-4919-9b4c-eb5d5ef68970");
340 relationshipList.getRelationships().add(relationship);
341 response.setRelationshipList(relationshipList);
347 * Simulate a response.
349 public static AaiGetVnfResponse getQueryByVnfName2(String urlGet, String username, String password, UUID requestId,
351 AaiGetVnfResponse response = new AaiGetVnfResponse();
353 response.setVnfId("83f674e8-7555-44d7-9a39-bdc3770b0491");
354 response.setVnfName("lll_vnf_010317");
355 response.setVnfType("Basa-122216-Service/VidVsamp12BaseVolume 1");
356 response.setServiceId("a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb");
357 response.setOrchestrationStatus("Created");
358 response.setInMaint(false);
359 response.setIsClosedLoopDisabled(false);
360 response.setResourceVersion("1494001988835");
361 response.setModelInvariantId("f18be3cd-d446-456e-9109-121d9b62feaa");
363 final RelationshipList relationshipList = new RelationshipList();
364 final Relationship relationship = new Relationship();
365 RelationshipData relationshipDataItem = new RelationshipData();
367 relationshipDataItem.setRelationshipKey("customer.global-customer-id");
368 relationshipDataItem.setRelationshipValue("MSO_1610_ST");
369 relationship.getRelationshipData().add(relationshipDataItem);
371 relationshipDataItem.setRelationshipKey("service-subscription.service-type");
372 relationshipDataItem.setRelationshipValue("MSO-dev-service-type");
373 relationship.getRelationshipData().add(relationshipDataItem);
375 relationshipDataItem.setRelationshipKey("service-instance.service-instance-id");
376 relationshipDataItem.setRelationshipValue("e1e9c97c-02c0-4919-9b4c-eb5d5ef68970");
377 relationship.getRelationshipData().add(relationshipDataItem);
379 RelatedToProperty item = new RelatedToProperty();
380 item.setPropertyKey("service-instance.service-instance-name");
381 item.setPropertyValue("lll_svc_010317");
382 relationship.getRelatedToProperty().add(item);
384 relationship.setRelatedTo("service-instance");
385 relationship.setRelatedLink(
386 "/aai/v11/business/customers/customer/MSO_1610_ST/service-subscriptions/service-subscription"
387 + "/MSO-dev-service-type/service-instances/service-instance/"
388 + "e1e9c97c-02c0-4919-9b4c-eb5d5ef68970");
390 relationshipList.getRelationships().add(relationship);
391 response.setRelationshipList(relationshipList);
397 * Simulate a response.
399 public static AaiGetVserverResponse getQueryByVserverName2(String urlGet, String username, String password,
400 UUID requestId, String key) {
401 AaiGetVserverResponse response = new AaiGetVserverResponse();
403 AaiNqVServer svr = new AaiNqVServer();
405 svr.setVserverId("d0668d4f-c25e-4a1b-87c4-83845c01efd8");
406 svr.setVserverName("USMSO1SX7NJ0103UJZZ01-vjunos0");
407 svr.setVserverName2("vjunos0");
408 svr.setVserverSelflink(
409 "https://aai-ext1.test.att.com:8443/aai/v7/cloud-infrastructure/cloud-regions/cloud-region/att-aic/AAIAIC25/tenants/tenant/USMSO1SX7NJ0103UJZZ01%3A%3AuCPE-VMS/vservers/vserver/d0668d4f-c25e-4a1b-87c4-83845c01efd8");
410 svr.setInMaint(false);
411 svr.setIsClosedLoopDisabled(false);
412 svr.setResourceVersion("1494001931513");
414 final RelationshipList relationshipList = new RelationshipList();
415 final Relationship relationship = new Relationship();
416 RelationshipData relationshipDataItem = new RelationshipData();
418 relationshipDataItem.setRelationshipKey("customer.global-customer-id");
419 relationshipDataItem.setRelationshipValue("MSO_1610_ST");
420 relationship.getRelationshipData().add(relationshipDataItem);
422 relationshipDataItem.setRelationshipKey("service-subscription.service-type");
423 relationshipDataItem.setRelationshipValue("MSO-dev-service-type");
424 relationship.getRelationshipData().add(relationshipDataItem);
426 relationshipDataItem.setRelationshipKey("service-instance.service-instance-id");
427 relationshipDataItem.setRelationshipValue("e1e9c97c-02c0-4919-9b4c-eb5d5ef68970");
428 relationship.getRelationshipData().add(relationshipDataItem);
430 RelatedToProperty item = new RelatedToProperty();
431 item.setPropertyKey("service-instance.service-instance-name");
432 item.setPropertyValue("lll_svc_010317");
433 relationship.getRelatedToProperty().add(item);
435 relationship.setRelatedTo("service-instance");
436 relationship.setRelatedLink(
437 "/aai/v11/business/customers/customer/MSO_1610_ST/service-subscriptions/service-subscription"
438 + "/MSO-dev-service-type/service-instances/service-instance/"
439 + "e1e9c97c-02c0-4919-9b4c-eb5d5ef68970");
441 relationshipList.getRelationships().add(relationship);
442 svr.setRelationshipList(relationshipList);
444 response.getVserver().add(svr);
450 public void testMethods() {
451 UUID requestId = UUID.randomUUID();
452 ControlLoopEventManager clem = new ControlLoopEventManager("MyClosedLoopName", requestId);
454 assertEquals("MyClosedLoopName", clem.getClosedLoopControlName());
455 assertEquals(requestId, clem.getRequestID());
457 clem.setActivated(true);
458 assertEquals(true, clem.isActivated());
460 clem.setControlLoopResult("SUCCESS");
461 assertEquals("SUCCESS", clem.getControlLoopResult());
463 clem.setControlLoopTimedOut();
464 assertEquals(true, clem.isControlLoopTimedOut());
466 clem.setNumAbatements(12345);
467 assertEquals(Integer.valueOf(12345), clem.getNumAbatements());
469 clem.setNumOnsets(54321);
470 assertEquals(Integer.valueOf(54321), clem.getNumOnsets());
472 assertNull(clem.getOnsetEvent());
473 assertNull(clem.getAbatementEvent());
474 assertNull(clem.getProcessor());
476 assertEquals(true, clem.isActive());
477 assertEquals(false, clem.releaseLock());
478 assertEquals(true, clem.isControlLoopTimedOut());
480 assertNull(clem.unlockCurrentOperation());
484 public void testAlreadyActivated() {
485 UUID requestId = UUID.randomUUID();
486 VirtualControlLoopEvent event = new VirtualControlLoopEvent();
487 event.setClosedLoopControlName("TwoOnsetTest");
488 event.setRequestId(requestId);
489 event.setTarget("generic-vnf.vnf-id");
490 event.setClosedLoopAlarmStart(Instant.now());
491 event.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
492 event.setAai(new HashMap<>());
493 event.getAai().put("generic-vnf.vnf-name", "onsetOne");
495 ControlLoopEventManager manager = makeManager(event);
496 manager.setActivated(true);
497 VirtualControlLoopNotification notification = manager.activate(event);
498 assertEquals(ControlLoopNotificationType.REJECTED, notification.getNotification());
502 public void testActivationYaml() throws IOException {
503 InputStream is = new FileInputStream(new File("src/test/resources/test.yaml"));
504 final String yamlString = IOUtils.toString(is, StandardCharsets.UTF_8);
506 InputStream isBad = new FileInputStream(new File("src/test/resources/notutf8.yaml"));
507 final String yamlStringBad = IOUtils.toString(isBad, StandardCharsets.UTF_8);
509 UUID requestId = UUID.randomUUID();
510 VirtualControlLoopEvent event = new VirtualControlLoopEvent();
511 event.setClosedLoopControlName("TwoOnsetTest");
512 event.setRequestId(requestId);
513 event.setTarget("generic-vnf.vnf-id");
514 event.setClosedLoopAlarmStart(Instant.now());
515 event.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
516 event.setAai(new HashMap<>());
517 event.getAai().put("generic-vnf.vnf-name", "onsetOne");
519 ControlLoopEventManager manager = makeManager(event);
521 // Null YAML should fail
522 VirtualControlLoopNotification notificationNull = manager.activate(null, event);
523 assertNotNull(notificationNull);
524 assertEquals(ControlLoopNotificationType.REJECTED, notificationNull.getNotification());
526 // Empty YAML should fail
527 VirtualControlLoopNotification notificationEmpty = manager.activate("", event);
528 assertNotNull(notificationEmpty);
529 assertEquals(ControlLoopNotificationType.REJECTED, notificationEmpty.getNotification());
531 // Bad YAML should fail
532 VirtualControlLoopNotification notificationBad = manager.activate(yamlStringBad, event);
533 assertNotNull(notificationBad);
534 assertEquals(ControlLoopNotificationType.REJECTED, notificationBad.getNotification());
536 VirtualControlLoopNotification notification = manager.activate(yamlString, event);
537 assertNotNull(notification);
538 assertEquals(ControlLoopNotificationType.ACTIVE, notification.getNotification());
540 // Another activate should fail
541 VirtualControlLoopNotification notificationActive = manager.activate(yamlString, event);
542 assertNotNull(notificationActive);
543 assertEquals(ControlLoopNotificationType.REJECTED, notificationActive.getNotification());
547 public void testControlLoopFinal() throws ControlLoopException, IOException {
548 InputStream is = new FileInputStream(new File("src/test/resources/test.yaml"));
549 final String yamlString = IOUtils.toString(is, StandardCharsets.UTF_8);
551 UUID requestId = UUID.randomUUID();
552 VirtualControlLoopEvent event = new VirtualControlLoopEvent();
553 event.setClosedLoopControlName("TwoOnsetTest");
554 event.setRequestId(requestId);
555 event.setTarget("generic-vnf.vnf-id");
556 event.setClosedLoopAlarmStart(Instant.now());
557 event.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
558 event.setAai(new HashMap<>());
559 event.getAai().put("generic-vnf.vnf-name", "onsetOne");
561 ControlLoopEventManager manager = makeManager(event);
563 manager.isControlLoopFinal();
564 fail("test should throw an exception here");
565 } catch (ControlLoopException e) {
566 assertEquals("ControlLoopEventManager MUST be activated first.", e.getMessage());
569 manager.setActivated(true);
571 manager.isControlLoopFinal();
572 fail("test should throw an exception here");
573 } catch (ControlLoopException e) {
574 assertEquals("No onset event for ControlLoopEventManager.", e.getMessage());
577 manager.setActivated(false);
578 VirtualControlLoopNotification notification = manager.activate(yamlString, event);
579 assertNotNull(notification);
580 assertEquals(ControlLoopNotificationType.ACTIVE, notification.getNotification());
582 VirtualControlLoopNotification clfNotification = manager.isControlLoopFinal();
583 assertNull(clfNotification);
585 manager.getProcessor().nextPolicyForResult(PolicyResult.SUCCESS);
586 clfNotification = manager.isControlLoopFinal();
587 assertNotNull(clfNotification);
588 assertEquals(ControlLoopNotificationType.FINAL_SUCCESS, clfNotification.getNotification());
590 manager = new ControlLoopEventManager(event.getClosedLoopControlName(), event.getRequestId());
591 notification = manager.activate(yamlString, event);
592 assertNotNull(notification);
593 assertEquals(ControlLoopNotificationType.ACTIVE, notification.getNotification());
595 manager.getProcessor().nextPolicyForResult(PolicyResult.FAILURE_EXCEPTION);
596 clfNotification = manager.isControlLoopFinal();
597 assertNotNull(clfNotification);
598 assertEquals(ControlLoopNotificationType.FINAL_FAILURE, clfNotification.getNotification());
600 manager = new ControlLoopEventManager(event.getClosedLoopControlName(), event.getRequestId());
601 notification = manager.activate(yamlString, event);
602 assertNotNull(notification);
603 assertEquals(ControlLoopNotificationType.ACTIVE, notification.getNotification());
605 manager.getProcessor().nextPolicyForResult(PolicyResult.FAILURE_GUARD);
606 clfNotification = manager.isControlLoopFinal();
607 assertNotNull(clfNotification);
608 assertEquals(ControlLoopNotificationType.FINAL_FAILURE, clfNotification.getNotification());
610 manager.setControlLoopTimedOut();
611 clfNotification = manager.isControlLoopFinal();
612 assertNotNull(clfNotification);
613 assertEquals(ControlLoopNotificationType.FINAL_FAILURE, clfNotification.getNotification());
617 public void testProcessControlLoop() throws ControlLoopException, IOException, AaiException {
618 InputStream is = new FileInputStream(new File("src/test/resources/test.yaml"));
619 final String yamlString = IOUtils.toString(is, StandardCharsets.UTF_8);
621 UUID requestId = UUID.randomUUID();
622 VirtualControlLoopEvent event = new VirtualControlLoopEvent();
623 event.setClosedLoopControlName("TwoOnsetTest");
624 event.setRequestId(requestId);
625 event.setTarget("generic-vnf.vnf-id");
626 event.setClosedLoopAlarmStart(Instant.now());
627 event.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
628 event.setAai(new HashMap<>());
629 event.getAai().put("generic-vnf.vnf-name", "onsetOne");
631 ControlLoopEventManager manager = makeManager(event);
633 manager.processControlLoop();
634 fail("test should throw an exception here");
635 } catch (Exception e) {
636 assertEquals("ControlLoopEventManager MUST be activated first.", e.getMessage());
639 manager.setActivated(true);
641 manager.processControlLoop();
642 fail("test should throw an exception here");
643 } catch (Exception e) {
644 assertEquals("No onset event for ControlLoopEventManager.", e.getMessage());
647 manager.setActivated(false);
648 VirtualControlLoopNotification notification = manager.activate(yamlString, event);
649 assertNotNull(notification);
650 assertEquals(ControlLoopNotificationType.ACTIVE, notification.getNotification());
652 ControlLoopOperationManager clom = manager.processControlLoop();
654 assertNull(clom.getOperationResult());
656 // Test operation in progress
658 manager.processControlLoop();
659 fail("test should throw an exception here");
660 } catch (Exception e) {
661 assertEquals("Already working an Operation, do not call this method.", e.getMessage());
664 manager = new ControlLoopEventManager(event.getClosedLoopControlName(), event.getRequestId());
665 notification = manager.activate(yamlString, event);
666 assertNotNull(notification);
667 assertEquals(ControlLoopNotificationType.ACTIVE, notification.getNotification());
669 manager.getProcessor().nextPolicyForResult(PolicyResult.FAILURE_GUARD);
670 VirtualControlLoopNotification clfNotification = manager.isControlLoopFinal();
671 assertNotNull(clfNotification);
672 assertEquals(ControlLoopNotificationType.FINAL_FAILURE, clfNotification.getNotification());
674 // Test operation completed
676 manager.processControlLoop();
677 fail("test should throw an exception here");
678 } catch (Exception e) {
679 assertEquals("Control Loop is in FINAL state, do not call this method.", e.getMessage());
682 manager = new ControlLoopEventManager(event.getClosedLoopControlName(), event.getRequestId());
683 notification = manager.activate(yamlString, event);
684 assertNotNull(notification);
685 assertEquals(ControlLoopNotificationType.ACTIVE, notification.getNotification());
686 manager.getProcessor().nextPolicyForResult(PolicyResult.FAILURE);
688 // Test operation with no next policy defined
690 manager.processControlLoop();
691 fail("test should throw an exception here");
692 } catch (Exception e) {
693 assertEquals("The target type is null", e.getMessage());
698 public void testFinishOperation() throws IOException, ControlLoopException, AaiException {
699 InputStream is = new FileInputStream(new File("src/test/resources/testSOactor.yaml"));
700 final String yamlString = IOUtils.toString(is, StandardCharsets.UTF_8);
702 InputStream isStd = new FileInputStream(new File("src/test/resources/test.yaml"));
703 final String yamlStringStd = IOUtils.toString(isStd, StandardCharsets.UTF_8);
705 UUID requestId = UUID.randomUUID();
706 VirtualControlLoopEvent event = new VirtualControlLoopEvent();
707 event.setClosedLoopControlName("TwoOnsetTest");
708 event.setRequestId(requestId);
709 event.setTarget("generic-vnf.vnf-id");
710 event.setClosedLoopAlarmStart(Instant.now());
711 event.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
712 event.setAai(new HashMap<>());
713 event.getAai().put("generic-vnf.vnf-id", "onsetOne");
715 ControlLoopEventManager manager = makeManager(event);
717 manager.finishOperation(null);
718 fail("test should throw an exception here");
719 } catch (Exception e) {
720 assertEquals("No operation to finish.", e.getMessage());
723 manager.setActivated(true);
725 manager.finishOperation(null);
726 fail("test should throw an exception here");
727 } catch (Exception e) {
728 assertEquals("No operation to finish.", e.getMessage());
731 manager.setActivated(false);
732 VirtualControlLoopNotification notification = manager.activate(yamlString, event);
733 assertNotNull(notification);
734 assertEquals(ControlLoopNotificationType.ACTIVE, notification.getNotification());
737 manager.lockCurrentOperation();
738 fail("test should throw an exception here");
739 } catch (Exception e) {
740 assertEquals("Do not have a current operation.", e.getMessage());
743 assertNull(manager.unlockCurrentOperation());
745 ControlLoopOperationManager clom = manager.processControlLoop();
747 assertNull(clom.getOperationResult());
749 LockResult<GuardResult, TargetLock> lockLock = manager.lockCurrentOperation();
750 assertNotNull(lockLock);
751 assertEquals(GuardResult.LOCK_ACQUIRED, lockLock.getA());
753 LockResult<GuardResult, TargetLock> lockLockAgain = manager.lockCurrentOperation();
754 assertNotNull(lockLockAgain);
755 assertEquals(GuardResult.LOCK_ACQUIRED, lockLockAgain.getA());
756 assertEquals(lockLock.getB(), lockLockAgain.getB());
758 assertEquals(lockLock.getB(), manager.unlockCurrentOperation());
759 assertNull(manager.unlockCurrentOperation());
761 lockLock = manager.lockCurrentOperation();
762 assertNotNull(lockLock);
763 PolicyGuard.unlockTarget(lockLock.getB());
764 assertEquals(lockLock.getB(), manager.unlockCurrentOperation());
766 clom.startOperation(event);
768 // This call should be exception free
769 manager.finishOperation(clom);
771 ControlLoopEventManager otherManager = makeManager(event);
772 VirtualControlLoopNotification otherNotification = otherManager.activate(yamlStringStd, event);
773 assertNotNull(otherNotification);
774 assertEquals(ControlLoopNotificationType.ACTIVE, otherNotification.getNotification());
776 ControlLoopOperationManager otherClom = otherManager.processControlLoop();
777 assertNotNull(otherClom);
778 assertNull(otherClom.getOperationResult());
780 otherManager.finishOperation(clom);
784 public void testOnNewEvent() throws IOException, AaiException {
785 InputStream is = new FileInputStream(new File("src/test/resources/test.yaml"));
786 final String yamlString = IOUtils.toString(is, StandardCharsets.UTF_8);
788 UUID requestId = UUID.randomUUID();
789 VirtualControlLoopEvent onsetEvent = new VirtualControlLoopEvent();
790 onsetEvent.setClosedLoopControlName("TwoOnsetTest");
791 onsetEvent.setRequestId(requestId);
792 onsetEvent.setTarget("generic-vnf.vnf-id");
793 onsetEvent.setClosedLoopAlarmStart(Instant.now());
794 onsetEvent.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
795 onsetEvent.setAai(new HashMap<>());
796 onsetEvent.getAai().put("generic-vnf.vnf-name", "onsetOne");
798 VirtualControlLoopEvent abatedEvent = new VirtualControlLoopEvent();
799 abatedEvent.setClosedLoopControlName("TwoOnsetTest");
800 abatedEvent.setRequestId(requestId);
801 abatedEvent.setTarget("generic-vnf.vnf-id");
802 abatedEvent.setClosedLoopAlarmStart(Instant.now());
803 abatedEvent.setClosedLoopEventStatus(ControlLoopEventStatus.ABATED);
804 abatedEvent.setAai(new HashMap<>());
805 abatedEvent.getAai().put("generic-vnf.vnf-name", "onsetOne");
807 ControlLoopEventManager manager = makeManager(onsetEvent);
808 VirtualControlLoopNotification notification = manager.activate(yamlString, onsetEvent);
809 assertNotNull(notification);
810 assertEquals(ControlLoopNotificationType.ACTIVE, notification.getNotification());
812 assertEquals(NEW_EVENT_STATUS.FIRST_ONSET, manager.onNewEvent(onsetEvent));
813 assertEquals(NEW_EVENT_STATUS.FIRST_ABATEMENT, manager.onNewEvent(abatedEvent));
814 assertEquals(NEW_EVENT_STATUS.SUBSEQUENT_ABATEMENT, manager.onNewEvent(abatedEvent));
816 VirtualControlLoopEvent checkSyntaxEvent = new VirtualControlLoopEvent();
817 checkSyntaxEvent.setAai(null);
818 checkSyntaxEvent.setClosedLoopAlarmEnd(null);
819 checkSyntaxEvent.setClosedLoopAlarmStart(null);
820 checkSyntaxEvent.setClosedLoopControlName(null);
821 checkSyntaxEvent.setClosedLoopEventClient(null);
822 checkSyntaxEvent.setClosedLoopEventStatus(null);
823 checkSyntaxEvent.setFrom(null);
824 checkSyntaxEvent.setPolicyName(null);
825 checkSyntaxEvent.setPolicyScope(null);
826 checkSyntaxEvent.setPolicyVersion(null);
827 checkSyntaxEvent.setRequestId(null);
828 checkSyntaxEvent.setTarget(null);
829 checkSyntaxEvent.setTargetType(null);
830 checkSyntaxEvent.setVersion(null);
832 assertEquals(NEW_EVENT_STATUS.SYNTAX_ERROR, manager.onNewEvent(checkSyntaxEvent));
834 checkSyntaxEvent.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
835 assertEquals(NEW_EVENT_STATUS.SYNTAX_ERROR, manager.onNewEvent(checkSyntaxEvent));
837 checkSyntaxEvent.setClosedLoopControlName(null);
838 assertEquals(NEW_EVENT_STATUS.SYNTAX_ERROR, manager.onNewEvent(checkSyntaxEvent));
840 checkSyntaxEvent.setClosedLoopControlName("");
841 assertEquals(NEW_EVENT_STATUS.SYNTAX_ERROR, manager.onNewEvent(checkSyntaxEvent));
843 checkSyntaxEvent.setClosedLoopControlName("TwoOnsetTest");
844 assertEquals(NEW_EVENT_STATUS.SYNTAX_ERROR, manager.onNewEvent(checkSyntaxEvent));
846 checkSyntaxEvent.setRequestId(null);
847 assertEquals(NEW_EVENT_STATUS.SYNTAX_ERROR, manager.onNewEvent(checkSyntaxEvent));
849 checkSyntaxEvent.setRequestId(requestId);
850 assertEquals(NEW_EVENT_STATUS.SYNTAX_ERROR, manager.onNewEvent(checkSyntaxEvent));
852 checkSyntaxEvent.setAai(null);
853 assertEquals(NEW_EVENT_STATUS.SYNTAX_ERROR, manager.onNewEvent(checkSyntaxEvent));
855 checkSyntaxEvent.setAai(new HashMap<>());
856 assertEquals(NEW_EVENT_STATUS.SYNTAX_ERROR, manager.onNewEvent(checkSyntaxEvent));
858 checkSyntaxEvent.setTarget("");
859 assertEquals(NEW_EVENT_STATUS.SYNTAX_ERROR, manager.onNewEvent(checkSyntaxEvent));
861 checkSyntaxEvent.setTarget(null);
862 assertEquals(NEW_EVENT_STATUS.SYNTAX_ERROR, manager.onNewEvent(checkSyntaxEvent));
864 checkSyntaxEvent.setTarget("");
865 assertEquals(NEW_EVENT_STATUS.SYNTAX_ERROR, manager.onNewEvent(checkSyntaxEvent));
867 checkSyntaxEvent.setTarget("OZ");
868 assertEquals(NEW_EVENT_STATUS.SYNTAX_ERROR, manager.onNewEvent(checkSyntaxEvent));
870 checkSyntaxEvent.setTarget("VM_NAME");
871 assertEquals(NEW_EVENT_STATUS.SYNTAX_ERROR, manager.onNewEvent(checkSyntaxEvent));
873 checkSyntaxEvent.setTarget("VNF_NAME");
874 assertEquals(NEW_EVENT_STATUS.SYNTAX_ERROR, manager.onNewEvent(checkSyntaxEvent));
876 checkSyntaxEvent.setTarget("vserver.vserver-name");
877 assertEquals(NEW_EVENT_STATUS.SYNTAX_ERROR, manager.onNewEvent(checkSyntaxEvent));
879 checkSyntaxEvent.setTarget("generic-vnf.vnf-id");
880 assertEquals(NEW_EVENT_STATUS.SYNTAX_ERROR, manager.onNewEvent(checkSyntaxEvent));
882 checkSyntaxEvent.setTarget("generic-vnf.vnf-name");
883 assertEquals(NEW_EVENT_STATUS.SYNTAX_ERROR, manager.onNewEvent(checkSyntaxEvent));
885 checkSyntaxEvent.setAai(null);
886 assertEquals(NEW_EVENT_STATUS.SYNTAX_ERROR, manager.onNewEvent(checkSyntaxEvent));
888 checkSyntaxEvent.setAai(new HashMap<>());
889 assertEquals(NEW_EVENT_STATUS.SYNTAX_ERROR, manager.onNewEvent(checkSyntaxEvent));
891 checkSyntaxEvent.getAai().put("generic-vnf.vnf-name", "onsetOne");
892 assertEquals(NEW_EVENT_STATUS.SUBSEQUENT_ABATEMENT, manager.onNewEvent(abatedEvent));
894 checkSyntaxEvent.getAai().put("vserver.vserver-name", "onsetOne");
895 assertEquals(NEW_EVENT_STATUS.SUBSEQUENT_ABATEMENT, manager.onNewEvent(abatedEvent));
897 checkSyntaxEvent.getAai().put("generic-vnf.vnf-id", "onsetOne");
898 assertEquals(NEW_EVENT_STATUS.SUBSEQUENT_ABATEMENT, manager.onNewEvent(abatedEvent));
902 public void testControlLoopTimeout() throws IOException {
903 InputStream is = new FileInputStream(new File("src/test/resources/test.yaml"));
904 final String yamlString = IOUtils.toString(is, StandardCharsets.UTF_8);
906 UUID requestId = UUID.randomUUID();
907 VirtualControlLoopEvent onsetEvent = new VirtualControlLoopEvent();
908 onsetEvent.setClosedLoopControlName("TwoOnsetTest");
909 onsetEvent.setRequestId(requestId);
910 onsetEvent.setTarget("generic-vnf.vnf-id");
911 onsetEvent.setClosedLoopAlarmStart(Instant.now());
912 onsetEvent.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
913 onsetEvent.setAai(new HashMap<>());
914 onsetEvent.getAai().put("generic-vnf.vnf-name", "onsetOne");
916 ControlLoopEventManager manager = makeManager(onsetEvent);
917 assertTrue(0 == manager.getControlLoopTimeout(null));
918 assertTrue(120 == manager.getControlLoopTimeout(120));
920 VirtualControlLoopNotification notification = manager.activate(yamlString, onsetEvent);
921 assertNotNull(notification);
922 assertEquals(ControlLoopNotificationType.ACTIVE, notification.getNotification());
924 assertTrue(60 == manager.getControlLoopTimeout(null));
928 public void testQueryAai() throws IOException, AaiException {
929 InputStream is = new FileInputStream(new File("src/test/resources/test.yaml"));
930 final String yamlString = IOUtils.toString(is, StandardCharsets.UTF_8);
932 UUID requestId = UUID.randomUUID();
933 VirtualControlLoopEvent onsetEvent = new VirtualControlLoopEvent();
934 onsetEvent.setClosedLoopControlName("TwoOnsetTest");
935 onsetEvent.setRequestId(requestId);
936 onsetEvent.setTarget("generic-vnf.vnf-id");
937 onsetEvent.setClosedLoopAlarmStart(Instant.now());
938 onsetEvent.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
939 onsetEvent.setAai(new HashMap<>());
940 onsetEvent.getAai().put("generic-vnf.vnf-name", "onsetOne");
942 ControlLoopEventManager manager = makeManager(onsetEvent);
943 manager.queryAai(onsetEvent);
945 VirtualControlLoopNotification notification = manager.activate(yamlString, onsetEvent);
946 assertNotNull(notification);
947 assertEquals(ControlLoopNotificationType.ACTIVE, notification.getNotification());
949 // repeat query with same manager
950 manager.queryAai(onsetEvent);
952 // remaining queries each use their own manager so they will be re-executed
954 makeManager(onsetEvent).queryAai(onsetEvent);
956 onsetEvent.getAai().put("generic-vnf.is-closed-loop-disabled", "true");
958 makeManager(onsetEvent).queryAai(onsetEvent);
959 fail("test should throw an exception here");
960 } catch (Exception e) {
961 assertEquals("is-closed-loop-disabled is set to true on VServer or VNF", e.getMessage());
963 onsetEvent.getAai().put("vserver.is-closed-loop-disabled", "true");
965 makeManager(onsetEvent).queryAai(onsetEvent);
966 fail("test should throw an exception here");
967 } catch (Exception e) {
968 assertEquals("is-closed-loop-disabled is set to true on VServer or VNF", e.getMessage());
970 onsetEvent.getAai().remove("generic-vnf.is-closed-loop-disabled");
972 makeManager(onsetEvent).queryAai(onsetEvent);
973 fail("test should throw an exception here");
974 } catch (Exception e) {
975 assertEquals("is-closed-loop-disabled is set to true on VServer or VNF", e.getMessage());
977 onsetEvent.getAai().remove("vserver.is-closed-loop-disabled");
978 makeManager(onsetEvent).queryAai(onsetEvent);
980 onsetEvent.getAai().put("generic-vnf.is-closed-loop-disabled", "false");
981 makeManager(onsetEvent).queryAai(onsetEvent);
983 onsetEvent.getAai().remove("generic-vnf.is-closed-loop-disabled");
984 onsetEvent.getAai().put("vserver.is-closed-loop-disabled", "false");
985 makeManager(onsetEvent).queryAai(onsetEvent);
987 onsetEvent.getAai().remove("generic-vnf.vnf-id");
988 onsetEvent.getAai().remove("generic-vnf.vnf-name");
989 onsetEvent.getAai().remove("vserver.vserver-name");
990 onsetEvent.getAai().remove("generic-vnf.is-closed-loop-disabled");
991 onsetEvent.getAai().remove("vserver.is-closed-loop-disabled");
992 makeManager(onsetEvent).queryAai(onsetEvent);
994 onsetEvent.getAai().put("vserver.vserver-name", "AVserver");
995 makeManager(onsetEvent).queryAai(onsetEvent);
997 onsetEvent.getAai().put("generic-vnf.vnf-name", "AVNFName");
998 makeManager(onsetEvent).queryAai(onsetEvent);
1000 onsetEvent.getAai().put("generic-vnf.vnf-id", "AVNFID");
1001 makeManager(onsetEvent).queryAai(onsetEvent);
1003 onsetEvent.getAai().remove("vserver.vserver-name");
1004 makeManager(onsetEvent).queryAai(onsetEvent);
1006 onsetEvent.getAai().remove("generic-vnf.vnf-name");
1007 makeManager(onsetEvent).queryAai(onsetEvent);
1010 PolicyEngine.manager.setEnvironmentProperty("aai.url", "http://localhost:9999");
1013 makeManager(onsetEvent).queryAai(onsetEvent);
1014 fail("test should throw an exception here");
1015 } catch (Exception e) {
1016 assertEquals("Exception from queryAai: org.onap.policy.aai.util.AaiException: AAI Response is null "
1017 + "(query by vnf-id)", e.getMessage());
1020 onsetEvent.getAai().remove("generic-vnf.vnf-id");
1021 onsetEvent.getAai().put("generic-vnf.vnf-name", "AVNFName");
1023 makeManager(onsetEvent).queryAai(onsetEvent);
1024 fail("test should throw an exception here");
1025 } catch (Exception e) {
1026 assertEquals("Exception from queryAai: org.onap.policy.aai.util.AaiException: AAI Response is null "
1027 + "(query by vnf-name)", e.getMessage());
1030 onsetEvent.getAai().remove("generic-vnf.vnf-name");
1031 onsetEvent.getAai().put("vserver.vserver-name", "AVserver");
1033 makeManager(onsetEvent).queryAai(onsetEvent);
1034 fail("test should throw an exception here");
1035 } catch (Exception e) {
1036 assertEquals("Exception from queryAai: org.onap.policy.aai.util.AaiException: AAI Response is null "
1037 + "(query by vserver-name)", e.getMessage());
1040 PolicyEngine.manager.setEnvironmentProperty("aai.url", "http://localhost:6666");
1043 private ControlLoopEventManager makeManager(VirtualControlLoopEvent event) {
1044 return new ControlLoopEventManager(event.getClosedLoopControlName(), event.getRequestId());