2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2020-2021 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.drools.apps.controller.usecases;
23 import static org.assertj.core.api.Assertions.assertThat;
24 import static org.assertj.core.api.Assertions.assertThatCode;
25 import static org.assertj.core.api.Assertions.assertThatThrownBy;
26 import static org.junit.Assert.assertEquals;
27 import static org.junit.Assert.assertFalse;
28 import static org.junit.Assert.assertNotNull;
29 import static org.junit.Assert.assertSame;
30 import static org.junit.Assert.assertTrue;
31 import static org.mockito.ArgumentMatchers.any;
32 import static org.mockito.Mockito.verify;
33 import static org.mockito.Mockito.when;
35 import java.time.Instant;
36 import java.util.ArrayList;
37 import java.util.Arrays;
38 import java.util.Deque;
39 import java.util.List;
41 import java.util.TreeMap;
42 import java.util.UUID;
43 import java.util.concurrent.ExecutorService;
44 import org.drools.core.WorkingMemory;
45 import org.junit.Before;
46 import org.junit.Test;
47 import org.junit.runner.RunWith;
48 import org.kie.api.runtime.rule.FactHandle;
49 import org.mockito.Mock;
50 import org.mockito.junit.MockitoJUnitRunner;
51 import org.onap.policy.common.utils.coder.Coder;
52 import org.onap.policy.common.utils.coder.CoderException;
53 import org.onap.policy.common.utils.coder.StandardYamlCoder;
54 import org.onap.policy.common.utils.resources.ResourceUtils;
55 import org.onap.policy.controlloop.ControlLoopEventStatus;
56 import org.onap.policy.controlloop.ControlLoopException;
57 import org.onap.policy.controlloop.ControlLoopResponse;
58 import org.onap.policy.controlloop.ControlLoopTargetType;
59 import org.onap.policy.controlloop.VirtualControlLoopEvent;
60 import org.onap.policy.controlloop.actorserviceprovider.ActorService;
61 import org.onap.policy.controlloop.actorserviceprovider.Operation;
62 import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome;
63 import org.onap.policy.controlloop.actorserviceprovider.OperationProperties;
64 import org.onap.policy.controlloop.actorserviceprovider.OperationResult;
65 import org.onap.policy.controlloop.actorserviceprovider.Operator;
66 import org.onap.policy.controlloop.actorserviceprovider.TargetType;
67 import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams;
68 import org.onap.policy.controlloop.actorserviceprovider.spi.Actor;
69 import org.onap.policy.controlloop.drl.legacy.ControlLoopParams;
70 import org.onap.policy.controlloop.eventmanager.ActorConstants;
71 import org.onap.policy.controlloop.ophistory.OperationHistoryDataManager;
72 import org.onap.policy.drools.apps.controller.usecases.step.AaiCqStep2;
73 import org.onap.policy.drools.apps.controller.usecases.step.AaiGetPnfStep2;
74 import org.onap.policy.drools.apps.controller.usecases.step.AaiGetTenantStep2;
75 import org.onap.policy.drools.apps.controller.usecases.step.GetTargetEntityStep2;
76 import org.onap.policy.drools.apps.controller.usecases.step.GuardStep2;
77 import org.onap.policy.drools.apps.controller.usecases.step.Step2;
78 import org.onap.policy.drools.core.lock.LockCallback;
79 import org.onap.policy.drools.core.lock.LockImpl;
80 import org.onap.policy.drools.core.lock.LockState;
81 import org.onap.policy.drools.system.PolicyEngine;
82 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
83 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
84 import org.onap.policy.sdnr.PciBody;
85 import org.onap.policy.sdnr.PciMessage;
86 import org.onap.policy.sdnr.PciResponse;
88 @RunWith(MockitoJUnitRunner.class)
89 public class UsecasesEventManagerTest {
90 private static final UUID REQ_ID = UUID.randomUUID();
91 private static final String CL_NAME = "my-closed-loop-name";
92 private static final String POLICY_NAME = "my-policy-name";
93 private static final String POLICY_SCOPE = "my-scope";
94 private static final String POLICY_VERSION = "1.2.3";
95 private static final String SIMPLE_ACTOR = "First";
96 private static final String SIMPLE_OPERATION = "OperationA";
97 private static final String MY_TARGET = "my-target";
98 private static final String EVENT_MGR_SIMPLE_YAML =
99 "../eventmanager/src/test/resources/eventManager/event-mgr-simple.yaml";
100 private static final Coder yamlCoder = new StandardYamlCoder();
101 private static final String OUTCOME_MSG = "my outcome message";
104 private PolicyEngine engineMgr;
106 private WorkingMemory workMem;
108 private FactHandle factHandle;
110 private Operator policyOperator;
112 private Operation policyOperation;
114 private Actor policyActor;
116 private ActorService actors;
118 private OperationHistoryDataManager dataMgr;
120 private ExecutorService executor;
126 private List<LockImpl> locks;
127 private ToscaPolicy tosca;
128 private ControlLoopParams params;
129 private VirtualControlLoopEvent event;
130 private UsecasesEventManager mgr;
136 public void setUp() throws ControlLoopException, CoderException {
137 when(workMem.getFactHandle(any())).thenReturn(factHandle);
139 event = new VirtualControlLoopEvent();
140 event.setRequestId(REQ_ID);
141 event.setTarget(UsecasesConstants.VSERVER_VSERVER_NAME);
142 event.setAai(new TreeMap<>(Map.of(UsecasesConstants.VSERVER_VSERVER_NAME, MY_TARGET)));
143 event.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
144 event.setClosedLoopControlName(CL_NAME);
145 event.setTargetType(ControlLoopTargetType.VNF);
147 params = new ControlLoopParams();
148 params.setClosedLoopControlName(CL_NAME);
149 params.setPolicyName(POLICY_NAME);
150 params.setPolicyScope(POLICY_SCOPE);
151 params.setPolicyVersion(POLICY_VERSION);
153 loadPolicy(EVENT_MGR_SIMPLE_YAML);
155 locks = new ArrayList<>();
157 mgr = new MyManager(params, event, workMem);
161 public void testConstructor() {
162 assertEquals(POLICY_NAME, mgr.getPolicyName());
163 assertSame(event, mgr.getEvent());
165 Map<String, String> orig = event.getAai();
167 event.setAai(addAai(orig, UsecasesConstants.VSERVER_IS_CLOSED_LOOP_DISABLED, "true"));
168 assertThatThrownBy(() -> new UsecasesEventManager(params, event, workMem))
169 .hasMessage("is-closed-loop-disabled is set to true on VServer or VNF");
172 event.setAai(addAai(orig, UsecasesConstants.VSERVER_PROV_STATUS,
173 UsecasesConstants.PROV_STATUS_ACTIVE.toUpperCase()));
174 assertThatCode(() -> new UsecasesEventManager(params, event, workMem)).doesNotThrowAnyException();
177 event.setAai(addAai(orig, UsecasesConstants.VSERVER_PROV_STATUS,
178 UsecasesConstants.PROV_STATUS_ACTIVE.toLowerCase()));
179 assertThatCode(() -> new UsecasesEventManager(params, event, workMem)).doesNotThrowAnyException();
182 event.setAai(addAai(orig, UsecasesConstants.VSERVER_PROV_STATUS, "inactive"));
183 assertThatThrownBy(() -> new UsecasesEventManager(params, event, workMem))
184 .hasMessage("prov-status is not ACTIVE on VServer or VNF");
187 event.setAai(addAai(orig, UsecasesConstants.GENERIC_VNF_PROV_STATUS,
188 UsecasesConstants.PROV_STATUS_ACTIVE.toUpperCase()));
189 assertThatCode(() -> new UsecasesEventManager(params, event, workMem)).doesNotThrowAnyException();
192 event.setAai(addAai(orig, UsecasesConstants.GENERIC_VNF_PROV_STATUS,
193 UsecasesConstants.PROV_STATUS_ACTIVE.toLowerCase()));
194 assertThatCode(() -> new UsecasesEventManager(params, event, workMem)).doesNotThrowAnyException();
197 event.setAai(addAai(orig, UsecasesConstants.GENERIC_VNF_PROV_STATUS, "inactive"));
198 assertThatThrownBy(() -> new UsecasesEventManager(params, event, workMem))
199 .hasMessage("prov-status is not ACTIVE on VServer or VNF");
203 assertThatCode(() -> mgr.checkEventSyntax(event)).doesNotThrowAnyException();
206 event.setTarget("unknown-target");
207 assertThatThrownBy(() -> new UsecasesEventManager(params, event, workMem))
208 .isInstanceOf(ControlLoopException.class);
212 public void testLoadPreprocessorSteps() {
213 stepa = new Step2(mgr, ControlLoopOperationParams.builder().build(), event) {
215 public List<String> getPropertyNames() {
216 return List.of(OperationProperties.AAI_DEFAULT_CLOUD_REGION);
220 protected Operation buildOperation() {
221 return policyOperation;
225 mgr.getSteps().add(stepa);
226 mgr.getSteps().add(stepb);
228 mgr.loadPreprocessorSteps();
230 Deque<Step2> steps = mgr.getSteps();
232 Step2 lockStep = steps.poll();
233 assertNotNull(lockStep);
234 assertEquals(ActorConstants.LOCK_ACTOR, lockStep.getActorName());
235 assertThat(steps.poll()).isInstanceOf(AaiCqStep2.class);
236 assertThat(steps.poll()).isInstanceOf(GuardStep2.class);
237 assertSame(stepa, steps.poll());
238 assertSame(stepb, steps.poll());
239 assertThat(steps).isEmpty();
243 * Tests loadPreprocessorSteps() when no additional steps are needed.
246 public void testLoadPreprocessorStepsNothingToLoad() {
247 when(stepa.isPolicyStep()).thenReturn(false);
248 when(stepa.getPropertyNames()).thenReturn(List.of("unknown-property"));
250 Deque<Step2> steps = mgr.getSteps();
255 mgr.loadPreprocessorSteps();
257 assertSame(stepa, steps.poll());
258 assertSame(stepb, steps.poll());
259 assertThat(steps).isEmpty();
263 * Tests loadPreprocessorSteps() when an A&AI custom query is needed.
266 public void testLoadPreprocessorStepsCq() {
267 loadStepsWithProperties(OperationProperties.AAI_DEFAULT_CLOUD_REGION, OperationProperties.AAI_DEFAULT_TENANT);
270 mgr.loadPreprocessorSteps();
272 Deque<Step2> steps = mgr.getSteps();
274 assertThat(steps.poll()).isInstanceOf(AaiCqStep2.class);
275 assertSame(stepa, steps.poll());
276 assertSame(stepb, steps.poll());
277 assertThat(steps).isEmpty();
281 * Tests loadPreprocessorSteps() when an A&AI PNF query is needed.
284 public void testLoadPreprocessorStepsPnf() {
285 // doubling up the property to check both branches
286 loadStepsWithProperties(OperationProperties.AAI_PNF, OperationProperties.AAI_PNF);
289 mgr.loadPreprocessorSteps();
291 Deque<Step2> steps = mgr.getSteps();
293 assertThat(steps.poll()).isInstanceOf(AaiGetPnfStep2.class);
294 assertSame(stepa, steps.poll());
295 assertSame(stepb, steps.poll());
296 assertThat(steps).isEmpty();
300 * Tests loadPreprocessorSteps() when an A&AI Tenant query is needed.
303 public void testLoadPreprocessorStepsTenant() {
304 // doubling up the property to check both branches
305 event.getAai().put(Step2.VSERVER_VSERVER_NAME, "my-vserver");
306 loadStepsWithProperties(OperationProperties.AAI_VSERVER_LINK, OperationProperties.AAI_VSERVER_LINK);
309 mgr.loadPreprocessorSteps();
311 Deque<Step2> steps = mgr.getSteps();
313 assertThat(steps.poll()).isInstanceOf(AaiGetTenantStep2.class);
314 assertSame(stepa, steps.poll());
315 assertSame(stepb, steps.poll());
316 assertThat(steps).isEmpty();
320 * Tests loadPreprocessorSteps() when the target entity is unset.
323 public void testLoadPreprocessorStepsNeedTargetEntity() {
324 stepa = new Step2(mgr, ControlLoopOperationParams.builder()
325 .targetType(TargetType.toTargetType(event.getTargetType())).targetEntityIds(Map.of()).build(),
328 public List<String> getPropertyNames() {
329 return List.of(OperationProperties.AAI_TARGET_ENTITY);
333 protected Operation buildOperation() {
334 return policyOperation;
338 public boolean isPolicyStep() {
343 Deque<Step2> steps = mgr.getSteps();
347 mgr.loadPreprocessorSteps();
349 Step2 entityStep = steps.poll();
351 assertThat(entityStep).isInstanceOf(GetTargetEntityStep2.class);
352 assertSame(stepa, steps.poll());
353 assertSame(stepb, steps.poll());
354 assertThat(steps).isEmpty();
356 // put get-target-entity back onto the queue and ensure nothing else is added
357 steps.add(entityStep);
358 mgr.loadPreprocessorSteps();
359 assertSame(entityStep, steps.poll());
360 assertThat(steps).isEmpty();
364 public void testIsAbort() {
365 OperationOutcome outcome = makeCompletedOutcome();
366 outcome.setResult(OperationResult.FAILURE);
368 // closed loop timeout
369 outcome.setActor(ActorConstants.CL_TIMEOUT_ACTOR);
370 assertTrue(mgr.isAbort(outcome));
373 outcome.setActor(ActorConstants.LOCK_ACTOR);
374 assertTrue(mgr.isAbort(outcome));
376 // no effect for success
377 outcome.setResult(OperationResult.SUCCESS);
378 assertFalse(mgr.isAbort(outcome));
382 public void testStoreInDataBase() throws ControlLoopException {
384 OperationOutcome outcome = makeOutcome();
385 mgr.addToHistory(outcome);
387 mgr.storeInDataBase(mgr.getPartialHistory().peekLast());
389 verify(dataMgr).store(REQ_ID.toString(), event.getClosedLoopControlName(), event, null,
390 mgr.getPartialHistory().peekLast().getClOperation());
394 public void testMakeControlLoopResponse() {
395 final OperationOutcome outcome = new OperationOutcome();
397 // no message - should return null
398 checkResp(outcome, null);
400 // not a PciMessage - should return null
401 outcome.setResponse("not-a-pci-message");
402 checkResp(outcome, null);
405 * now work with a PciMessage
407 PciMessage msg = new PciMessage();
408 outcome.setResponse(msg);
410 PciBody body = new PciBody();
413 PciResponse output = new PciResponse();
414 body.setOutput(output);
416 output.setPayload("my-payload");
418 // should generate a response, with a payload
419 checkResp(outcome, "my-payload");
422 * these should generate a response, with null payload
424 output.setPayload(null);
425 checkResp(outcome, null);
427 body.setOutput(null);
428 checkResp(outcome, null);
431 checkResp(outcome, null);
433 outcome.setResponse(null);
434 checkResp(outcome, null);
438 public void testCheckEventSyntax() {
440 * only need to check one success and one failure from the super class method
443 // initially, it's valid
444 assertThatCode(() -> mgr.checkEventSyntax(event)).doesNotThrowAnyException();
446 event.setTarget("unknown-target");
447 assertThatCode(() -> mgr.checkEventSyntax(event)).isInstanceOf(ControlLoopException.class)
448 .hasMessage("target field invalid");
450 event.setTarget(null);
451 assertThatCode(() -> mgr.checkEventSyntax(event)).isInstanceOf(ControlLoopException.class)
452 .hasMessage("No target field");
454 event.setRequestId(null);
455 assertThatCode(() -> mgr.checkEventSyntax(event)).isInstanceOf(ControlLoopException.class)
456 .hasMessage("No request ID");
460 public void testValidateStatus() {
462 * only need to check one success and one failure from the super class method
464 event.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
465 assertThatCode(() -> mgr.checkEventSyntax(event)).doesNotThrowAnyException();
467 event.setClosedLoopEventStatus(null);
468 assertThatCode(() -> mgr.checkEventSyntax(event)).isInstanceOf(ControlLoopException.class)
469 .hasMessage("Invalid value in closedLoopEventStatus");
473 public void testValidateAaiData() {
474 event.setTargetType("unknown-target-type");
475 assertThatCode(() -> mgr.checkEventSyntax(event)).isInstanceOf(ControlLoopException.class)
476 .hasMessage("The target type is not supported");
478 event.setTargetType(null);
479 assertThatCode(() -> mgr.checkEventSyntax(event)).isInstanceOf(ControlLoopException.class)
480 .hasMessage("The Target type is null");
483 assertThatCode(() -> mgr.checkEventSyntax(event)).isInstanceOf(ControlLoopException.class)
484 .hasMessage("AAI is null");
487 event.setTargetType(ControlLoopTargetType.VM);
488 event.setAai(Map.of(UsecasesConstants.GENERIC_VNF_VNF_ID, MY_TARGET));
489 assertThatCode(() -> mgr.checkEventSyntax(event)).doesNotThrowAnyException();
491 event.setAai(Map.of());
492 assertThatCode(() -> mgr.checkEventSyntax(event)).isInstanceOf(ControlLoopException.class);
495 event.setTargetType(ControlLoopTargetType.VNF);
496 event.setAai(Map.of(UsecasesConstants.GENERIC_VNF_VNF_ID, MY_TARGET));
497 assertThatCode(() -> mgr.checkEventSyntax(event)).doesNotThrowAnyException();
499 event.setAai(Map.of());
500 assertThatCode(() -> mgr.checkEventSyntax(event)).isInstanceOf(ControlLoopException.class);
503 event.setTargetType(ControlLoopTargetType.PNF);
504 event.setAai(Map.of(UsecasesConstants.PNF_NAME, MY_TARGET));
505 assertThatCode(() -> mgr.checkEventSyntax(event)).doesNotThrowAnyException();
507 event.setAai(Map.of());
508 assertThatCode(() -> mgr.checkEventSyntax(event)).isInstanceOf(ControlLoopException.class);
512 public void testValidateAaiVmVnfData() {
513 event.setTargetType(ControlLoopTargetType.VM);
514 event.setAai(Map.of(UsecasesConstants.GENERIC_VNF_VNF_ID, MY_TARGET));
515 assertThatCode(() -> mgr.checkEventSyntax(event)).doesNotThrowAnyException();
517 event.setAai(Map.of(UsecasesConstants.VSERVER_VSERVER_NAME, MY_TARGET));
518 assertThatCode(() -> mgr.checkEventSyntax(event)).doesNotThrowAnyException();
520 event.setAai(Map.of(UsecasesConstants.GENERIC_VNF_VNF_NAME, MY_TARGET));
521 assertThatCode(() -> mgr.checkEventSyntax(event)).doesNotThrowAnyException();
523 event.setAai(Map.of());
524 assertThatCode(() -> mgr.checkEventSyntax(event)).isInstanceOf(ControlLoopException.class).hasMessage(
525 "generic-vnf.vnf-id or generic-vnf.vnf-name or vserver.vserver-name information missing");
529 public void testValidateAaiPnfData() {
530 event.setTargetType(ControlLoopTargetType.PNF);
531 event.setAai(Map.of(UsecasesConstants.PNF_NAME, MY_TARGET));
532 assertThatCode(() -> mgr.checkEventSyntax(event)).doesNotThrowAnyException();
534 event.setAai(Map.of());
535 assertThatCode(() -> mgr.checkEventSyntax(event)).isInstanceOf(ControlLoopException.class)
536 .hasMessage("AAI PNF object key pnf-name is missing");
540 public void testIsClosedLoopDisabled() {
541 Map<String, String> orig = event.getAai();
543 event.setAai(addAai(orig, UsecasesConstants.VSERVER_IS_CLOSED_LOOP_DISABLED, "true"));
544 assertThatThrownBy(() -> new UsecasesEventManager(params, event, workMem))
545 .isInstanceOf(IllegalStateException.class);
547 event.setAai(addAai(orig, UsecasesConstants.GENERIC_VNF_IS_CLOSED_LOOP_DISABLED, "true"));
548 assertThatThrownBy(() -> new UsecasesEventManager(params, event, workMem))
549 .isInstanceOf(IllegalStateException.class);
551 event.setAai(addAai(orig, UsecasesConstants.PNF_IS_IN_MAINT, "true"));
552 assertThatThrownBy(() -> new UsecasesEventManager(params, event, workMem))
553 .isInstanceOf(IllegalStateException.class);
557 public void testIsProvStatusInactive() {
558 Map<String, String> orig = event.getAai();
560 event.setAai(addAai(orig, UsecasesConstants.VSERVER_PROV_STATUS, "ACTIVE"));
561 assertThatCode(() -> new UsecasesEventManager(params, event, workMem)).doesNotThrowAnyException();
563 event.setAai(addAai(orig, UsecasesConstants.VSERVER_PROV_STATUS, "inactive"));
564 assertThatThrownBy(() -> new UsecasesEventManager(params, event, workMem))
565 .isInstanceOf(IllegalStateException.class);
567 event.setAai(addAai(orig, UsecasesConstants.GENERIC_VNF_PROV_STATUS, "ACTIVE"));
568 assertThatCode(() -> new UsecasesEventManager(params, event, workMem)).doesNotThrowAnyException();
570 event.setAai(addAai(orig, UsecasesConstants.GENERIC_VNF_PROV_STATUS, "inactive"));
571 assertThatThrownBy(() -> new UsecasesEventManager(params, event, workMem))
572 .isInstanceOf(IllegalStateException.class);
576 public void testIsAaiTrue() {
577 Map<String, String> orig = event.getAai();
579 for (String value : Arrays.asList("yes", "y", "true", "t", "yEs", "trUe")) {
580 event.setAai(addAai(orig, UsecasesConstants.VSERVER_IS_CLOSED_LOOP_DISABLED, value));
581 assertThatThrownBy(() -> new UsecasesEventManager(params, event, workMem))
582 .isInstanceOf(IllegalStateException.class);
585 event.setAai(addAai(orig, UsecasesConstants.VSERVER_IS_CLOSED_LOOP_DISABLED, "false"));
586 assertThatCode(() -> new UsecasesEventManager(params, event, workMem)).doesNotThrowAnyException();
588 event.setAai(addAai(orig, UsecasesConstants.VSERVER_IS_CLOSED_LOOP_DISABLED, "no"));
589 assertThatCode(() -> new UsecasesEventManager(params, event, workMem)).doesNotThrowAnyException();
594 private Map<String, String> addAai(Map<String, String> original, String key, String value) {
595 Map<String, String> map = new TreeMap<>(original);
600 private void loadPolicy(String fileName) throws CoderException {
601 ToscaServiceTemplate template =
602 yamlCoder.decode(ResourceUtils.getResourceAsString(fileName), ToscaServiceTemplate.class);
603 tosca = template.getToscaTopologyTemplate().getPolicies().get(0).values().iterator().next();
605 params.setToscaPolicy(tosca);
608 private void loadStepsWithProperties(String... properties) {
609 stepa = new Step2(mgr, ControlLoopOperationParams.builder().build(), event) {
612 public boolean isPolicyStep() {
617 public List<String> getPropertyNames() {
618 return List.of(properties);
622 protected Operation buildOperation() {
623 return policyOperation;
627 mgr.getSteps().add(stepa);
628 mgr.getSteps().add(stepb);
631 private OperationOutcome makeCompletedOutcome() {
632 OperationOutcome outcome = makeOutcome();
633 outcome.setEnd(outcome.getStart());
638 private OperationOutcome makeOutcome() {
639 OperationOutcome outcome = new OperationOutcome();
640 outcome.setActor(SIMPLE_ACTOR);
641 outcome.setOperation(SIMPLE_OPERATION);
642 outcome.setMessage(OUTCOME_MSG);
643 outcome.setResult(OperationResult.SUCCESS);
644 outcome.setStart(Instant.now());
645 outcome.setTarget(MY_TARGET);
650 private void checkResp(OperationOutcome outcome, String expectedPayload) {
651 ControlLoopResponse resp = mgr.makeControlLoopResponse(outcome);
653 assertEquals(REQ_ID, resp.getRequestId());
654 assertEquals(expectedPayload, resp.getPayload());
658 * Sets the target entity so a step doesn't have to be added to set it.
660 private void setTargetEntity() {
661 mgr.setProperty(OperationProperties.AAI_TARGET_ENTITY, MY_TARGET);
665 private class MyManager extends UsecasesEventManager {
666 private static final long serialVersionUID = 1L;
668 public MyManager(ControlLoopParams params, VirtualControlLoopEvent event, WorkingMemory workMem)
669 throws ControlLoopException {
671 super(params, event, workMem);
675 protected ExecutorService getBlockingExecutor() {
680 protected void makeLock(String targetEntity, String requestId, int holdSec, LockCallback callback) {
681 LockImpl lock = new LockImpl(LockState.ACTIVE, targetEntity, requestId, holdSec, callback);
683 callback.lockAvailable(lock);
687 public ActorService getActorService() {
692 public OperationHistoryDataManager getDataManager() {
697 protected PolicyEngine getPolicyEngineManager() {