Use lombok annotations for actors
[policy/models.git] / models-interactions / model-actors / actorServiceProvider / src / main / java / org / onap / policy / controlloop / actorserviceprovider / parameters / ControlLoopOperationParams.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP
4  * ================================================================================
5  * Copyright (C) 2020-2021 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
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=========================================================
19  */
20
21 package org.onap.policy.controlloop.actorserviceprovider.parameters;
22
23 import java.util.Map;
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;
32 import lombok.Getter;
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;
43
44 /**
45  * Parameters for control loop operations. The executor defaults to
46  * {@link ForkJoinPool#commonPool()}, but may be overridden.
47  */
48 @Getter
49 @Builder(toBuilder = true)
50 @AllArgsConstructor
51 @EqualsAndHashCode
52 public class ControlLoopOperationParams {
53     private static final Logger logger = LoggerFactory.getLogger(ControlLoopOperationParams.class);
54
55     /*
56      * Optional keys within the "targetEntityIds" map.
57      */
58     public static final String PARAMS_ENTITY_RESOURCEID = "resourceID";
59     public static final String PARAMS_ENTITY_MODEL_INVARIANT_ID = "modelInvariantId";
60     public static final String PARAMS_ENTITY_MODEL_VERSION_ID = "modelVersionId";
61     public static final String PARAMS_ENTITY_MODEL_NAME = "modelName";
62     public static final String PARAMS_ENTITY_MODEL_VERSION = "modelVersion";
63     public static final String PARAMS_ENTITY_MODEL_CUSTOMIZATION_ID = "modelCustomizationId";
64
65     /**
66      * Actor name.
67      */
68     @NotNull
69     private String actor;
70
71     /**
72      * Actor service in which to find the actor/operation.
73      */
74     @NotNull
75     private ActorService actorService;
76
77     /**
78      * Request ID with which all actor operations are associated. Used to track requests
79      * across various components/servers.
80      */
81     @NotNull
82     @Getter
83     private UUID requestId;
84
85     /**
86      * Executor to use to run the operation.
87      */
88     @NotNull
89     @Builder.Default
90     private Executor executor = ForkJoinPool.commonPool();
91
92     /**
93      * Operation name.
94      */
95     @NotNull
96     private String operation;
97
98     /**
99      * Payload data for the request.
100      */
101     private Map<String, Object> payload;
102
103     /**
104      * Number of retries allowed, or {@code null} if no retries.
105      */
106     private Integer retry;
107
108     /**
109      * The Target Type information, extracted from the Policy. May be {@code null}, depending
110      * on the requirement of the operation to be invoked.
111      */
112     private TargetType targetType;
113
114     /**
115      * Target entitiy ids, extracted from the Policy. May be (@code null}, depending on
116      * the requirement of the operation to be invoked.
117      */
118     private Map<String, String> targetEntityIds;
119
120     /**
121      * Timeout, in seconds, or {@code null} if no timeout. Zero and negative values also
122      * imply no timeout.
123      */
124     @Builder.Default
125     private Integer timeoutSec = 300;
126
127     /**
128      * The function to invoke when the operation starts. This is optional.
129      * <p/>
130      * Note: this may be invoked multiple times, but with different actor/operations. That
131      * may happen if the current operation requires other operations to be performed first
132      * (e.g., A&AI queries, guard checks).
133      */
134     private Consumer<OperationOutcome> startCallback;
135
136     /**
137      * The function to invoke when the operation completes. This is optional.
138      * <p/>
139      * Note: this may be invoked multiple times, but with different actor/operations. That
140      * may happen if the current operation requires other operations to be performed first
141      * (e.g., A&AI queries, guard checks).
142      */
143     private Consumer<OperationOutcome> completeCallback;
144
145     /**
146      * Starts the specified operation.
147      *
148      * @return a future that will return the result of the operation
149      * @throws IllegalArgumentException if the parameters are invalid
150      */
151     public CompletableFuture<OperationOutcome> start() {
152         return build().start();
153     }
154
155     /**
156      * Builds the specified operation.
157      *
158      * @return a new operation
159      * @throws IllegalArgumentException if the parameters are invalid
160      */
161     public Operation build() {
162         BeanValidationResult result = validate();
163         if (!result.isValid()) {
164             logger.warn("parameter error in operation {}.{} for {}:\n{}", getActor(), getOperation(), getRequestId(),
165                             result.getResult());
166             throw new IllegalArgumentException("invalid parameters");
167         }
168
169         // @formatter:off
170         return actorService
171                     .getActor(getActor())
172                     .getOperator(getOperation())
173                     .buildOperation(this);
174         // @formatter:on
175     }
176
177     /**
178      * Makes an operation outcome, populating it from the parameters.
179      *
180      * @return a new operation outcome
181      */
182     public OperationOutcome makeOutcome() {
183         var outcome = new OperationOutcome();
184         outcome.setActor(getActor());
185         outcome.setOperation(getOperation());
186
187         return outcome;
188     }
189
190     /**
191      * Invokes the callback to indicate that the operation has started. Any exceptions
192      * generated by the callback are logged, but not re-thrown.
193      *
194      * @param operation the operation that is being started
195      */
196     public void callbackStarted(OperationOutcome operation) {
197         logger.info("started operation {}.{} for {}", operation.getActor(), operation.getOperation(), getRequestId());
198
199         if (startCallback != null) {
200             Util.runFunction(() -> startCallback.accept(operation), "{}.{}: start-callback threw an exception for {}",
201                             operation.getActor(), operation.getOperation(), getRequestId());
202         }
203     }
204
205     /**
206      * Invokes the callback to indicate that the operation has completed. Any exceptions
207      * generated by the callback are logged, but not re-thrown.
208      *
209      * @param operation the operation that is being started
210      */
211     public void callbackCompleted(OperationOutcome operation) {
212         logger.info("completed operation {}.{} outcome={} for {}", operation.getActor(), operation.getOperation(),
213                         operation.getResult(), getRequestId());
214
215         if (completeCallback != null) {
216             Util.runFunction(() -> completeCallback.accept(operation),
217                             "{}.{}: complete-callback threw an exception for {}", operation.getActor(),
218                             operation.getOperation(), getRequestId());
219         }
220     }
221
222     /**
223      * Validates the parameters.
224      *
225      * @return the validation result
226      */
227     public BeanValidationResult validate() {
228         return new BeanValidator().validateTop(ControlLoopOperationParams.class.getSimpleName(), this);
229     }
230 }