2  * ============LICENSE_START=======================================================
 
   4  * ================================================================================
 
   5  * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved.
 
   6  * ================================================================================
 
   7  * Licensed under the Apache License, Version 2.0 (the "License");
 
   8  * you may not use this file except in compliance with the License.
 
   9  * You may obtain a copy of the License at
 
  11  *      http://www.apache.org/licenses/LICENSE-2.0
 
  13  * Unless required by applicable law or agreed to in writing, software
 
  14  * distributed under the License is distributed on an "AS IS" BASIS,
 
  15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  16  * See the License for the specific language governing permissions and
 
  17  * limitations under the License.
 
  18  * ============LICENSE_END=========================================================
 
  21 package org.onap.policy.controlloop.actorserviceprovider.parameters;
 
  24 import java.util.UUID;
 
  25 import java.util.concurrent.CompletableFuture;
 
  26 import java.util.concurrent.Executor;
 
  27 import java.util.concurrent.ForkJoinPool;
 
  28 import java.util.function.Consumer;
 
  29 import lombok.AllArgsConstructor;
 
  30 import lombok.Builder;
 
  31 import lombok.EqualsAndHashCode;
 
  33 import org.onap.policy.common.parameters.BeanValidationResult;
 
  34 import org.onap.policy.common.parameters.BeanValidator;
 
  35 import org.onap.policy.common.parameters.annotations.NotNull;
 
  36 import org.onap.policy.controlloop.actorserviceprovider.ActorService;
 
  37 import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome;
 
  38 import org.onap.policy.controlloop.actorserviceprovider.Util;
 
  39 import org.onap.policy.controlloop.actorserviceprovider.controlloop.ControlLoopEventContext;
 
  40 import org.onap.policy.controlloop.policy.Target;
 
  41 import org.slf4j.Logger;
 
  42 import org.slf4j.LoggerFactory;
 
  45  * Parameters for control loop operations. The executor defaults to
 
  46  * {@link ForkJoinPool#commonPool()}, but may be overridden.
 
  49 @Builder(toBuilder = true)
 
  52 public class ControlLoopOperationParams {
 
  53     private static final Logger logger = LoggerFactory.getLogger(ControlLoopOperationParams.class);
 
  62      * Actor service in which to find the actor/operation.
 
  65     private ActorService actorService;
 
  68      * Event for which the operation applies.
 
  71     private ControlLoopEventContext context;
 
  74      * Executor to use to run the operation.
 
  78     private Executor executor = ForkJoinPool.commonPool();
 
  84     private String operation;
 
  87      * Payload data for the request.
 
  89     private Map<String, String> payload;
 
  92      * Number of retries allowed, or {@code null} if no retries.
 
  94     private Integer retry;
 
  97      * The entity's target information. May be {@code null}, depending on the requirement
 
  98      * of the operation to be invoked.
 
 100     private Target target;
 
 106     private String targetEntity;
 
 109      * Timeout, in seconds, or {@code null} if no timeout. Zero and negative values also
 
 113     private Integer timeoutSec = 300;
 
 116      * The function to invoke when the operation starts. This is optional.
 
 118      * Note: this may be invoked multiple times, but with different actor/operations. That
 
 119      * may happen if the current operation requires other operations to be performed first
 
 120      * (e.g., A&AI queries, guard checks).
 
 122     private Consumer<OperationOutcome> startCallback;
 
 125      * The function to invoke when the operation completes. This is optional.
 
 127      * Note: this may be invoked multiple times, but with different actor/operations. That
 
 128      * may happen if the current operation requires other operations to be performed first
 
 129      * (e.g., A&AI queries, guard checks).
 
 131     private Consumer<OperationOutcome> completeCallback;
 
 134      * Starts the specified operation.
 
 136      * @return a future that will return the result of the operation
 
 137      * @throws IllegalArgumentException if the parameters are invalid
 
 139     public CompletableFuture<OperationOutcome> start() {
 
 140         BeanValidationResult result = validate();
 
 141         if (!result.isValid()) {
 
 142             logger.warn("parameter error in operation {}.{} for {}:\n{}", getActor(), getOperation(), getRequestId(),
 
 144             throw new IllegalArgumentException("invalid parameters");
 
 149                     .getActor(getActor())
 
 150                     .getOperator(getOperation())
 
 151                     .startOperation(this);
 
 156      * Gets the requested ID of the associated event.
 
 158      * @return the event's request ID, or {@code null} if no request ID is available
 
 160     public UUID getRequestId() {
 
 161         return (context == null || context.getEvent() == null ? null : context.getEvent().getRequestId());
 
 165      * Makes an operation outcome, populating it from the parameters.
 
 167      * @return a new operation outcome
 
 169     public OperationOutcome makeOutcome() {
 
 170         OperationOutcome outcome = new OperationOutcome();
 
 171         outcome.setActor(getActor());
 
 172         outcome.setOperation(getOperation());
 
 173         outcome.setTarget(targetEntity);
 
 179      * Invokes the callback to indicate that the operation has started. Any exceptions
 
 180      * generated by the callback are logged, but not re-thrown.
 
 182      * @param operation the operation that is being started
 
 184     public void callbackStarted(OperationOutcome operation) {
 
 185         logger.info("started operation {}.{} for {}", operation.getActor(), operation.getOperation(), getRequestId());
 
 187         if (startCallback != null) {
 
 188             Util.runFunction(() -> startCallback.accept(operation), "{}.{}: start-callback threw an exception for {}",
 
 189                             operation.getActor(), operation.getOperation(), getRequestId());
 
 194      * Invokes the callback to indicate that the operation has completed. Any exceptions
 
 195      * generated by the callback are logged, but not re-thrown.
 
 197      * @param operation the operation that is being started
 
 199     public void callbackCompleted(OperationOutcome operation) {
 
 200         logger.info("completed operation {}.{} outcome={} for {}", operation.getActor(), operation.getOperation(),
 
 201                         operation.getResult(), getRequestId());
 
 203         if (completeCallback != null) {
 
 204             Util.runFunction(() -> completeCallback.accept(operation),
 
 205                             "{}.{}: complete-callback threw an exception for {}", operation.getActor(),
 
 206                             operation.getOperation(), getRequestId());
 
 211      * Validates the parameters.
 
 213      * @return the validation result
 
 215     public BeanValidationResult validate() {
 
 216         return new BeanValidator().validateTop(ControlLoopOperationParams.class.getSimpleName(), this);