From e8369d6d3088b7b68acb987ebff432ac830a3200 Mon Sep 17 00:00:00 2001 From: Jim Hahn Date: Mon, 26 Oct 2020 16:48:47 -0400 Subject: 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 --- .../eventmanager/ControlLoopEventManager2.java | 648 ---------------- .../ControlLoopEventManager2Drools.java | 76 -- .../eventmanager/ControlLoopOperationManager2.java | 820 --------------------- .../policy/controlloop/eventmanager/LockData.java | 4 +- .../controlloop/eventmanager/ManagerContext.java | 64 -- 5 files changed, 2 insertions(+), 1610 deletions(-) delete mode 100644 controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManager2.java delete mode 100644 controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManager2Drools.java delete mode 100644 controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManager2.java delete mode 100644 controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ManagerContext.java (limited to 'controlloop/common/eventmanager/src/main') 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 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 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 controlLoopHistory = new LinkedList<>(); - - /** - * Maps a target entity to its lock. - */ - private final transient Map target2lock = new HashMap<>(); - - private final ControlLoopProcessor processor; - private final AtomicReference 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 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 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 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 true if the control loop is disabled, false - * otherwise - */ - private static boolean isClosedLoopDisabled(VirtualControlLoopEvent event) { - Map 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 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 requestLock(String targetEntity, - Consumer 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 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 outcomes = new ConcurrentLinkedDeque<>(); - - /** - * Used to cancel the running operation. - */ - @Getter(AccessLevel.PROTECTED) - private transient CompletableFuture 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 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 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 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 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 getHistory() { - Operation last = (holdLast ? operationHistory.removeLast() : null); - - List 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 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 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 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 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 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 requestLock(String target, Consumer lockUnavailableCallback); - - /** - * Indicates that the given operation manager has been updated. - * - * @param operationMgr operation manager that has been updated - */ - void updated(ControlLoopOperationManager2 operationMgr); -} -- cgit 1.2.3-korg