Set sub request ID before start callback
[policy/models.git] / models-interactions / model-actors / actor.guard / src / main / java / org / onap / policy / controlloop / actor / guard / GuardOperation.java
index a5459f6..3a7821e 100644 (file)
 package org.onap.policy.controlloop.actor.guard;
 
 import java.util.Map;
-import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.Executor;
 import javax.ws.rs.client.Entity;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
 import org.onap.policy.common.endpoints.utils.NetLoggerUtil.EventType;
+import org.onap.policy.controlloop.actorserviceprovider.CallbackManager;
 import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome;
-import org.onap.policy.controlloop.actorserviceprovider.Util;
 import org.onap.policy.controlloop.actorserviceprovider.impl.HttpOperation;
 import org.onap.policy.controlloop.actorserviceprovider.impl.OperationPartial;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams;
@@ -37,6 +37,8 @@ import org.onap.policy.controlloop.actorserviceprovider.parameters.HttpConfig;
 import org.onap.policy.controlloop.policy.PolicyResult;
 import org.onap.policy.models.decisions.concepts.DecisionRequest;
 import org.onap.policy.models.decisions.concepts.DecisionResponse;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Guard Operation. The outcome message is set to the guard response. If the guard is
@@ -54,6 +56,7 @@ import org.onap.policy.models.decisions.concepts.DecisionResponse;
  * </dl>
  */
 public class GuardOperation extends HttpOperation<DecisionResponse> {
+    private static final Logger logger = LoggerFactory.getLogger(GuardOperation.class);
 
     // operation name
     public static final String NAME = OperationPartial.GUARD_OPERATION_NAME;
@@ -83,38 +86,54 @@ public class GuardOperation extends HttpOperation<DecisionResponse> {
     }
 
     @Override
-    protected CompletableFuture<OperationOutcome> startOperationAsync(int attempt, OperationOutcome outcome) {
+    public CompletableFuture<OperationOutcome> start() {
+        if (!config.isDisabled()) {
+            // enabled - do full guard operation
+            return super.start();
+        }
 
-        DecisionRequest request = Util.translate(getName(), makeRequest(), DecisionRequest.class);
+        // guard is disabled, thus it is always treated as a success
+        logger.info("{}: guard disabled, always succeeds for {}", getFullName(), params.getRequestId());
 
+        final Executor executor = params.getExecutor();
+        final CallbackManager callbacks = new CallbackManager();
+
+        return CompletableFuture.completedFuture(params.makeOutcome())
+                        .whenCompleteAsync(callbackStarted(callbacks), executor)
+                        .whenCompleteAsync(callbackCompleted(callbacks), executor);
+    }
+
+    @Override
+    protected CompletableFuture<OperationOutcome> startOperationAsync(int attempt, OperationOutcome outcome) {
+        DecisionRequest request = makeRequest();
         Entity<DecisionRequest> entity = Entity.entity(request, MediaType.APPLICATION_JSON);
 
         Map<String, Object> headers = makeHeaders();
 
         headers.put("Accept", MediaType.APPLICATION_JSON);
-        String url = makeUrl();
+        String url = getUrl();
 
         logMessage(EventType.OUT, CommInfrastructure.REST, url, request);
 
         // @formatter:off
         return handleResponse(outcome, url,
-            callback -> getClient().post(callback, makePath(), entity, headers));
+            callback -> getClient().post(callback, getPath(), entity, headers));
         // @formatter:on
     }
 
     /**
      * Makes a request from the payload.
      *
-     * @return a new request map
+     * @return a new request
      */
-    protected Map<String, Object> makeRequest() {
+    protected DecisionRequest makeRequest() {
         if (params.getPayload() == null) {
             throw new IllegalArgumentException("missing payload");
         }
 
-        Map<String, Object> req = config.makeRequest();
-        req.putAll(params.getPayload());
-        req.computeIfAbsent("requestId", key -> UUID.randomUUID().toString());
+        DecisionRequest req = config.makeRequest();
+        req.setRequestId(getSubRequestId());
+        req.setResource(Map.of("guard", params.getPayload()));
 
         return req;
     }