summaryrefslogtreecommitdiffstats
path: root/controlloop/common/eventmanager/src/main
diff options
context:
space:
mode:
authorJim Hahn <jrh3@att.com>2020-10-26 16:48:47 -0400
committerJim Hahn <jrh3@att.com>2020-11-16 14:28:34 -0500
commite8369d6d3088b7b68acb987ebff432ac830a3200 (patch)
tree70a4b752c6c9f2b0ff351dc1a195548a300fb098 /controlloop/common/eventmanager/src/main
parent21362791e6488bb36f543f0319b195e24f239dcb (diff)
Make drools-apps event agnostic
Removed tdjam and frankfurt controllers, which use event-specific actors. Issue-ID: POLICY-2804 Change-Id: Ica05f80bf72d039d9c4903591af7fb3793a81159 Signed-off-by: Jim Hahn <jrh3@att.com>
Diffstat (limited to 'controlloop/common/eventmanager/src/main')
-rw-r--r--controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManager2.java648
-rw-r--r--controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManager2Drools.java76
-rw-r--r--controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManager2.java820
-rw-r--r--controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/LockData.java4
-rw-r--r--controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ManagerContext.java64
5 files changed, 2 insertions, 1610 deletions
diff --git a/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManager2.java b/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManager2.java
deleted file mode 100644
index 1b3ae9220..000000000
--- a/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManager2.java
+++ /dev/null
@@ -1,648 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP
- * ================================================================================
- * Copyright (C) 2017-2020 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.controlloop.eventmanager;
-
-import static org.onap.policy.controlloop.ControlLoopTargetType.PNF;
-import static org.onap.policy.controlloop.ControlLoopTargetType.VM;
-import static org.onap.policy.controlloop.ControlLoopTargetType.VNF;
-
-import java.io.Serializable;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.Map;
-import java.util.Set;
-import java.util.UUID;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.Executor;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.ForkJoinPool;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicLong;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.function.Consumer;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-import lombok.Getter;
-import lombok.ToString;
-import org.apache.commons.lang3.StringUtils;
-import org.onap.policy.controlloop.ControlLoopEventStatus;
-import org.onap.policy.controlloop.ControlLoopException;
-import org.onap.policy.controlloop.ControlLoopNotificationType;
-import org.onap.policy.controlloop.ControlLoopOperation;
-import org.onap.policy.controlloop.ControlLoopResponse;
-import org.onap.policy.controlloop.VirtualControlLoopEvent;
-import org.onap.policy.controlloop.VirtualControlLoopNotification;
-import org.onap.policy.controlloop.actorserviceprovider.ActorService;
-import org.onap.policy.controlloop.actorserviceprovider.OperationFinalResult;
-import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome;
-import org.onap.policy.controlloop.actorserviceprovider.controlloop.ControlLoopEventContext;
-import org.onap.policy.controlloop.drl.legacy.ControlLoopParams;
-import org.onap.policy.controlloop.ophistory.OperationHistoryDataManager;
-import org.onap.policy.controlloop.processor.ControlLoopProcessor;
-import org.onap.policy.drools.core.lock.LockCallback;
-import org.onap.policy.drools.domain.models.operational.Operation;
-import org.onap.policy.drools.system.PolicyEngineConstants;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Manager for a single control loop event. Once this has been created, the event can be
- * retracted from working memory. Once this has been created, {@link #start()} should be
- * invoked, and then {@link #nextStep()} should be invoked continually until
- * {@link #isActive()} returns {@code false}, indicating that all steps have completed.
- */
-@ToString(onlyExplicitlyIncluded = true)
-public abstract class ControlLoopEventManager2 implements ManagerContext, Serializable {
- private static final Logger logger = LoggerFactory.getLogger(ControlLoopEventManager2.class);
- private static final long serialVersionUID = -1216568161322872641L;
-
- private static final String EVENT_MANAGER_SERVICE_CONFIG = "event-manager";
- public static final String PROV_STATUS_ACTIVE = "ACTIVE";
- private static final String VM_NAME = "VM_NAME";
- private static final String VNF_NAME = "VNF_NAME";
- public static final String GENERIC_VNF_VNF_ID = "generic-vnf.vnf-id";
- public static final String GENERIC_VNF_VNF_NAME = "generic-vnf.vnf-name";
- public static final String VSERVER_VSERVER_NAME = "vserver.vserver-name";
- public static final String GENERIC_VNF_IS_CLOSED_LOOP_DISABLED = "generic-vnf.is-closed-loop-disabled";
- public static final String VSERVER_IS_CLOSED_LOOP_DISABLED = "vserver.is-closed-loop-disabled";
- public static final String PNF_IS_IN_MAINT = "pnf.in-maint";
- public static final String GENERIC_VNF_PROV_STATUS = "generic-vnf.prov-status";
- public static final String VSERVER_PROV_STATUS = "vserver.prov-status";
- public static final String PNF_ID = "pnf.pnf-id";
- public static final String PNF_NAME = "pnf.pnf-name";
-
- private static final Set<String> VALID_TARGETS = Stream
- .of(VM_NAME, VNF_NAME, VSERVER_VSERVER_NAME, GENERIC_VNF_VNF_ID, GENERIC_VNF_VNF_NAME, PNF_NAME)
- .map(String::toLowerCase).collect(Collectors.toSet());
-
- private static final Set<String> TRUE_VALUES = Set.of("true", "t", "yes", "y");
-
- /**
- * Counts the number of these objects that have been created. This is used by junit
- * tests.
- */
- private static final AtomicLong createCount = new AtomicLong(0);
-
- public enum NewEventStatus {
- FIRST_ONSET, SUBSEQUENT_ONSET, FIRST_ABATEMENT, SUBSEQUENT_ABATEMENT, SYNTAX_ERROR
- }
-
- /**
- * {@code True} if this object was created by this JVM instance, {@code false}
- * otherwise. This will be {@code false} if this object is reconstituted from a
- * persistent store or by transfer from another server.
- */
- private transient boolean createdByThisJvmInstance;
-
- @Getter
- @ToString.Include
- public final String closedLoopControlName;
- @Getter
- @ToString.Include
- private final UUID requestId;
- @Getter
- private final ControlLoopEventContext context;
- @ToString.Include
- private int numOnsets = 1;
- @ToString.Include
- private int numAbatements = 0;
- private VirtualControlLoopEvent abatement = null;
-
- /**
- * Time, in milliseconds, when the control loop will time out.
- */
- @Getter
- private final long endTimeMs;
-
- // fields extracted from the ControlLoopParams
- @Getter
- private final String policyName;
- private final String policyScope;
- private final String policyVersion;
-
- private final LinkedList<ControlLoopOperation> controlLoopHistory = new LinkedList<>();
-
- /**
- * Maps a target entity to its lock.
- */
- private final transient Map<String, LockData> target2lock = new HashMap<>();
-
- private final ControlLoopProcessor processor;
- private final AtomicReference<ControlLoopOperationManager2> currentOperation = new AtomicReference<>();
-
- private OperationFinalResult finalResult = null;
-
- @Getter
- private VirtualControlLoopNotification notification;
- @Getter
- private ControlLoopResponse controlLoopResponse;
-
- @Getter
- private boolean updated = false;
-
-
- /**
- * Constructs the object.
- *
- * @param params control loop parameters
- * @param event event to be managed by this object
- * @throws ControlLoopException if the event is invalid or if a YAML processor cannot
- * be created
- */
- public ControlLoopEventManager2(ControlLoopParams params, VirtualControlLoopEvent event)
- throws ControlLoopException {
-
- createCount.incrementAndGet();
-
- checkEventSyntax(event);
-
- if (isClosedLoopDisabled(event)) {
- throw new IllegalStateException("is-closed-loop-disabled is set to true on VServer or VNF");
- }
-
- if (isProvStatusInactive(event)) {
- throw new IllegalStateException("prov-status is not ACTIVE on VServer or VNF");
- }
-
- this.createdByThisJvmInstance = true;
- this.closedLoopControlName = params.getClosedLoopControlName();
- this.requestId = event.getRequestId();
- this.context = new ControlLoopEventContext(event);
- this.policyName = params.getPolicyName();
- this.policyScope = params.getPolicyScope();
- this.policyVersion = params.getPolicyVersion();
- this.processor = new ControlLoopProcessor(params.getToscaPolicy());
- this.endTimeMs = System.currentTimeMillis() + detmControlLoopTimeoutMs();
- }
-
- /**
- * Gets the number of managers objects that have been created.
- * @return the number of managers objects that have been created
- */
- public static long getCreateCount() {
- return createCount.get();
- }
-
- /**
- * Starts the manager.
- *
- * @throws ControlLoopException if the processor cannot get a policy
- */
- public void start() throws ControlLoopException {
- if (!isActive()) {
- throw new IllegalStateException("manager is no longer active");
- }
-
- startHook();
-
- if (currentOperation.get() != null) {
- throw new IllegalStateException("manager already started");
- }
-
- startOperation();
- }
-
- /**
- * Starts an operation for the current processor policy.
- *
- * @throws ControlLoopException if the processor cannot get a policy
- */
- private synchronized void startOperation() throws ControlLoopException {
-
- if ((finalResult = processor.checkIsCurrentPolicyFinal()) == null) {
- // not final - start the next operation
- currentOperation.set(makeOperationManager(context, processor.getCurrentPolicy()));
- currentOperation.get().start(endTimeMs - System.currentTimeMillis());
- return;
- }
-
- logger.info("final={} oper state={} for {}", finalResult, currentOperation.get().getState(), requestId);
-
- controlLoopResponse = null;
- notification = makeNotification();
- notification.setHistory(controlLoopHistory);
-
- switch (finalResult) {
- case FINAL_FAILURE_EXCEPTION:
- notification.setNotification(ControlLoopNotificationType.FINAL_FAILURE);
- notification.setMessage("Exception in processing closed loop");
- break;
- case FINAL_SUCCESS:
- notification.setNotification(ControlLoopNotificationType.FINAL_SUCCESS);
- break;
- case FINAL_OPENLOOP:
- notification.setNotification(ControlLoopNotificationType.FINAL_OPENLOOP);
- break;
- case FINAL_FAILURE:
- default:
- notification.setNotification(ControlLoopNotificationType.FINAL_FAILURE);
- break;
- }
- }
-
- /**
- * Starts the next step, whatever that may be.
- */
- public synchronized void nextStep() {
- if (!isActive()) {
- return;
- }
-
- updated = false;
-
- try {
- if (!currentOperation.get().nextStep()) {
- // current operation is done - try the next
- controlLoopHistory.addAll(currentOperation.get().getHistory());
- processor.nextPolicyForResult(currentOperation.get().getOperationResult());
- startOperation();
- }
-
- } catch (ControlLoopException | RuntimeException e) {
- // processor problem - this is fatal
- logger.warn("{}: cannot start next step for {}", closedLoopControlName, requestId, e);
- finalResult = OperationFinalResult.FINAL_FAILURE_EXCEPTION;
- controlLoopResponse = null;
- notification = makeNotification();
- notification.setNotification(ControlLoopNotificationType.FINAL_FAILURE);
- notification.setMessage("Policy processing aborted due to policy error");
- notification.setHistory(controlLoopHistory);
- }
- }
-
- /**
- * Determines if the manager is still active.
- *
- * @return {@code true} if the manager is still active, {@code false} otherwise
- */
- public synchronized boolean isActive() {
- return (createdByThisJvmInstance && finalResult == null);
- }
-
- /**
- * Updates working memory if this changes.
- *
- * @param operation operation manager that was updated
- */
- @Override
- public synchronized void updated(ControlLoopOperationManager2 operation) {
- if (!isActive() || operation != currentOperation.get()) {
- // no longer working on the given operation
- return;
- }
-
- controlLoopResponse = operation.getControlLoopResponse();
- notification = makeNotification();
-
- VirtualControlLoopEvent event = context.getEvent();
-
- switch (operation.getState()) {
- case LOCK_DENIED:
- notification.setNotification(ControlLoopNotificationType.REJECTED);
- notification.setMessage("The target " + event.getAai().get(event.getTarget()) + " is already locked");
- break;
- case LOCK_LOST:
- notification.setNotification(ControlLoopNotificationType.OPERATION_FAILURE);
- notification.setMessage("The target " + event.getAai().get(event.getTarget()) + " is no longer locked");
- break;
- case GUARD_STARTED:
- notification.setNotification(ControlLoopNotificationType.OPERATION);
- notification.setMessage(
- "Sending guard query for " + operation.getActor() + " " + operation.getOperation());
- break;
- case GUARD_PERMITTED:
- notification.setNotification(ControlLoopNotificationType.OPERATION);
- notification.setMessage("Guard result for " + operation.getActor() + " " + operation.getOperation()
- + " is Permit");
- break;
- case GUARD_DENIED:
- notification.setNotification(ControlLoopNotificationType.OPERATION);
- notification.setMessage("Guard result for " + operation.getActor() + " " + operation.getOperation()
- + " is Deny");
- break;
- case OPERATION_STARTED:
- notification.setNotification(ControlLoopNotificationType.OPERATION);
- notification.setMessage(operation.getOperationMessage());
- notification.setHistory(Collections.emptyList());
- break;
- case OPERATION_SUCCESS:
- notification.setNotification(ControlLoopNotificationType.OPERATION_SUCCESS);
- break;
-
- case CONTROL_LOOP_TIMEOUT:
- logger.warn("{}: control loop timed out for {}", closedLoopControlName, requestId);
- controlLoopHistory.addAll(currentOperation.get().getHistory());
- notification.setNotification(ControlLoopNotificationType.FINAL_FAILURE);
- notification.setMessage("Control Loop timed out");
- notification.setHistory(controlLoopHistory);
- finalResult = OperationFinalResult.FINAL_FAILURE;
- break;
-
- case OPERATION_FAILURE:
- default:
- notification.setNotification(ControlLoopNotificationType.OPERATION_FAILURE);
- break;
- }
-
- updated = true;
- notifyUpdate();
- }
-
- /**
- * Cancels the current operation and frees all locks.
- */
- public synchronized void destroy() {
- ControlLoopOperationManager2 oper = currentOperation.get();
- if (oper != null) {
- oper.cancel();
- }
-
- getBlockingExecutor().execute(this::freeAllLocks);
- }
-
- /**
- * Frees all locks.
- */
- private void freeAllLocks() {
- target2lock.values().forEach(LockData::free);
- }
-
- /**
- * Makes a notification message for the current operation.
- *
- * @return a new notification
- */
- public synchronized VirtualControlLoopNotification makeNotification() {
- VirtualControlLoopNotification notif = new VirtualControlLoopNotification(context.getEvent());
- notif.setNotification(ControlLoopNotificationType.OPERATION);
- notif.setFrom("policy");
- notif.setPolicyScope(policyScope);
- notif.setPolicyVersion(policyVersion);
-
- if (finalResult == null) {
- ControlLoopOperationManager2 oper = currentOperation.get();
- if (oper != null) {
- notif.setMessage(oper.getOperationHistory());
- notif.setHistory(oper.getHistory());
- }
- }
-
- return notif;
- }
-
- /**
- * An event onset/abatement.
- *
- * @param event the event
- * @return the status
- */
- public synchronized NewEventStatus onNewEvent(VirtualControlLoopEvent event) {
- try {
- checkEventSyntax(event);
-
- if (event.getClosedLoopEventStatus() == ControlLoopEventStatus.ONSET) {
- if (event.equals(context.getEvent())) {
- return NewEventStatus.FIRST_ONSET;
- }
-
- numOnsets++;
- return NewEventStatus.SUBSEQUENT_ONSET;
-
- } else {
- if (abatement == null) {
- abatement = event;
- numAbatements++;
- return NewEventStatus.FIRST_ABATEMENT;
- } else {
- numAbatements++;
- return NewEventStatus.SUBSEQUENT_ABATEMENT;
- }
- }
- } catch (ControlLoopException e) {
- logger.error("{}: onNewEvent threw an exception", this, e);
- return NewEventStatus.SYNTAX_ERROR;
- }
- }
-
- /**
- * Determines the overall control loop timeout.
- *
- * @return the policy timeout, in milliseconds, if specified, a default timeout
- * otherwise
- */
- private long detmControlLoopTimeoutMs() {
- // validation checks preclude null or 0 timeout values in the policy
- Integer timeout = processor.getPolicy().getProperties().getTimeout();
- return TimeUnit.MILLISECONDS.convert(timeout, TimeUnit.SECONDS);
- }
-
- /**
- * Check an event syntax.
- *
- * @param event the event syntax
- * @throws ControlLoopException if an error occurs
- */
- protected void checkEventSyntax(VirtualControlLoopEvent event) throws ControlLoopException {
- validateStatus(event);
- if (StringUtils.isBlank(event.getClosedLoopControlName())) {
- throw new ControlLoopException("No control loop name");
- }
- if (event.getRequestId() == null) {
- throw new ControlLoopException("No request ID");
- }
- if (event.getClosedLoopEventStatus() == ControlLoopEventStatus.ABATED) {
- return;
- }
- if (StringUtils.isBlank(event.getTarget())) {
- throw new ControlLoopException("No target field");
- } else if (!VALID_TARGETS.contains(event.getTarget().toLowerCase())) {
- throw new ControlLoopException("target field invalid");
- }
- validateAaiData(event);
- }
-
- private void validateStatus(VirtualControlLoopEvent event) throws ControlLoopException {
- if (event.getClosedLoopEventStatus() != ControlLoopEventStatus.ONSET
- && event.getClosedLoopEventStatus() != ControlLoopEventStatus.ABATED) {
- throw new ControlLoopException("Invalid value in closedLoopEventStatus");
- }
- }
-
- private void validateAaiData(VirtualControlLoopEvent event) throws ControlLoopException {
- Map<String, String> eventAai = event.getAai();
- if (eventAai == null) {
- throw new ControlLoopException("AAI is null");
- }
- if (event.getTargetType() == null) {
- throw new ControlLoopException("The Target type is null");
- }
- switch (event.getTargetType()) {
- case VM:
- case VNF:
- validateAaiVmVnfData(eventAai);
- return;
- case PNF:
- validateAaiPnfData(eventAai);
- return;
- default:
- throw new ControlLoopException("The target type is not supported");
- }
- }
-
- private void validateAaiVmVnfData(Map<String, String> eventAai) throws ControlLoopException {
- if (eventAai.get(GENERIC_VNF_VNF_ID) == null && eventAai.get(VSERVER_VSERVER_NAME) == null
- && eventAai.get(GENERIC_VNF_VNF_NAME) == null) {
- throw new ControlLoopException(
- "generic-vnf.vnf-id or generic-vnf.vnf-name or vserver.vserver-name information missing");
- }
- }
-
- private void validateAaiPnfData(Map<String, String> eventAai) throws ControlLoopException {
- if (eventAai.get(PNF_NAME) == null) {
- throw new ControlLoopException("AAI PNF object key pnf-name is missing");
- }
- }
-
- /**
- * Is closed loop disabled for an event.
- *
- * @param event the event
- * @return <code>true</code> if the control loop is disabled, <code>false</code>
- * otherwise
- */
- private static boolean isClosedLoopDisabled(VirtualControlLoopEvent event) {
- Map<String, String> aai = event.getAai();
- return (isAaiTrue(aai.get(VSERVER_IS_CLOSED_LOOP_DISABLED))
- || isAaiTrue(aai.get(GENERIC_VNF_IS_CLOSED_LOOP_DISABLED))
- || isAaiTrue(aai.get(PNF_IS_IN_MAINT)));
- }
-
- /**
- * Does provisioning status, for an event, have a value other than ACTIVE.
- *
- * @param event the event
- * @return {@code true} if the provisioning status is neither ACTIVE nor {@code null},
- * {@code false} otherwise
- */
- private static boolean isProvStatusInactive(VirtualControlLoopEvent event) {
- Map<String, String> aai = event.getAai();
- return !(PROV_STATUS_ACTIVE.equalsIgnoreCase(aai.getOrDefault(VSERVER_PROV_STATUS, PROV_STATUS_ACTIVE))
- && PROV_STATUS_ACTIVE.equalsIgnoreCase(
- aai.getOrDefault(GENERIC_VNF_PROV_STATUS, PROV_STATUS_ACTIVE)));
- }
-
- /**
- * Determines the boolean value represented by the given AAI field value.
- *
- * @param aaiValue value to be examined
- * @return the boolean value represented by the field value, or {@code false} if the
- * value is {@code null}
- */
- private static boolean isAaiTrue(String aaiValue) {
- return (aaiValue != null && TRUE_VALUES.contains(aaiValue.toLowerCase()));
- }
-
- /**
- * Requests a lock. This requests the lock for the time that remains before the
- * timeout expires. This avoids having to extend the lock.
- *
- * @param targetEntity entity to be locked
- * @param lockUnavailableCallback function to be invoked if the lock is
- * unavailable/lost
- * @return a future that can be used to await the lock
- */
- @Override
- public synchronized CompletableFuture<OperationOutcome> requestLock(String targetEntity,
- Consumer<OperationOutcome> lockUnavailableCallback) {
-
- long remainingMs = endTimeMs - System.currentTimeMillis();
- int remainingSec = 15 + Math.max(0, (int) TimeUnit.SECONDS.convert(remainingMs, TimeUnit.MILLISECONDS));
-
- LockData data = target2lock.computeIfAbsent(targetEntity, key -> {
- LockData data2 = new LockData(key, requestId);
- makeLock(targetEntity, requestId.toString(), remainingSec, data2);
- return data2;
- });
-
- data.addUnavailableCallback(lockUnavailableCallback);
-
- return data.getFuture();
- }
-
- /**
- * Initializes various components, on demand.
- */
- private static class LazyInitData {
- private static final OperationHistoryDataManager DATA_MANAGER;
- private static final ActorService ACTOR_SERVICE;
-
- static {
- EventManagerServices services = new EventManagerServices(EVENT_MANAGER_SERVICE_CONFIG);
- ACTOR_SERVICE = services.getActorService();
- DATA_MANAGER = services.getDataManager();
- }
- }
-
- // the following methods may be overridden by junit tests
-
- protected ControlLoopOperationManager2 makeOperationManager(ControlLoopEventContext ctx, Operation operation) {
- return new ControlLoopOperationManager2(this, ctx, operation, getExecutor());
- }
-
- protected Executor getExecutor() {
- return ForkJoinPool.commonPool();
- }
-
- protected ExecutorService getBlockingExecutor() {
- return PolicyEngineConstants.getManager().getExecutorService();
- }
-
- protected void makeLock(String targetEntity, String requestId, int holdSec, LockCallback callback) {
- PolicyEngineConstants.getManager().createLock(targetEntity, requestId, holdSec, callback, false);
- }
-
- @Override
- public ActorService getActorService() {
- return LazyInitData.ACTOR_SERVICE;
- }
-
- @Override
- public OperationHistoryDataManager getDataManager() {
- return LazyInitData.DATA_MANAGER;
- }
-
- /* ============================================================ */
-
- /**
- * This is a method, invoked from the 'start' method -- it gives subclasses
- * the ability to add operations. The default implementation does nothing.
- */
- protected void startHook() {
- }
-
- /**
- * This is an abstract method that is called after a notable update has
- * occurred to the 'ControlLoopEventManager2' object. It gives subclasses
- * the ability to add a callback method to process state changes.
- */
- protected abstract void notifyUpdate();
-}
diff --git a/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManager2Drools.java b/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManager2Drools.java
deleted file mode 100644
index 9e8af9afb..000000000
--- a/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManager2Drools.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP
- * ================================================================================
- * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.controlloop.eventmanager;
-
-import org.drools.core.WorkingMemory;
-import org.kie.api.runtime.rule.FactHandle;
-import org.onap.policy.controlloop.ControlLoopException;
-import org.onap.policy.controlloop.VirtualControlLoopEvent;
-import org.onap.policy.controlloop.drl.legacy.ControlLoopParams;
-
-/**
- * Manager for a single control loop event. Once this has been created, the event can be
- * retracted from working memory. Once this has been created, {@link #start()} should be
- * invoked, and then {@link #nextStep()} should be invoked continually until
- * {@link #isActive()} returns {@code false}, indicating that all steps have completed.
- */
-public class ControlLoopEventManager2Drools extends ControlLoopEventManager2 {
- private static final long serialVersionUID = 1L;
-
- private final transient WorkingMemory workMem;
- private transient FactHandle factHandle;
-
- /**
- * Constructs the object.
- *
- * @param params control loop parameters
- * @param event event to be managed by this object
- * @param workMem working memory to update if this changes
- * @throws ControlLoopException if the event is invalid or if a YAML processor cannot
- * be created
- */
- public ControlLoopEventManager2Drools(ControlLoopParams params, VirtualControlLoopEvent event,
- WorkingMemory workMem) throws ControlLoopException {
-
- super(params, event);
- this.workMem = workMem;
- }
-
- /**
- * This is a hook added to 'ControlLoopEventManager2.start()' --
- * here, we add an additional check.
- */
- @Override
- protected void startHook() {
- if ((factHandle = workMem.getFactHandle(this)) == null) {
- throw new IllegalStateException("manager is not in working memory");
- }
- }
-
- /**
- * This is a hook added to 'ControlLoopEventManager2.updated(...)' --
- * here, we mark it as updated in Drools memory.
- */
- @Override
- protected void notifyUpdate() {
- workMem.update(factHandle, this);
- }
-}
diff --git a/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManager2.java b/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManager2.java
deleted file mode 100644
index ea269fe46..000000000
--- a/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManager2.java
+++ /dev/null
@@ -1,820 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP
- * ================================================================================
- * Copyright (C) 2017-2020 AT&T Intellectual Property. All rights reserved.
- * Modifications Copyright (C) 2019 Huawei Technologies Co., Ltd. All rights reserved.
- * Modifications Copyright (C) 2019 Tech Mahindra
- * Modifications Copyright (C) 2019 Bell Canada.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.controlloop.eventmanager;
-
-import java.io.Serializable;
-import java.time.Instant;
-import java.util.Deque;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.CancellationException;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ConcurrentLinkedDeque;
-import java.util.concurrent.Executor;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.stream.Collectors;
-import lombok.AccessLevel;
-import lombok.Getter;
-import lombok.ToString;
-import org.onap.policy.aai.AaiConstants;
-import org.onap.policy.aai.AaiCqResponse;
-import org.onap.policy.controlloop.ControlLoopOperation;
-import org.onap.policy.controlloop.ControlLoopResponse;
-import org.onap.policy.controlloop.VirtualControlLoopEvent;
-import org.onap.policy.controlloop.actor.guard.GuardActor;
-import org.onap.policy.controlloop.actor.sdnr.SdnrActor;
-import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome;
-import org.onap.policy.controlloop.actorserviceprovider.OperationResult;
-import org.onap.policy.controlloop.actorserviceprovider.TargetType;
-import org.onap.policy.controlloop.actorserviceprovider.controlloop.ControlLoopEventContext;
-import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams;
-import org.onap.policy.controlloop.actorserviceprovider.pipeline.PipelineUtil;
-import org.onap.policy.drools.domain.models.operational.OperationalTarget;
-import org.onap.policy.sdnr.PciMessage;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Manages a single Operation for a single event. Once this has been created,
- * {@link #start()} should be invoked, and then {@link #nextStep()} should be invoked
- * continually until it returns {@code false}, indicating that all steps have completed.
- */
-@ToString(onlyExplicitlyIncluded = true)
-public class ControlLoopOperationManager2 implements Serializable {
- private static final long serialVersionUID = -3773199283624595410L;
- private static final Logger logger = LoggerFactory.getLogger(ControlLoopOperationManager2.class);
- private static final String CL_TIMEOUT_ACTOR = "-CL-TIMEOUT-";
- public static final String LOCK_ACTOR = "LOCK";
- public static final String LOCK_OPERATION = "Lock";
- private static final String GUARD_ACTOR = GuardActor.NAME;
- public static final String VSERVER_VSERVER_NAME = "vserver.vserver-name";
- public static final String GENERIC_VNF_VNF_NAME = "generic-vnf.vnf-name";
- public static final String GENERIC_VNF_VNF_ID = "generic-vnf.vnf-id";
- public static final String PNF_NAME = "pnf.pnf-name";
-
- // @formatter:off
- public enum State {
- ACTIVE,
- LOCK_DENIED,
- LOCK_LOST,
- GUARD_STARTED,
- GUARD_PERMITTED,
- GUARD_DENIED,
- OPERATION_STARTED,
- OPERATION_SUCCESS,
- OPERATION_FAILURE,
- CONTROL_LOOP_TIMEOUT
- }
- // @formatter:on
-
- private final transient ManagerContext operContext;
- private final transient ControlLoopEventContext eventContext;
- private final org.onap.policy.drools.domain.models.operational.Operation policy;
-
- @Getter
- @ToString.Include
- private State state = State.ACTIVE;
-
- @ToString.Include
- private final String requestId;
-
- @ToString.Include
- private final String policyId;
-
- /**
- * Bumped each time the "complete" callback is invoked by the Actor, provided it's for
- * this operation.
- */
- @ToString.Include
- private int attempts = 0;
-
- private final Deque<Operation> operationHistory = new ConcurrentLinkedDeque<>();
-
- /**
- * Set to {@code true} to prevent the last item in {@link #operationHistory} from
- * being included in the outcome of {@link #getHistory()}. Used when the operation
- * aborts prematurely due to lock-denied, guard-denied, etc.
- */
- private boolean holdLast = false;
-
- /**
- * Queue of outcomes yet to be processed. Outcomes are added to this each time the
- * "start" or "complete" callback is invoked.
- */
- @Getter(AccessLevel.PROTECTED)
- private final transient Deque<OperationOutcome> outcomes = new ConcurrentLinkedDeque<>();
-
- /**
- * Used to cancel the running operation.
- */
- @Getter(AccessLevel.PROTECTED)
- private transient CompletableFuture<OperationOutcome> future = null;
-
- /**
- * Target entity. Determined after the lock is granted, though it may require the
- * custom query to be performed first.
- */
- @Getter
- private String targetEntity;
-
- @Getter(AccessLevel.PROTECTED)
- private final transient ControlLoopOperationParams params;
- private final transient PipelineUtil taskUtil;
-
- @Getter
- private ControlLoopResponse controlLoopResponse;
-
- /**
- * Time when the lock was first requested.
- */
- private transient AtomicReference<Instant> lockStart = new AtomicReference<>();
-
- // values extracted from the policy
- @Getter
- private final String actor;
- @Getter
- private final String operation;
-
- private final String targetStr;
- private final OperationalTarget target;
-
-
- /**
- * Construct an instance.
- *
- * @param operContext this operation's context
- * @param context event context
- * @param operation2 operation's policy
- * @param executor executor for the Operation
- */
- public ControlLoopOperationManager2(ManagerContext operContext, ControlLoopEventContext context,
- org.onap.policy.drools.domain.models.operational.Operation operation2, Executor executor) {
-
- this.operContext = operContext;
- this.eventContext = context;
- this.policy = operation2;
- this.requestId = context.getEvent().getRequestId().toString();
- this.policyId = "" + operation2.getId();
- this.actor = operation2.getActorOperation().getActor();
- this.operation = operation2.getActorOperation().getOperation();
- this.target = operation2.getActorOperation().getTarget();
-
- String targetType = (target != null ? target.getTargetType() : null);
- Map<String, String> entityIds = (target != null ? target.getEntityIds() : null);
-
- // TODO encode()?
- this.targetStr = (target != null ? target.toString() : null);
-
- // @formatter:off
- params = ControlLoopOperationParams.builder()
- .actorService(operContext.getActorService())
- .actor(actor)
- .operation(operation)
- .context(context)
- .executor(executor)
- .targetType(TargetType.toTargetType(targetType))
- .targetEntityIds(entityIds)
- .startCallback(this::onStart)
- .completeCallback(this::onComplete)
- .build();
- // @formatter:on
-
- taskUtil = new PipelineUtil(params);
- }
-
- //
- // Internal class used for tracking
- //
- @Getter
- @ToString
- private class Operation implements Serializable {
- private static final long serialVersionUID = 1L;
-
- private int attempt;
- private OperationResult policyResult;
- private ControlLoopOperation clOperation;
- private ControlLoopResponse clResponse;
-
- /**
- * Constructs the object.
- *
- * @param outcome outcome of the operation
- */
- public Operation(OperationOutcome outcome) {
- attempt = ControlLoopOperationManager2.this.attempts;
- policyResult = outcome.getResult();
- clOperation = outcome.toControlLoopOperation();
- clOperation.setTarget(targetStr);
- clResponse = makeControlLoopResponse(outcome);
-
- if (outcome.getEnd() == null) {
- clOperation.setOutcome("Started");
- } else if (clOperation.getOutcome() == null) {
- clOperation.setOutcome("");
- }
- }
- }
-
- /**
- * Start the operation, first acquiring any locks that are needed. This should not
- * throw any exceptions, but will, instead, invoke the callbacks with exceptions.
- *
- * @param remainingMs time remaining, in milliseconds, for the control loop
- */
- @SuppressWarnings("unchecked")
- public synchronized void start(long remainingMs) {
- // this is synchronized while we update "future"
-
- try {
- // provide a default, in case something fails before requestLock() is called
- lockStart.set(Instant.now());
-
- // @formatter:off
- future = taskUtil.sequence(
- this::detmTarget,
- this::requestLock,
- this::startOperation);
- // @formatter:on
-
- // handle any exceptions that may be thrown, set timeout, and handle timeout
-
- // @formatter:off
- future.exceptionally(this::handleException)
- .orTimeout(remainingMs, TimeUnit.MILLISECONDS)
- .exceptionally(this::handleTimeout);
- // @formatter:on
-
- } catch (RuntimeException e) {
- handleException(e);
- }
- }
-
- /**
- * Start the operation, after the lock has been acquired.
- *
- * @return CompletableFuture for the operation being started
- */
- private CompletableFuture<OperationOutcome> startOperation() {
- // @formatter:off
- ControlLoopOperationParams params2 = params.toBuilder()
- .payload(new LinkedHashMap<>())
- .retry(policy.getRetries())
- .timeoutSec(policy.getTimeout())
- .targetEntity(targetEntity)
- .build();
- // @formatter:on
-
- if (policy.getActorOperation().getPayload() != null) {
- params2.getPayload().putAll(policy.getActorOperation().getPayload());
- }
-
- return params2.start();
- }
-
- /**
- * Handles exceptions that may be generated.
- *
- * @param thrown exception that was generated
- * @return {@code null}
- */
- private OperationOutcome handleException(Throwable thrown) { // NOSONAR
- /*
- * disabling sonar about returning the same value because we prefer the code to be
- * structured this way
- */
-
- if (thrown instanceof CancellationException || thrown.getCause() instanceof CancellationException) {
- return null;
- }
-
- logger.warn("{}.{}: exception starting operation for {}", actor, operation, requestId, thrown);
- OperationOutcome outcome = taskUtil.setOutcome(params.makeOutcome(), thrown);
- outcome.setStart(lockStart.get());
- outcome.setEnd(Instant.now());
- outcome.setFinalOutcome(true);
- onComplete(outcome);
-
- // this outcome is not used so just return "null"
- return null;
- }
-
- /**
- * Handles control loop timeout exception.
- *
- * @param thrown exception that was generated
- * @return {@code null}
- */
- private OperationOutcome handleTimeout(Throwable thrown) {
- logger.warn("{}.{}: control loop timeout for {}", actor, operation, requestId, thrown);
-
- OperationOutcome outcome = taskUtil.setOutcome(params.makeOutcome(), thrown);
- outcome.setActor(CL_TIMEOUT_ACTOR);
- outcome.setOperation(null);
- outcome.setStart(lockStart.get());
- outcome.setEnd(Instant.now());
- outcome.setFinalOutcome(true);
- onComplete(outcome);
-
- // cancel the operation, if it's still running
- future.cancel(false);
-
- // this outcome is not used so just return "null"
- return null;
- }
-
- /**
- * Cancels the operation.
- */
- public void cancel() {
- synchronized (this) {
- if (future == null) {
- return;
- }
- }
-
- future.cancel(false);
- }
-
- /**
- * Requests a lock on the {@link #targetEntity}.
- *
- * @return a future to await the lock
- */
- private CompletableFuture<OperationOutcome> requestLock() {
- /*
- * Failures are handled via the callback, and successes are discarded by
- * sequence(), without passing them to onComplete().
- *
- * Return a COPY of the future so that if we try to cancel it, we'll only cancel
- * the copy, not the original. This is done by tacking thenApply() onto the end.
- */
- lockStart.set(Instant.now());
- return operContext.requestLock(targetEntity, this::lockUnavailable).thenApply(outcome -> outcome);
- }
-
- /**
- * Indicates that the lock on the target entity is unavailable.
- *
- * @param outcome lock outcome
- */
- private void lockUnavailable(OperationOutcome outcome) {
-
- // Note: NEVER invoke onStart() for locks; only invoke onComplete()
- onComplete(outcome);
-
- /*
- * Now that we've added the lock outcome to the queue, ensure the future is
- * canceled, which may, itself, generate an operation outcome.
- */
- cancel();
- }
-
- /**
- * Handles responses provided via the "start" callback. Note: this is never be invoked
- * for locks; only {@link #onComplete(OperationOutcome)} is invoked for locks.
- *
- * @param outcome outcome provided to the callback
- */
- private void onStart(OperationOutcome outcome) {
- if (outcome.isFor(actor, operation) || GUARD_ACTOR.equals(outcome.getActor())) {
- addOutcome(outcome);
- }
- }
-
- /**
- * Handles responses provided via the "complete" callback. Note: this is never invoked
- * for "successful" locks.
- *
- * @param outcome outcome provided to the callback
- */
- private void onComplete(OperationOutcome outcome) {
-
- switch (outcome.getActor()) {
- case LOCK_ACTOR:
- case GUARD_ACTOR:
- case CL_TIMEOUT_ACTOR:
- addOutcome(outcome);
- break;
-
- default:
- if (outcome.isFor(actor, operation)) {
- addOutcome(outcome);
- }
- break;
- }
- }
-
- /**
- * Adds an outcome to {@link #outcomes}.
- *
- * @param outcome outcome to be added
- */
- private synchronized void addOutcome(OperationOutcome outcome) {
- /*
- * This is synchronized to prevent nextStep() from invoking processOutcome() at
- * the same time.
- */
-
- logger.debug("added outcome={} for {}", outcome, requestId);
- outcomes.add(outcome);
-
- if (outcomes.peekFirst() == outcomes.peekLast()) {
- // this is the first outcome in the queue - process it
- processOutcome();
- }
- }
-
- /**
- * Looks for the next step in the queue.
- *
- * @return {@code true} if more responses are expected, {@code false} otherwise
- */
- public synchronized boolean nextStep() {
- switch (state) {
- case LOCK_DENIED:
- case LOCK_LOST:
- case GUARD_DENIED:
- case CONTROL_LOOP_TIMEOUT:
- holdLast = false;
- return false;
- default:
- break;
- }
-
- OperationOutcome outcome = outcomes.peek();
- if (outcome == null) {
- // empty queue
- return true;
- }
-
- if (outcome.isFinalOutcome() && outcome.isFor(actor, operation)) {
- controlLoopResponse = null;
- return false;
- }
-
- // first item has been processed, remove it
- outcomes.remove();
- if (!outcomes.isEmpty()) {
- // have a new "first" item - process it
- processOutcome();
- }
-
- return true;
- }
-
- /**
- * Processes the first item in {@link #outcomes}. Sets the state, increments
- * {@link #attempts}, if appropriate, and stores the operation history in the DB.
- */
- private synchronized void processOutcome() {
- OperationOutcome outcome = outcomes.peek();
- logger.debug("process outcome={} for {}", outcome, requestId);
-
- controlLoopResponse = null;
-
- switch (outcome.getActor()) {
-
- case CL_TIMEOUT_ACTOR:
- state = State.CONTROL_LOOP_TIMEOUT;
- processAbort(outcome, OperationResult.FAILURE, "Control loop timed out");
- break;
-
- case LOCK_ACTOR:
- // lock is no longer available
- if (state == State.ACTIVE) {
- state = State.LOCK_DENIED;
- storeFailureInDataBase(outcome, OperationResult.FAILURE_GUARD, "Operation denied by Lock");
- } else {
- state = State.LOCK_LOST;
- processAbort(outcome, OperationResult.FAILURE, "Operation aborted by Lock");
- }
- break;
-
- case GUARD_ACTOR:
- if (outcome.getEnd() == null) {
- state = State.GUARD_STARTED;
- } else if (outcome.getResult() == OperationResult.SUCCESS) {
- state = State.GUARD_PERMITTED;
- } else {
- state = State.GUARD_DENIED;
- storeFailureInDataBase(outcome, OperationResult.FAILURE_GUARD, "Operation denied by Guard");
- }
- break;
-
- default:
- if (outcome.getEnd() == null) {
- // operation started
- ++attempts;
- state = State.OPERATION_STARTED;
-
- } else {
- /*
- * Operation completed. If the last entry was a "start" (i.e., "end" field
- * is null), then replace it. Otherwise, just add the completion.
- */
- state = (outcome.getResult() == OperationResult.SUCCESS ? State.OPERATION_SUCCESS
- : State.OPERATION_FAILURE);
- controlLoopResponse = makeControlLoopResponse(outcome);
- if (!operationHistory.isEmpty() && operationHistory.peekLast().getClOperation().getEnd() == null) {
- operationHistory.removeLast();
- }
- }
-
- operationHistory.add(new Operation(outcome));
- storeOperationInDataBase();
- break;
- }
-
- // indicate that this has changed
- operContext.updated(this);
- }
-
- /**
- * Processes an operation abort, updating the DB record, if an operation has been
- * started.
- *
- * @param outcome operation outcome
- * @param result result to put into the DB
- * @param message message to put into the DB
- */
- private void processAbort(OperationOutcome outcome, OperationResult result, String message) {
- if (operationHistory.isEmpty() || operationHistory.peekLast().getClOperation().getEnd() != null) {
- // last item was not a "start" operation
-
- // NOTE: do NOT generate control loop response since operation was not started
-
- storeFailureInDataBase(outcome, result, message);
- return;
- }
-
- // last item was a "start" operation - replace it with a failure
- final Operation operOrig = operationHistory.removeLast();
-
- // use start time from the operation, itself
- if (operOrig != null && operOrig.getClOperation() != null) {
- outcome.setStart(operOrig.getClOperation().getStart());
- }
-
- controlLoopResponse = makeControlLoopResponse(outcome);
-
- storeFailureInDataBase(outcome, result, message);
- }
-
- /**
- * Makes a control loop response.
- *
- * @param outcome operation outcome
- * @return a new control loop response, or {@code null} if none is required
- */
- protected ControlLoopResponse makeControlLoopResponse(OperationOutcome outcome) {
-
- // only generate response for certain actors.
- if (outcome == null || !actor.equals(SdnrActor.NAME)) {
- return null;
- }
-
- VirtualControlLoopEvent event = eventContext.getEvent();
-
- ControlLoopResponse clRsp = new ControlLoopResponse();
- clRsp.setFrom(actor);
- clRsp.setTarget("DCAE");
- clRsp.setClosedLoopControlName(event.getClosedLoopControlName());
- clRsp.setPolicyName(event.getPolicyName());
- clRsp.setPolicyVersion(event.getPolicyVersion());
- clRsp.setRequestId(event.getRequestId());
- clRsp.setVersion(event.getVersion());
-
- PciMessage msg = outcome.getResponse();
- if (msg != null && msg.getBody() != null && msg.getBody().getOutput() != null) {
- clRsp.setPayload(msg.getBody().getOutput().getPayload());
- }
-
- return clRsp;
- }
-
- /**
- * Get the operation, as a message.
- *
- * @return the operation, as a message
- */
- public String getOperationMessage() {
- Operation last = operationHistory.peekLast();
- return (last == null ? null : last.getClOperation().toMessage());
- }
-
- /**
- * Gets the operation result.
- *
- * @return the operation result
- */
- public OperationResult getOperationResult() {
- Operation last = operationHistory.peekLast();
- return (last == null ? OperationResult.FAILURE_EXCEPTION : last.getPolicyResult());
- }
-
- /**
- * Get the latest operation history.
- *
- * @return the latest operation history
- */
- public String getOperationHistory() {
- Operation last = operationHistory.peekLast();
- return (last == null ? null : last.clOperation.toHistory());
- }
-
- /**
- * Get the history.
- *
- * @return the list of control loop operations
- */
- public List<ControlLoopOperation> getHistory() {
- Operation last = (holdLast ? operationHistory.removeLast() : null);
-
- List<ControlLoopOperation> result = operationHistory.stream().map(Operation::getClOperation)
- .map(ControlLoopOperation::new).collect(Collectors.toList());
-
- if (last != null) {
- operationHistory.add(last);
- }
-
- return result;
- }
-
- /**
- * Stores a failure in the DB.
- *
- * @param outcome operation outcome
- * @param result result to put into the DB
- * @param message message to put into the DB
- */
- private void storeFailureInDataBase(OperationOutcome outcome, OperationResult result, String message) {
- // don't include this in history yet
- holdLast = true;
-
- outcome.setActor(actor);
- outcome.setOperation(operation);
- outcome.setMessage(message);
- outcome.setResult(result);
-
- operationHistory.add(new Operation(outcome));
- storeOperationInDataBase();
- }
-
- /**
- * Stores the latest operation in the DB.
- */
- private void storeOperationInDataBase() {
- operContext.getDataManager().store(requestId, eventContext.getEvent(), targetEntity,
- operationHistory.peekLast().getClOperation());
- }
-
- /**
- * Determines the target entity.
- *
- * @return a future to determine the target entity, or {@code null} if the entity has
- * already been determined
- */
- protected CompletableFuture<OperationOutcome> detmTarget() {
- if (target == null) {
- throw new IllegalArgumentException("The target is null");
- }
-
- if (target.getTargetType() == null) {
- throw new IllegalArgumentException("The target type is null");
- }
-
- switch (TargetType.toTargetType(target.getTargetType())) {
- case PNF:
- return detmPnfTarget();
- case VM:
- case VNF:
- case VFMODULE:
- return detmVfModuleTarget();
- default:
- throw new IllegalArgumentException("The target type is not supported");
- }
- }
-
- /**
- * Determines the PNF target entity.
- *
- * @return a future to determine the target entity, or {@code null} if the entity has
- * already been determined
- */
- private CompletableFuture<OperationOutcome> detmPnfTarget() {
- if (!PNF_NAME.equalsIgnoreCase(eventContext.getEvent().getTarget())) {
- throw new IllegalArgumentException("Target does not match target type");
- }
-
- targetEntity = eventContext.getEnrichment().get(PNF_NAME);
- if (targetEntity == null) {
- throw new IllegalArgumentException("AAI section is missing " + PNF_NAME);
- }
-
- return null;
- }
-
- /**
- * Determines the VF Module target entity.
- *
- * @return a future to determine the target entity, or {@code null} if the entity has
- * already been determined
- */
- private CompletableFuture<OperationOutcome> detmVfModuleTarget() {
- String targetFieldName = eventContext.getEvent().getTarget();
- if (targetFieldName == null) {
- throw new IllegalArgumentException("Target is null");
- }
-
- switch (targetFieldName.toLowerCase()) {
- case VSERVER_VSERVER_NAME:
- targetEntity = eventContext.getEnrichment().get(VSERVER_VSERVER_NAME);
- break;
- case GENERIC_VNF_VNF_ID:
- targetEntity = eventContext.getEnrichment().get(GENERIC_VNF_VNF_ID);
- break;
- case GENERIC_VNF_VNF_NAME:
- return detmVnfName();
- default:
- throw new IllegalArgumentException("Target does not match target type");
- }
-
- if (targetEntity == null) {
- throw new IllegalArgumentException("Enrichment data is missing " + targetFieldName);
- }
-
- return null;
- }
-
- /**
- * Determines the VNF Name target entity.
- *
- * @return a future to determine the target entity, or {@code null} if the entity has
- * already been determined
- */
- @SuppressWarnings("unchecked")
- private CompletableFuture<OperationOutcome> detmVnfName() {
- // if the onset is enriched with the vnf-id, we don't need an A&AI response
- targetEntity = eventContext.getEnrichment().get(GENERIC_VNF_VNF_ID);
- if (targetEntity != null) {
- return null;
- }
-
- // vnf-id was not in the onset - obtain it via the custom query
-
- // @formatter:off
- ControlLoopOperationParams cqparams = params.toBuilder()
- .actor(AaiConstants.ACTOR_NAME)
- .operation(AaiCqResponse.OPERATION)
- .targetEntity("")
- .build();
- // @formatter:on
-
- // perform custom query and then extract the VNF ID from it
- return taskUtil.sequence(() -> eventContext.obtain(AaiCqResponse.CONTEXT_KEY, cqparams),
- this::extractVnfFromCq);
- }
-
- /**
- * Extracts the VNF Name target entity from the custom query data.
- *
- * @return {@code null}
- */
- private CompletableFuture<OperationOutcome> extractVnfFromCq() {
- // already have the CQ data
- AaiCqResponse cq = eventContext.getProperty(AaiCqResponse.CONTEXT_KEY);
- if (cq.getDefaultGenericVnf() == null) {
- throw new IllegalArgumentException("No vnf-id found");
- }
-
- targetEntity = cq.getDefaultGenericVnf().getVnfId();
- if (targetEntity == null) {
- throw new IllegalArgumentException("No vnf-id found");
- }
-
- return null;
- }
-}
diff --git a/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/LockData.java b/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/LockData.java
index 119d14651..67eddba34 100644
--- a/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/LockData.java
+++ b/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/LockData.java
@@ -169,8 +169,8 @@ public class LockData implements LockCallback {
*/
private OperationOutcome makeOutcome() {
OperationOutcome outcome = new OperationOutcome();
- outcome.setActor(ControlLoopOperationManager2.LOCK_ACTOR);
- outcome.setOperation(ControlLoopOperationManager2.LOCK_OPERATION);
+ outcome.setActor(ActorConstants.LOCK_ACTOR);
+ outcome.setOperation(ActorConstants.LOCK_OPERATION);
outcome.setTarget(targetEntity);
outcome.setFinalOutcome(true);
outcome.setStart(createTime);
diff --git a/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ManagerContext.java b/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ManagerContext.java
deleted file mode 100644
index 0dcd30269..000000000
--- a/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ManagerContext.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP
- * ================================================================================
- * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.controlloop.eventmanager;
-
-import java.util.concurrent.CompletableFuture;
-import java.util.function.Consumer;
-import org.onap.policy.controlloop.actorserviceprovider.ActorService;
-import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome;
-import org.onap.policy.controlloop.ophistory.OperationHistoryDataManager;
-
-/**
- * Context for the Operation Manager.
- */
-public interface ManagerContext {
-
- /**
- * Gets the actor service.
- *
- * @return the actor service
- */
- ActorService getActorService();
-
- /**
- * Gets the operation history data manager.
- *
- * @return the operation history data manager
- */
- OperationHistoryDataManager getDataManager();
-
- /**
- * Requests a lock on the specified target.
- *
- * @param target target to be locked
- * @param lockUnavailableCallback callback to be invoked if the lock is
- * unavailable/lost
- * @return a future to await the lock
- */
- CompletableFuture<OperationOutcome> requestLock(String target, Consumer<OperationOutcome> lockUnavailableCallback);
-
- /**
- * Indicates that the given operation manager has been updated.
- *
- * @param operationMgr operation manager that has been updated
- */
- void updated(ControlLoopOperationManager2 operationMgr);
-}