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.Operation;
38 import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome;
39 import org.onap.policy.controlloop.actorserviceprovider.TargetType;
40 import org.onap.policy.controlloop.actorserviceprovider.Util;
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);
55 public static final String PARAMS_ENTITY_RESOURCEID = "resourceID";
56 public static final String PARAMS_ENTITY_MODEL_INVARIANT_ID = "modelInvariantId";
57 public static final String PARAMS_ENTITY_MODEL_VERSION_ID = "modelVersionId";
58 public static final String PARAMS_ENTITY_MODEL_NAME = "modelName";
59 public static final String PARAMS_ENTITY_MODEL_VERSION = "modelVersion";
60 public static final String PARAMS_ENTITY_MODEL_CUSTOMIZATION_ID = "modelCustomizationId";
69 * Actor service in which to find the actor/operation.
72 private ActorService actorService;
75 * Request ID with which all actor operations are associated. Used to track requests
76 * across various components/servers.
79 private UUID requestId;
82 * Executor to use to run the operation.
86 private Executor executor = ForkJoinPool.commonPool();
92 private String operation;
95 * Payload data for the request.
97 private Map<String, Object> payload;
100 * Number of retries allowed, or {@code null} if no retries.
102 private Integer retry;
105 * The Target Type information, extracted from the Policy. May be {@code null}, depending
106 * on the requirement of the operation to be invoked.
108 private TargetType targetType;
111 * Target entitiy ids, extracted from the Policy. May be (@code null}, depending on
112 * the requirement of the operation to be invoked.
114 private Map<String, String> targetEntityIds;
117 * Timeout, in seconds, or {@code null} if no timeout. Zero and negative values also
121 private Integer timeoutSec = 300;
124 * The function to invoke when the operation starts. This is optional.
126 * Note: this may be invoked multiple times, but with different actor/operations. That
127 * may happen if the current operation requires other operations to be performed first
128 * (e.g., A&AI queries, guard checks).
130 private Consumer<OperationOutcome> startCallback;
133 * The function to invoke when the operation completes. This is optional.
135 * Note: this may be invoked multiple times, but with different actor/operations. That
136 * may happen if the current operation requires other operations to be performed first
137 * (e.g., A&AI queries, guard checks).
139 private Consumer<OperationOutcome> completeCallback;
142 * Starts the specified operation.
144 * @return a future that will return the result of the operation
145 * @throws IllegalArgumentException if the parameters are invalid
147 public CompletableFuture<OperationOutcome> start() {
148 return build().start();
152 * Builds the specified operation.
154 * @return a new operation
155 * @throws IllegalArgumentException if the parameters are invalid
157 public Operation build() {
158 BeanValidationResult result = validate();
159 if (!result.isValid()) {
160 logger.warn("parameter error in operation {}.{} for {}:\n{}", getActor(), getOperation(), getRequestId(),
162 throw new IllegalArgumentException("invalid parameters");
167 .getActor(getActor())
168 .getOperator(getOperation())
169 .buildOperation(this);
174 * Gets the requested ID of the associated event.
176 * @return the event's request ID, or {@code null} if no request ID is available
178 public UUID getRequestId() {
183 * Makes an operation outcome, populating it from the parameters.
185 * @return a new operation outcome
187 public OperationOutcome makeOutcome() {
188 return makeOutcome(null);
192 * Makes an operation outcome, populating it from the parameters.
194 * @param targetEntity the target entity
196 * @return a new operation outcome
198 public OperationOutcome makeOutcome(String targetEntity) {
199 OperationOutcome outcome = new OperationOutcome();
200 outcome.setActor(getActor());
201 outcome.setOperation(getOperation());
202 outcome.setTarget(targetEntity);
208 * Invokes the callback to indicate that the operation has started. Any exceptions
209 * generated by the callback are logged, but not re-thrown.
211 * @param operation the operation that is being started
213 public void callbackStarted(OperationOutcome operation) {
214 logger.info("started operation {}.{} for {}", operation.getActor(), operation.getOperation(), getRequestId());
216 if (startCallback != null) {
217 Util.runFunction(() -> startCallback.accept(operation), "{}.{}: start-callback threw an exception for {}",
218 operation.getActor(), operation.getOperation(), getRequestId());
223 * Invokes the callback to indicate that the operation has completed. Any exceptions
224 * generated by the callback are logged, but not re-thrown.
226 * @param operation the operation that is being started
228 public void callbackCompleted(OperationOutcome operation) {
229 logger.info("completed operation {}.{} outcome={} for {}", operation.getActor(), operation.getOperation(),
230 operation.getResult(), getRequestId());
232 if (completeCallback != null) {
233 Util.runFunction(() -> completeCallback.accept(operation),
234 "{}.{}: complete-callback threw an exception for {}", operation.getActor(),
235 operation.getOperation(), getRequestId());
240 * Validates the parameters.
242 * @return the validation result
244 public BeanValidationResult validate() {
245 return new BeanValidator().validateTop(ControlLoopOperationParams.class.getSimpleName(), this);