Set sub request ID before start callback 79/104879/3
authorJim Hahn <jrh3@att.com>
Wed, 1 Apr 2020 15:03:31 +0000 (11:03 -0400)
committerJim Hahn <jrh3@att.com>
Wed, 1 Apr 2020 16:04:48 +0000 (12:04 -0400)
Modified new actor code to generate the sub request ID
before invoking the start callback.

Issue-ID: POLICY-2461
Change-Id: I4adabd6efda2c30c0e2da31f95f01dd5fe546c0a
Signed-off-by: Jim Hahn <jrh3@att.com>
29 files changed:
models-interactions/model-actors/actor.aai/src/main/java/org/onap/policy/controlloop/actor/aai/AaiCustomQueryOperation.java
models-interactions/model-actors/actor.aai/src/main/java/org/onap/policy/controlloop/actor/aai/AaiGetOperation.java
models-interactions/model-actors/actor.aai/src/test/java/org/onap/policy/controlloop/actor/aai/AaiCustomQueryOperationTest.java
models-interactions/model-actors/actor.aai/src/test/java/org/onap/policy/controlloop/actor/aai/AaiGetOperationTest.java
models-interactions/model-actors/actor.appc/src/main/java/org/onap/policy/controlloop/actor/appc/AppcOperation.java
models-interactions/model-actors/actor.appc/src/main/java/org/onap/policy/controlloop/actor/appc/ModifyConfigOperation.java
models-interactions/model-actors/actor.appc/src/test/java/org/onap/policy/controlloop/actor/appc/AppcOperationTest.java
models-interactions/model-actors/actor.appc/src/test/java/org/onap/policy/controlloop/actor/appc/ModifyConfigOperationTest.java
models-interactions/model-actors/actor.appclcm/src/main/java/org/onap/policy/controlloop/actor/appclcm/AppcLcmOperation.java
models-interactions/model-actors/actor.appclcm/src/test/java/org/onap/policy/controlloop/actor/appclcm/AppcLcmOperationTest.java
models-interactions/model-actors/actor.cds/src/main/java/org/onap/policy/controlloop/actor/cds/GrpcOperation.java
models-interactions/model-actors/actor.cds/src/test/java/org/onap/policy/controlloop/actor/cds/GrpcOperationTest.java
models-interactions/model-actors/actor.guard/src/main/java/org/onap/policy/controlloop/actor/guard/GuardOperation.java
models-interactions/model-actors/actor.guard/src/test/java/org/onap/policy/controlloop/actor/guard/GuardOperationTest.java
models-interactions/model-actors/actor.sdnc/src/main/java/org/onap/policy/controlloop/actor/sdnc/BandwidthOnDemandOperation.java
models-interactions/model-actors/actor.sdnc/src/main/java/org/onap/policy/controlloop/actor/sdnc/RerouteOperation.java
models-interactions/model-actors/actor.sdnc/src/main/java/org/onap/policy/controlloop/actor/sdnc/SdncOperation.java
models-interactions/model-actors/actor.sdnc/src/test/java/org/onap/policy/controlloop/actor/sdnc/BandwidthOnDemandOperationTest.java
models-interactions/model-actors/actor.sdnc/src/test/java/org/onap/policy/controlloop/actor/sdnc/RerouteOperationTest.java
models-interactions/model-actors/actor.sdnr/src/main/java/org/onap/policy/controlloop/actor/sdnr/ModifyConfigOperation.java
models-interactions/model-actors/actor.sdnr/src/main/java/org/onap/policy/controlloop/actor/sdnr/SdnrOperation.java
models-interactions/model-actors/actor.sdnr/src/test/java/org/onap/policy/controlloop/actor/sdnr/ModifyConfigOperationTest.java
models-interactions/model-actors/actor.sdnr/src/test/java/org/onap/policy/controlloop/actor/sdnr/SdnrOperationTest.java
models-interactions/model-actors/actor.so/src/main/java/org/onap/policy/controlloop/actor/so/SoOperation.java
models-interactions/model-actors/actor.so/src/test/java/org/onap/policy/controlloop/actor/so/SoOperationTest.java
models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/impl/BidirectionalTopicOperation.java
models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/impl/OperationPartial.java
models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/impl/BidirectionalTopicOperationTest.java
models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/impl/OperationPartialTest.java

index 9f8d30a..b009288 100644 (file)
@@ -90,6 +90,11 @@ public class AaiCustomQueryOperation extends HttpOperation<String> {
         return params.getContext().obtain(AaiGetOperation.getTenantKey(vserver), tenantParams);
     }
 
+    @Override
+    public void generateSubRequestId(int attempt) {
+        setSubRequestId(String.valueOf(attempt));
+    }
+
     @Override
     protected CompletableFuture<OperationOutcome> startOperationAsync(int attempt, OperationOutcome outcome) {
         outcome.setSubRequestId(String.valueOf(attempt));
index 9ff56d6..a202008 100644 (file)
@@ -90,9 +90,12 @@ public class AaiGetOperation extends HttpOperation<StandardCoderObject> {
     }
 
     @Override
-    protected CompletableFuture<OperationOutcome> startOperationAsync(int attempt, OperationOutcome outcome) {
-        outcome.setSubRequestId(String.valueOf(attempt));
+    public void generateSubRequestId(int attempt) {
+        setSubRequestId(String.valueOf(attempt));
+    }
 
+    @Override
+    protected CompletableFuture<OperationOutcome> startOperationAsync(int attempt, OperationOutcome outcome) {
         Map<String, Object> headers = makeHeaders();
 
         headers.put("Accept", MediaType.APPLICATION_JSON);
index cf19ef6..aa8165e 100644 (file)
@@ -141,6 +141,12 @@ public class AaiCustomQueryOperationTest extends BasicAaiOperation<Map<String, S
                         .withMessage("missing " + AaiCustomQueryOperation.VSERVER_VSERVER_NAME + " in enrichment data");
     }
 
+    @Test
+    public void testGenerateSubRequestId() {
+        oper.generateSubRequestId(3);
+        assertEquals("3", oper.getSubRequestId());
+    }
+
     @Test
     @SuppressWarnings("unchecked")
     public void testStartOperationAsync_testStartPreprocessorAsync_testMakeRequest_testPostProcess() throws Exception {
index 9a28819..72b27ea 100644 (file)
@@ -114,6 +114,12 @@ public class AaiGetOperationTest extends BasicAaiOperation<Void> {
         assertEquals(10, oper.getRetry(10));
     }
 
+    @Test
+    public void testGenerateSubRequestId() {
+        oper.generateSubRequestId(3);
+        assertEquals("3", oper.getSubRequestId());
+    }
+
     @Test
     @SuppressWarnings("unchecked")
     public void testStartOperationAsync_testStartQueryAsync_testPostProcessResponse() throws Exception {
@@ -124,6 +130,9 @@ public class AaiGetOperationTest extends BasicAaiOperation<Void> {
 
         when(webAsync.get(any(InvocationCallback.class))).thenAnswer(provideResponse(rawResponse));
 
+        oper.generateSubRequestId(1);
+        outcome.setSubRequestId(oper.getSubRequestId());
+
         CompletableFuture<OperationOutcome> future2 = oper.startOperationAsync(1, outcome);
         assertFalse(future2.isDone());
 
index 3ed2395..75a4c9f 100644 (file)
@@ -23,9 +23,7 @@ package org.onap.policy.controlloop.actor.appc;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
-import org.apache.commons.lang3.tuple.Pair;
 import org.onap.policy.appc.CommonHeader;
 import org.onap.policy.appc.Request;
 import org.onap.policy.appc.Response;
@@ -86,14 +84,11 @@ public abstract class AppcOperation extends BidirectionalTopicOperation<Request,
      * @param targetVnf target VNF
      * @return a new request
      */
-    protected Pair<String, Request> makeRequest(int attempt, String targetVnf) {
+    protected Request makeRequest(int attempt, String targetVnf) {
         Request request = new Request();
         request.setCommonHeader(new CommonHeader());
         request.getCommonHeader().setRequestId(params.getRequestId());
-
-        // TODO ok to use UUID, or does it have to be the "attempt"?
-        final String subreq = UUID.randomUUID().toString();
-        request.getCommonHeader().setSubRequestId(subreq);
+        request.getCommonHeader().setSubRequestId(getSubRequestId());
 
         request.setAction(getName());
 
@@ -107,7 +102,7 @@ public abstract class AppcOperation extends BidirectionalTopicOperation<Request,
         // add/replace specific values
         request.getPayload().put(VNF_ID_KEY, targetVnf);
 
-        return Pair.of(subreq, request);
+        return request;
     }
 
     /**
@@ -139,7 +134,7 @@ public abstract class AppcOperation extends BidirectionalTopicOperation<Request,
      */
     @Override
     protected List<String> getExpectedKeyValues(int attempt, Request request) {
-        return List.of(request.getCommonHeader().getSubRequestId());
+        return List.of(getSubRequestId());
     }
 
     @Override
index e4fd51c..a318444 100644 (file)
@@ -21,7 +21,6 @@
 package org.onap.policy.controlloop.actor.appc;
 
 import java.util.concurrent.CompletableFuture;
-import org.apache.commons.lang3.tuple.Pair;
 import org.onap.aai.domain.yang.GenericVnf;
 import org.onap.policy.aai.AaiConstants;
 import org.onap.policy.aai.AaiCqResponse;
@@ -61,7 +60,7 @@ public class ModifyConfigOperation extends AppcOperation {
     }
 
     @Override
-    protected Pair<String, Request> makeRequest(int attempt) {
+    protected Request makeRequest(int attempt) {
         AaiCqResponse cq = params.getContext().getProperty(AaiCqResponse.CONTEXT_KEY);
 
         GenericVnf genvnf = cq.getGenericVnfByModelInvariantId(params.getTarget().getResourceID());
index 7f7ac7a..4c6477d 100644 (file)
@@ -22,14 +22,12 @@ package org.onap.policy.controlloop.actor.appc;
 
 import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertSame;
 
 import java.util.Arrays;
 import java.util.Map;
 import java.util.TreeMap;
-import org.apache.commons.lang3.tuple.Pair;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
@@ -40,6 +38,8 @@ import org.onap.policy.appc.Request;
 import org.onap.policy.appc.ResponseCode;
 import org.onap.policy.appc.ResponseStatus;
 import org.onap.policy.controlloop.actorserviceprovider.impl.BidirectionalTopicOperation.Status;
+import org.onap.policy.controlloop.actorserviceprovider.parameters.BidirectionalTopicConfig;
+import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams;
 import org.onap.policy.controlloop.policy.PolicyResult;
 
 public class AppcOperationTest extends BasicAppcOperation {
@@ -64,12 +64,7 @@ public class AppcOperationTest extends BasicAppcOperation {
     public void setUp() throws Exception {
         super.setUp();
 
-        oper = new AppcOperation(params, config) {
-            @Override
-            protected Pair<String, Request> makeRequest(int attempt) {
-                return oper.makeRequest(attempt, MY_VNF);
-            }
-        };
+        oper = new MyOper(params, config);
     }
 
     @After
@@ -91,11 +86,11 @@ public class AppcOperationTest extends BasicAppcOperation {
 
     @Test
     public void testMakeRequest() {
-        Pair<String, Request> result = oper.makeRequest(2, MY_VNF);
-        String subreq = result.getLeft();
+        oper.generateSubRequestId(2);
+        String subreq = oper.getSubRequestId();
         assertNotNull(subreq);
 
-        Request request = result.getRight();
+        Request request = oper.makeRequest(2, MY_VNF);
         assertEquals(DEFAULT_OPERATION, request.getAction());
 
         assertNotNull(request.getPayload());
@@ -106,27 +101,18 @@ public class AppcOperationTest extends BasicAppcOperation {
 
         assertEquals(subreq, header.getSubRequestId());
 
-        // a subsequent request should have a different sub-request id
-        result = oper.makeRequest(2, MY_VNF);
-        assertNotEquals(subreq, result.getLeft());
-
-        assertNotNull(result.getLeft());
-        assertEquals(result.getLeft(), result.getRight().getCommonHeader().getSubRequestId());
+        request = oper.makeRequest(2, MY_VNF);
+        assertEquals(subreq, request.getCommonHeader().getSubRequestId());
 
         // repeat using a null payload
         params = params.toBuilder().payload(null).build();
-        oper = new AppcOperation(params, config) {
-            @Override
-            protected Pair<String, Request> makeRequest(int attempt) {
-                return oper.makeRequest(attempt, MY_VNF);
-            }
-        };
-        assertEquals(Map.of(AppcOperation.VNF_ID_KEY, MY_VNF), oper.makeRequest(2, MY_VNF).getRight().getPayload());
+        oper = new MyOper(params, config);
+        assertEquals(Map.of(AppcOperation.VNF_ID_KEY, MY_VNF), oper.makeRequest(2, MY_VNF).getPayload());
     }
 
     @Test
     public void testConvertPayload() {
-        Request request = oper.makeRequest(2, MY_VNF).getRight();
+        Request request = oper.makeRequest(2, MY_VNF);
 
         // @formatter:off
         assertEquals(
@@ -145,13 +131,8 @@ public class AppcOperationTest extends BasicAppcOperation {
 
         params = params.toBuilder().payload(payload).build();
 
-        oper = new AppcOperation(params, config) {
-            @Override
-            protected Pair<String, Request> makeRequest(int attempt) {
-                return oper.makeRequest(attempt, MY_VNF);
-            }
-        };
-        request = oper.makeRequest(2, MY_VNF).getRight();
+        oper = new MyOper(params, config);
+        request = oper.makeRequest(2, MY_VNF);
 
         // @formatter:off
         assertEquals(
@@ -171,13 +152,8 @@ public class AppcOperationTest extends BasicAppcOperation {
         payload.put(KEY3, "def");
         params = params.toBuilder().payload(payload).build();
 
-        oper = new AppcOperation(params, config) {
-            @Override
-            protected Pair<String, Request> makeRequest(int attempt) {
-                return oper.makeRequest(attempt, MY_VNF);
-            }
-        };
-        request = oper.makeRequest(2, MY_VNF).getRight();
+        oper = new MyOper(params, config);
+        request = oper.makeRequest(2, MY_VNF);
 
         payload.put(AppcOperation.VNF_ID_KEY, MY_VNF);
         payload.put(KEY1, "abc");
@@ -189,7 +165,8 @@ public class AppcOperationTest extends BasicAppcOperation {
 
     @Test
     public void testGetExpectedKeyValues() {
-        Request request = oper.makeRequest(2, MY_VNF).getRight();
+        oper.generateSubRequestId(2);
+        Request request = oper.makeRequest(2, MY_VNF);
         assertEquals(Arrays.asList(request.getCommonHeader().getSubRequestId()),
                         oper.getExpectedKeyValues(50, request));
     }
@@ -250,4 +227,16 @@ public class AppcOperationTest extends BasicAppcOperation {
             assertEquals(MY_DESCRIPTION, outcome.getMessage());
         }
     }
+
+    private static class MyOper extends AppcOperation {
+
+        public MyOper(ControlLoopOperationParams params, BidirectionalTopicConfig config) {
+            super(params, config);
+        }
+
+        @Override
+        protected Request makeRequest(int attempt) {
+            return makeRequest(attempt, MY_VNF);
+        }
+    }
 }
index 743896c..4f4f506 100644 (file)
@@ -34,7 +34,6 @@ import static org.mockito.Mockito.when;
 import java.util.Arrays;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.atomic.AtomicBoolean;
-import org.apache.commons.lang3.tuple.Pair;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
@@ -161,10 +160,8 @@ public class ModifyConfigOperationTest extends BasicAppcOperation {
         genvnf.setModelInvariantId(RESOURCE_ID);
         cq.setInventoryResponseItems(Arrays.asList(genvnf));
 
-        Pair<String, Request> result = oper.makeRequest(2);
-        assertNotNull(result.getLeft());
-
-        Request request = result.getRight();
+        oper.generateSubRequestId(2);
+        Request request = oper.makeRequest(2);
         assertNotNull(request);
         assertEquals(MY_VNF, request.getPayload().get(ModifyConfigOperation.VNF_ID_KEY));
 
index 87ff357..e34d3c5 100644 (file)
@@ -22,10 +22,8 @@ package org.onap.policy.controlloop.actor.appclcm;
 
 import java.util.List;
 import java.util.Map;
-import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.tuple.Pair;
 import org.onap.policy.appclcm.AppcLcmBody;
 import org.onap.policy.appclcm.AppcLcmCommonHeader;
 import org.onap.policy.appclcm.AppcLcmDmaapWrapper;
@@ -81,9 +79,9 @@ public class AppcLcmOperation extends BidirectionalTopicOperation<AppcLcmDmaapWr
     }
 
     @Override
-    protected Pair<String, AppcLcmDmaapWrapper> makeRequest(int attempt) {
+    protected AppcLcmDmaapWrapper makeRequest(int attempt) {
         VirtualControlLoopEvent onset = params.getContext().getEvent();
-        String subRequestId = UUID.randomUUID().toString();
+        String subRequestId = getSubRequestId();
 
         AppcLcmCommonHeader header = new AppcLcmCommonHeader();
         header.setOriginatorId(onset.getRequestId().toString());
@@ -126,7 +124,7 @@ public class AppcLcmOperation extends BidirectionalTopicOperation<AppcLcmDmaapWr
 
         body.setInput(inputRequest);
         dmaapRequest.setBody(body);
-        return Pair.of(subRequestId, dmaapRequest);
+        return dmaapRequest;
     }
 
     /**
@@ -150,7 +148,7 @@ public class AppcLcmOperation extends BidirectionalTopicOperation<AppcLcmDmaapWr
      */
     @Override
     protected List<String> getExpectedKeyValues(int attempt, AppcLcmDmaapWrapper request) {
-        return List.of(request.getBody().getInput().getCommonHeader().getSubRequestId());
+        return List.of(getSubRequestId());
     }
 
     @Override
index 9744d82..b2a44af 100644 (file)
@@ -23,7 +23,6 @@ package org.onap.policy.controlloop.actor.appclcm;
 import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
@@ -36,7 +35,6 @@ import java.util.Set;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.stream.Collectors;
-import org.apache.commons.lang3.tuple.Pair;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
@@ -170,11 +168,11 @@ public class AppcLcmOperationTest extends BasicBidirectionalTopicOperation {
 
     @Test
     public void testMakeRequest() {
-        Pair<String, AppcLcmDmaapWrapper> result = oper.makeRequest(2);
-        String subreq = result.getLeft();
+        oper.generateSubRequestId(2);
+        String subreq = oper.getSubRequestId();
         assertNotNull(subreq);
 
-        AppcLcmDmaapWrapper request = result.getRight();
+        AppcLcmDmaapWrapper request = oper.makeRequest(2);
         assertEquals("DefaultOperation", request.getBody().getInput().getAction());
 
         AppcLcmCommonHeader header = request.getBody().getInput().getCommonHeader();
@@ -185,11 +183,8 @@ public class AppcLcmOperationTest extends BasicBidirectionalTopicOperation {
 
         assertEquals("{vnf-id=my-target}", request.getBody().getInput().getActionIdentifiers().toString());
 
-        // a subsequent request should have a different sub-request id
-        result = oper.makeRequest(2);
-        assertNotEquals(subreq, result.getLeft());
-        assertNotNull(result.getLeft());
-        assertEquals(result.getLeft(), result.getRight().getBody().getInput().getCommonHeader().getSubRequestId());
+        request = oper.makeRequest(2);
+        assertEquals(subreq, request.getBody().getInput().getCommonHeader().getSubRequestId());
     }
 
     @Test
@@ -198,7 +193,8 @@ public class AppcLcmOperationTest extends BasicBidirectionalTopicOperation {
         params = params.toBuilder().operation(AppcLcmConstants.OPERATION_CONFIG_MODIFY).build();
         oper = new AppcLcmOperation(params, config);
 
-        AppcLcmDmaapWrapper req = oper.makeRequest(2).getRight();
+        oper.generateSubRequestId(2);
+        AppcLcmDmaapWrapper req = oper.makeRequest(2);
         assertEquals("{\"key-A\":\"value-A\"}", req.getBody().getInput().getPayload());
 
         // coder exception
@@ -214,13 +210,16 @@ public class AppcLcmOperationTest extends BasicBidirectionalTopicOperation {
             }
         };
 
+        oper.generateSubRequestId(2);
+
         assertThatIllegalArgumentException().isThrownBy(() -> oper.makeRequest(2))
                         .withMessage("Cannot convert payload");
     }
 
     @Test
     public void testGetExpectedKeyValues() {
-        AppcLcmDmaapWrapper request = oper.makeRequest(2).getRight();
+        oper.generateSubRequestId(2);
+        AppcLcmDmaapWrapper request = oper.makeRequest(2);
         assertEquals(Arrays.asList(request.getBody().getInput().getCommonHeader().getSubRequestId()),
                         oper.getExpectedKeyValues(50, request));
     }
index efe358b..e57bc04 100644 (file)
@@ -92,6 +92,11 @@ public class GrpcOperation extends OperationPartial {
         return allOf(() -> params.getContext().obtain(AaiCqResponse.CONTEXT_KEY, cqParams), this::startGuardAsync);
     }
 
+    @Override
+    public void generateSubRequestId(int attempt) {
+        setSubRequestId("0");
+    }
+
     /**
      * {@inheritDoc}.
      */
@@ -167,7 +172,7 @@ public class GrpcOperation extends OperationPartial {
         // Build CDS gRPC request common-header
         CommonHeader commonHeader = CommonHeader.newBuilder().setOriginatorId(CdsActorConstants.ORIGINATOR_ID)
                         .setRequestId(params.getContext().getEvent().getRequestId().toString())
-                        .setSubRequestId(Integer.toString(0)).build();
+                        .setSubRequestId(getSubRequestId()).build();
 
         // Build CDS gRPC request action-identifier
         ActionIdentifiers actionIdentifiers =
index 81636b1..7baf8aa 100644 (file)
@@ -173,6 +173,7 @@ public class GrpcOperationTest {
         assertEquals(1000, operation.getTimeoutMs(null));
         assertEquals(1000, operation.getTimeoutMs(0));
         assertEquals(2000, operation.getTimeoutMs(2));
+        operation.generateSubRequestId(1);
         CompletableFuture<OperationOutcome> future3 = operation.startOperationAsync(1, params.makeOutcome());
         assertNotNull(future3);
     }
index edd2e23..3a7821e 100644 (file)
@@ -21,7 +21,6 @@
 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;
@@ -106,8 +105,6 @@ public class GuardOperation extends HttpOperation<DecisionResponse> {
 
     @Override
     protected CompletableFuture<OperationOutcome> startOperationAsync(int attempt, OperationOutcome outcome) {
-        outcome.setSubRequestId(String.valueOf(attempt));
-
         DecisionRequest request = makeRequest();
         Entity<DecisionRequest> entity = Entity.entity(request, MediaType.APPLICATION_JSON);
 
@@ -135,7 +132,7 @@ public class GuardOperation extends HttpOperation<DecisionResponse> {
         }
 
         DecisionRequest req = config.makeRequest();
-        req.setRequestId(UUID.randomUUID().toString());
+        req.setRequestId(getSubRequestId());
         req.setResource(Map.of("guard", params.getPayload()));
 
         return req;
index 3d15383..58d54a5 100644 (file)
@@ -161,7 +161,8 @@ public class GuardOperationTest extends BasicHttpOperation<DecisionRequest> {
 
         assertEquals(PolicyResult.SUCCESS, future2.get().getResult());
 
-        assertEquals("1", future2.get().getSubRequestId());
+        assertNotNull(oper.getSubRequestId());
+        assertEquals(oper.getSubRequestId(), future2.get().getSubRequestId());
     }
 
     /**
@@ -189,6 +190,8 @@ public class GuardOperationTest extends BasicHttpOperation<DecisionRequest> {
 
     @Test
     public void testMakeRequest() throws CoderException {
+        oper.generateSubRequestId(2);
+
         verifyPayload("makeReqStd.json", makePayload());
         verifyPayload("makeReqDefault.json", new TreeMap<>());
 
index daced6e..0c44169 100644 (file)
@@ -20,7 +20,6 @@
 
 package org.onap.policy.controlloop.actor.sdnc;
 
-import java.util.UUID;
 import org.apache.commons.lang3.StringUtils;
 import org.onap.policy.controlloop.actorserviceprovider.controlloop.ControlLoopEventContext;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams;
@@ -85,7 +84,7 @@ public class BandwidthOnDemandOperation extends SdncOperation {
 
         SdncHealRequestHeaderInfo headerInfo = new SdncHealRequestHeaderInfo();
         headerInfo.setSvcAction("update");
-        headerInfo.setSvcRequestId(UUID.randomUUID().toString());
+        headerInfo.setSvcRequestId(getSubRequestId());
 
         SdncRequest request = new SdncRequest();
         request.setNsInstanceId(serviceInstance);
index 2e0d7b8..d8e1b05 100644 (file)
@@ -20,7 +20,6 @@
 
 package org.onap.policy.controlloop.actor.sdnc;
 
-import java.util.UUID;
 import org.apache.commons.lang3.StringUtils;
 import org.onap.policy.controlloop.actorserviceprovider.controlloop.ControlLoopEventContext;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams;
@@ -72,7 +71,7 @@ public class RerouteOperation extends SdncOperation {
 
         SdncHealRequestHeaderInfo headerInfo = new SdncHealRequestHeaderInfo();
         headerInfo.setSvcAction("reoptimize");
-        headerInfo.setSvcRequestId(UUID.randomUUID().toString());
+        headerInfo.setSvcRequestId(getSubRequestId());
 
         SdncRequest request = new SdncRequest();
         request.setNsInstanceId(serviceInstance);
index 0c05582..ca6d07b 100644 (file)
@@ -61,8 +61,6 @@ public abstract class SdncOperation extends HttpOperation<SdncResponse> {
     protected CompletableFuture<OperationOutcome> startOperationAsync(int attempt, OperationOutcome outcome) {
 
         SdncRequest request = makeRequest(attempt);
-        outcome.setSubRequestId(request.getHealRequest().getRequestHeaderInfo().getSvcRequestId());
-
         Entity<SdncRequest> entity = Entity.entity(request, MediaType.APPLICATION_JSON);
 
         Map<String, Object> headers = makeHeaders();
index 8e26c68..2b85670 100644 (file)
@@ -21,7 +21,6 @@
 package org.onap.policy.controlloop.actor.sdnc;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
 
 import java.util.Map;
 import org.junit.AfterClass;
@@ -85,11 +84,12 @@ public class BandwidthOnDemandOperationTest extends BasicSdncOperation {
 
     @Test
     public void testMakeRequest() throws Exception {
+        oper.generateSubRequestId(1);
         SdncRequest request = oper.makeRequest(1);
         assertEquals("my-service", request.getNsInstanceId());
         assertEquals(REQ_ID, request.getRequestId());
         assertEquals("/my-path/", request.getUrl());
-        assertNotNull(request.getHealRequest().getRequestHeaderInfo().getSvcRequestId());
+        assertEquals(oper.getSubRequestId(), request.getHealRequest().getRequestHeaderInfo().getSvcRequestId());
 
         verifyRequest("bod.json", request, IGNORE_FIELDS);
 
index 97cdcb0..678648d 100644 (file)
@@ -21,7 +21,6 @@
 package org.onap.policy.controlloop.actor.sdnc;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
 
 import java.util.Map;
 import org.junit.AfterClass;
@@ -85,11 +84,12 @@ public class RerouteOperationTest extends BasicSdncOperation {
 
     @Test
     public void testMakeRequest() throws Exception {
+        oper.generateSubRequestId(1);
         SdncRequest request = oper.makeRequest(1);
         assertEquals("my-service", request.getNsInstanceId());
         assertEquals(REQ_ID, request.getRequestId());
         assertEquals("/my-path/", request.getUrl());
-        assertNotNull(request.getHealRequest().getRequestHeaderInfo().getSvcRequestId());
+        assertEquals(oper.getSubRequestId(), request.getHealRequest().getRequestHeaderInfo().getSvcRequestId());
 
         verifyRequest("reroute.json", request, IGNORE_FIELDS);
 
index a5193ec..2b7f644 100644 (file)
@@ -20,7 +20,6 @@
 
 package org.onap.policy.controlloop.actor.sdnr;
 
-import org.apache.commons.lang3.tuple.Pair;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.BidirectionalTopicConfig;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams;
 import org.onap.policy.sdnr.PciMessage;
@@ -39,14 +38,13 @@ public class ModifyConfigOperation extends SdnrOperation {
     }
 
     @Override
-    protected Pair<String, PciMessage> makeRequest(int attempt) {
-        final Pair<String, PciMessage> req = super.makeRequest(attempt);
-        final PciMessage request = req.getRight();
+    protected PciMessage makeRequest(int attempt) {
+        final PciMessage request = super.makeRequest(attempt);
         //
         // Set the recipe and action information
         //
         request.setRpcName(NAME.toLowerCase());
         request.getBody().getInput().setAction(NAME);
-        return req;
+        return request;
     }
 }
index de498e6..b5066c7 100644 (file)
@@ -21,9 +21,7 @@
 package org.onap.policy.controlloop.actor.sdnr;
 
 import java.util.List;
-import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
-import org.apache.commons.lang3.tuple.Pair;
 import org.onap.policy.controlloop.VirtualControlLoopEvent;
 import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome;
 import org.onap.policy.controlloop.actorserviceprovider.impl.BidirectionalTopicOperation;
@@ -62,7 +60,7 @@ public abstract class SdnrOperation extends BidirectionalTopicOperation<PciMessa
      */
     @Override
     protected List<String> getExpectedKeyValues(int attempt, PciMessage request) {
-        return List.of(request.getBody().getInput().getCommonHeader().getSubRequestId());
+        return List.of(getSubRequestId());
     }
 
     @Override
@@ -128,9 +126,9 @@ public abstract class SdnrOperation extends BidirectionalTopicOperation<PciMessa
     }
 
     @Override
-    protected Pair<String, PciMessage> makeRequest(int attempt) {
+    protected PciMessage makeRequest(int attempt) {
         VirtualControlLoopEvent onset = params.getContext().getEvent();
-        String subRequestId = UUID.randomUUID().toString();
+        String subRequestId = getSubRequestId();
 
         /* Construct an SDNR request using pci Model */
 
@@ -159,6 +157,6 @@ public abstract class SdnrOperation extends BidirectionalTopicOperation<PciMessa
         logger.info("SDNR Request to be sent is {}", dmaapRequest);
 
         /* Return the request to be sent through dmaap. */
-        return Pair.of(subRequestId, dmaapRequest);
+        return dmaapRequest;
     }
 }
index e3e3c99..27ffb52 100644 (file)
@@ -29,7 +29,6 @@ import static org.mockito.Mockito.when;
 
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.atomic.AtomicBoolean;
-import org.apache.commons.lang3.tuple.Pair;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
@@ -133,8 +132,9 @@ public class ModifyConfigOperationTest extends BasicSdnrOperation {
 
     @Test
     public void testMakeRequest() throws CoderException {
-        Pair<String, PciMessage> result = oper.makeRequest(1);
-        assertNotNull(result.getLeft());
-        assertNotNull(result.getRight());
+        oper.generateSubRequestId(1);
+
+        PciMessage request = oper.makeRequest(1);
+        assertNotNull(request);
     }
 }
index 8f58f7d..836b1ae 100644 (file)
@@ -26,7 +26,6 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertSame;
 
 import java.util.Arrays;
-import org.apache.commons.lang3.tuple.Pair;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
@@ -78,10 +77,9 @@ public class SdnrOperationTest extends BasicSdnrOperation {
 
     @Test
     public void testMakeRequest() {
-        Pair<String, PciMessage> result = operation.makeRequest(1);
-        assertNotNull(result.getLeft());
+        operation.generateSubRequestId(1);
 
-        PciMessage request = result.getRight();
+        PciMessage request = operation.makeRequest(1);
 
         assertNotNull(request.getBody());
         assertEquals("1.0", request.getVersion());
@@ -94,7 +92,9 @@ public class SdnrOperationTest extends BasicSdnrOperation {
 
     @Test
     public void testGetExpectedKeyValues() {
-        PciMessage request = operation.makeRequest(1).getRight();
+        operation.generateSubRequestId(1);
+
+        PciMessage request = operation.makeRequest(1);
         assertEquals(Arrays.asList(request.getBody().getInput().getCommonHeader().getSubRequestId()),
                         operation.getExpectedKeyValues(50, request));
     }
index 4d53f63..86b9101 100644 (file)
@@ -198,14 +198,14 @@ public abstract class SoOperation extends HttpOperation<SoResponse> {
         if (rawResponse.getStatus() == 200) {
             String requestState = getRequestState(response);
             if (COMPLETE.equalsIgnoreCase(requestState)) {
-                populateSubRequestId(outcome, response);
+                extractSubRequestId(response);
                 successfulCompletion();
                 return CompletableFuture
                                 .completedFuture(setOutcome(outcome, PolicyResult.SUCCESS, rawResponse, response));
             }
 
             if (FAILED.equalsIgnoreCase(requestState)) {
-                populateSubRequestId(outcome, response);
+                extractSubRequestId(response);
                 return CompletableFuture
                                 .completedFuture(setOutcome(outcome, PolicyResult.FAILURE, rawResponse, response));
             }
@@ -214,7 +214,7 @@ public abstract class SoOperation extends HttpOperation<SoResponse> {
         // still incomplete
 
         // need a request ID with which to query
-        if (!populateSubRequestId(outcome, response)) {
+        if (!extractSubRequestId(response)) {
             throw new IllegalArgumentException("missing request ID in response");
         }
 
@@ -231,13 +231,18 @@ public abstract class SoOperation extends HttpOperation<SoResponse> {
         return sleep(getWaitMsGet(), TimeUnit.MILLISECONDS).thenComposeAsync(doGet);
     }
 
-    private boolean populateSubRequestId(OperationOutcome outcome, SoResponse response) {
+    @Override
+    public void generateSubRequestId(int attempt) {
+        setSubRequestId(null);
+    }
+
+    private boolean extractSubRequestId(SoResponse response) {
         if (response == null || response.getRequestReferences() == null
                         || response.getRequestReferences().getRequestId() == null) {
             return false;
         }
 
-        outcome.setSubRequestId(response.getRequestReferences().getRequestId());
+        setSubRequestId(response.getRequestReferences().getRequestId());
         return true;
     }
 
index 80f20b5..ce0d2c2 100644 (file)
@@ -166,21 +166,23 @@ public class SoOperationTest extends BasicSoOperation {
     @Test
     public void testPostProcess() throws Exception {
         // completed
-        outcome.setSubRequestId(null);
+        oper.generateSubRequestId(2);
+        assertNull(oper.getSubRequestId());
         CompletableFuture<OperationOutcome> future2 = oper.postProcessResponse(outcome, PATH, rawResponse, response);
         assertTrue(future2.isDone());
         assertSame(outcome, future2.get());
         assertEquals(PolicyResult.SUCCESS, outcome.getResult());
-        assertNotNull(outcome.getSubRequestId());
+        assertNotNull(oper.getSubRequestId());
 
         // failed
-        outcome.setSubRequestId(null);
+        oper.generateSubRequestId(2);
+        assertNull(oper.getSubRequestId());
         response.getRequest().getRequestStatus().setRequestState(SoOperation.FAILED);
         future2 = oper.postProcessResponse(outcome, PATH, rawResponse, response);
         assertTrue(future2.isDone());
         assertSame(outcome, future2.get());
         assertEquals(PolicyResult.FAILURE, outcome.getResult());
-        assertNotNull(outcome.getSubRequestId());
+        assertNotNull(oper.getSubRequestId());
 
         // no request id in the response
         response.getRequestReferences().setRequestId(null);
index f598d62..9decd8a 100644 (file)
@@ -25,7 +25,6 @@ import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.Executor;
 import java.util.function.BiConsumer;
 import lombok.Getter;
-import org.apache.commons.lang3.tuple.Pair;
 import org.onap.policy.common.endpoints.utils.NetLoggerUtil.EventType;
 import org.onap.policy.common.utils.coder.CoderException;
 import org.onap.policy.common.utils.coder.StandardCoderObject;
@@ -106,10 +105,7 @@ public abstract class BidirectionalTopicOperation<Q, S> extends OperationPartial
     @Override
     protected CompletableFuture<OperationOutcome> startOperationAsync(int attempt, OperationOutcome outcome) {
 
-        final Pair<String, Q> pair = makeRequest(attempt);
-        final Q request = pair.getRight();
-        outcome.setSubRequestId(pair.getLeft());
-
+        final Q request = makeRequest(attempt);
         final List<String> expectedKeyValues = getExpectedKeyValues(attempt, request);
 
         final PipelineControllerFuture<OperationOutcome> controller = new PipelineControllerFuture<>();
@@ -151,10 +147,9 @@ public abstract class BidirectionalTopicOperation<Q, S> extends OperationPartial
      * Makes the request.
      *
      * @param attempt operation attempt
-     * @return a pair containing sub request ID, which may be {@code null} and the new
-     *         request
+     * @return a new request
      */
-    protected abstract Pair<String, Q> makeRequest(int attempt);
+    protected abstract Q makeRequest(int attempt);
 
     /**
      * Gets values, expected in the response, that should match the selector keys.
index a9d7f4e..4aa7236 100644 (file)
@@ -28,6 +28,7 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Queue;
+import java.util.UUID;
 import java.util.concurrent.CancellationException;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CompletionException;
@@ -38,7 +39,9 @@ import java.util.function.BiConsumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
 import java.util.function.UnaryOperator;
+import lombok.AccessLevel;
 import lombok.Getter;
+import lombok.Setter;
 import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
 import org.onap.policy.common.endpoints.utils.NetLoggerUtil;
 import org.onap.policy.common.endpoints.utils.NetLoggerUtil.EventType;
@@ -96,6 +99,10 @@ public abstract class OperationPartial implements Operation {
     @Getter
     private final String fullName;
 
+    @Getter
+    @Setter(AccessLevel.PROTECTED)
+    private String subRequestId;
+
 
     /**
      * Constructs the object.
@@ -271,6 +278,8 @@ public abstract class OperationPartial implements Operation {
     private CompletableFuture<OperationOutcome> startOperationAttempt(
                     PipelineControllerFuture<OperationOutcome> controller, int attempt) {
 
+        generateSubRequestId(attempt);
+
         // propagate "stop" to the operation attempt
         controller.wrap(startAttemptWithoutRetries(attempt)).thenCompose(retryOnFailure(controller, attempt))
                         .whenCompleteAsync(controller.delayedComplete(), params.getExecutor());
@@ -278,6 +287,16 @@ public abstract class OperationPartial implements Operation {
         return controller;
     }
 
+    /**
+     * Generates and sets {@link #subRequestId} to a new subrequest ID.
+     * @param attempt attempt number, typically starting with 1
+     */
+    public void generateSubRequestId(int attempt) {
+        // Note: this should be "protected", but that makes junits much messier
+
+        setSubRequestId(UUID.randomUUID().toString());
+    }
+
     /**
      * Starts the operation attempt, without doing any retries.
      *
@@ -889,6 +908,7 @@ public abstract class OperationPartial implements Operation {
         return (outcome, thrown) -> {
 
             if (callbacks.canStart()) {
+                outcome.setSubRequestId(getSubRequestId());
                 outcome.setStart(callbacks.getStartTime());
                 outcome.setEnd(null);
 
@@ -917,6 +937,7 @@ public abstract class OperationPartial implements Operation {
 
         return (outcome, thrown) -> {
             if (callbacks.canEnd()) {
+                outcome.setSubRequestId(getSubRequestId());
                 outcome.setStart(callbacks.getStartTime());
                 outcome.setEnd(callbacks.getEndTime());
 
index 48669f7..55782a3 100644 (file)
@@ -40,7 +40,6 @@ import java.util.concurrent.CompletableFuture;
 import java.util.function.BiConsumer;
 import lombok.Getter;
 import lombok.Setter;
-import org.apache.commons.lang3.tuple.Pair;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.ArgumentCaptor;
@@ -67,7 +66,6 @@ public class BidirectionalTopicOperationTest {
     private static final String OPERATION = "my-operation";
     private static final String REQ_ID = "my-request-id";
     private static final String TEXT = "some text";
-    private static final String SUB_REQID = "my-sub-request-id";
     private static final int TIMEOUT_SEC = 10;
     private static final long TIMEOUT_MS = 1000 * TIMEOUT_SEC;
     private static final int MAX_REQUESTS = 100;
@@ -138,8 +136,6 @@ public class BidirectionalTopicOperationTest {
         CompletableFuture<OperationOutcome> future = oper.startOperationAsync(1, outcome);
         assertFalse(future.isDone());
 
-        assertEquals(SUB_REQID, outcome.getSubRequestId());
-
         verify(forwarder).register(eq(Arrays.asList(REQ_ID)), listenerCaptor.capture());
 
         verify(forwarder, never()).unregister(any(), any());
@@ -183,8 +179,6 @@ public class BidirectionalTopicOperationTest {
         CompletableFuture<OperationOutcome> future = oper.startOperationAsync(1, outcome);
         assertFalse(future.isDone());
 
-        assertEquals(SUB_REQID, outcome.getSubRequestId());
-
         verify(forwarder).register(eq(Arrays.asList(REQ_ID)), listenerCaptor.capture());
 
         verify(forwarder, never()).unregister(any(), any());
@@ -363,8 +357,8 @@ public class BidirectionalTopicOperationTest {
         }
 
         @Override
-        protected Pair<String, String> makeRequest(int attempt) {
-            return Pair.of(SUB_REQID, TEXT);
+        protected String makeRequest(int attempt) {
+            return TEXT;
         }
 
         @Override
@@ -385,8 +379,8 @@ public class BidirectionalTopicOperationTest {
         }
 
         @Override
-        protected Pair<String, MyRequest> makeRequest(int attempt) {
-            return Pair.of(SUB_REQID, new MyRequest());
+        protected MyRequest makeRequest(int attempt) {
+            return new MyRequest();
         }
 
         @Override
@@ -407,8 +401,8 @@ public class BidirectionalTopicOperationTest {
         }
 
         @Override
-        protected Pair<String, MyRequest> makeRequest(int attempt) {
-            return Pair.of(SUB_REQID, new MyRequest());
+        protected MyRequest makeRequest(int attempt) {
+            return new MyRequest();
         }
 
         @Override
index 7b8eed5..75463b9 100644 (file)
@@ -531,7 +531,7 @@ public class OperationPartialTest {
             }
         };
 
-        verifyRun("testSetRetryFlag_testRetryOnFailure_NullOutcome", 1, 1, PolicyResult.FAILURE, null, noop());
+        verifyRun("testSetRetryFlag_testRetryOnFailure_NullOutcome", 1, 1, PolicyResult.FAILURE, noop());
     }
 
     @Test
@@ -1179,10 +1179,7 @@ public class OperationPartialTest {
     private void verifyRun(String testName, int expectedCallbacks, int expectedOperations,
                     PolicyResult expectedResult) {
 
-        String expectedSubRequestId =
-                        (expectedResult == PolicyResult.FAILURE_EXCEPTION ? null : String.valueOf(expectedOperations));
-
-        verifyRun(testName, expectedCallbacks, expectedOperations, expectedResult, expectedSubRequestId, noop());
+        verifyRun(testName, expectedCallbacks, expectedOperations, expectedResult, noop());
     }
 
     /**
@@ -1192,13 +1189,12 @@ public class OperationPartialTest {
      * @param expectedCallbacks number of callbacks expected
      * @param expectedOperations number of operation invocations expected
      * @param expectedResult expected outcome
-     * @param expectedSubRequestId expected sub request ID
      * @param manipulator function to modify the future returned by
      *        {@link OperationPartial#start(ControlLoopOperationParams)} before the tasks
      *        in the executor are run
      */
     private void verifyRun(String testName, int expectedCallbacks, int expectedOperations, PolicyResult expectedResult,
-                    String expectedSubRequestId, Consumer<CompletableFuture<OperationOutcome>> manipulator) {
+                    Consumer<CompletableFuture<OperationOutcome>> manipulator) {
 
         tstart = null;
         opstart = null;
@@ -1244,7 +1240,9 @@ public class OperationPartialTest {
             }
 
             if (expectedOperations > 0) {
-                assertEquals(testName, expectedSubRequestId, opend.getSubRequestId());
+                assertNotNull(testName, oper.getSubRequestId());
+                assertEquals(testName + " op start", oper.getSubRequestId(), opstart.getSubRequestId());
+                assertEquals(testName + " op end", oper.getSubRequestId(), opend.getSubRequestId());
             }
         }