Add property lists to Actors 60/110760/4
authorJim Hahn <jrh3@att.com>
Wed, 29 Jul 2020 17:50:40 +0000 (13:50 -0400)
committerJim Hahn <jrh3@att.com>
Fri, 31 Jul 2020 18:08:17 +0000 (14:08 -0400)
Modified the Actor code to provide a list of properties needed by the
actor to perform a given operation.
Added a build() method to the parameter class so invokers can build an
operation and set its properties prior to starting it.
Added a "preprocessed" field to the parameter class so invokers can
indicate that the Actor need not perform any preprocessing steps.  Will
modify the actors, in a subsequent review, to observe the flag.
Added "properties" to Operation so invokers can set the properties.  Will
modify the actors, in a subsequent review, to use the property values
instead of the event context.
Tweaked a few Actors to get values using the "params" object instead of
reaching inside to the event object that it contains.

Addressed review comment(s):
- add prefix to other property names

Issue-ID: POLICY-2746
Change-Id: I65996aef5cec5afe25e8287c0b2f5f322c532ca5
Signed-off-by: Jim Hahn <jrh3@att.com>
45 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/AaiGetPnfOperationTest.java
models-interactions/model-actors/actor.aai/src/test/java/org/onap/policy/controlloop/actor/aai/AaiGetTenantOperationTest.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/DecisionOperation.java
models-interactions/model-actors/actor.guard/src/test/java/org/onap/policy/controlloop/actor/guard/DecisionOperationTest.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.sdnc/src/test/java/org/onap/policy/controlloop/actor/sdnc/SdncOperationTest.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/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/main/java/org/onap/policy/controlloop/actor/so/VfModuleCreate.java
models-interactions/model-actors/actor.so/src/main/java/org/onap/policy/controlloop/actor/so/VfModuleDelete.java
models-interactions/model-actors/actor.so/src/test/java/org/onap/policy/controlloop/actor/so/SoOperationTest.java
models-interactions/model-actors/actor.so/src/test/java/org/onap/policy/controlloop/actor/so/VfModuleCreateTest.java
models-interactions/model-actors/actor.so/src/test/java/org/onap/policy/controlloop/actor/so/VfModuleDeleteTest.java
models-interactions/model-actors/actor.vfc/src/main/java/org/onap/policy/controlloop/actor/vfc/VfcOperation.java
models-interactions/model-actors/actor.vfc/src/test/java/org/onap/policy/controlloop/actor/vfc/RestartTest.java
models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/Operation.java
models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/OperationProperties.java [new file with mode: 0644]
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/HttpOperation.java
models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/impl/OperationPartial.java
models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/parameters/ControlLoopOperationParams.java
models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/pipeline/PipelineUtil.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/HttpOperationTest.java
models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/impl/HttpOperatorTest.java
models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/impl/HttpPollingOperationTest.java
models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/impl/HttpPollingOperatorTest.java
models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/impl/OperationPartialTest.java
models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/parameters/ControlLoopOperationParamsTest.java

index 718047c..caa8b9e 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.onap.policy.controlloop.actor.aai;
 
+import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.concurrent.CompletableFuture;
@@ -36,6 +37,7 @@ import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
 import org.onap.policy.common.endpoints.utils.NetLoggerUtil.EventType;
 import org.onap.policy.common.utils.coder.StandardCoderObject;
 import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome;
+import org.onap.policy.controlloop.actorserviceprovider.OperationProperties;
 import org.onap.policy.controlloop.actorserviceprovider.impl.HttpOperation;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.HttpConfig;
@@ -57,6 +59,8 @@ public class AaiCustomQueryOperation extends HttpOperation<String> {
     public static final String RESOURCE_LINK = "resource-link";
     public static final String RESULT_DATA = "result-data";
 
+    private static final List<String> PROPERTY_NAMES = List.of(OperationProperties.AAI_VSERVER_LINK);
+
     // TODO make this configurable
     private static final String PREFIX = "/aai/v16";
 
@@ -70,7 +74,7 @@ public class AaiCustomQueryOperation extends HttpOperation<String> {
      * @param config configuration for this operation
      */
     public AaiCustomQueryOperation(ControlLoopOperationParams params, HttpConfig config) {
-        super(params, config, String.class);
+        super(params, config, String.class, PROPERTY_NAMES);
 
         this.vserver = params.getContext().getEnrichment().get(VSERVER_VSERVER_NAME);
         if (StringUtils.isBlank(this.vserver)) {
index 07738b0..c18d06c 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.onap.policy.controlloop.actor.aai;
 
+import java.util.Collections;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.concurrent.CompletableFuture;
@@ -58,7 +59,7 @@ public class AaiGetOperation extends HttpOperation<StandardCoderObject> {
      * @param config configuration for this operation
      */
     public AaiGetOperation(ControlLoopOperationParams params, HttpConfig config) {
-        super(params, config, StandardCoderObject.class);
+        super(params, config, StandardCoderObject.class, Collections.emptyList());
         this.propertyPrefix = getFullName() + ".";
     }
 
index 173eb29..4000965 100644 (file)
@@ -51,6 +51,7 @@ import org.onap.policy.common.endpoints.http.client.HttpClientFactoryInstance;
 import org.onap.policy.common.utils.coder.StandardCoder;
 import org.onap.policy.common.utils.coder.StandardCoderObject;
 import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome;
+import org.onap.policy.controlloop.actorserviceprovider.OperationProperties;
 import org.onap.policy.controlloop.actorserviceprovider.Util;
 import org.onap.policy.controlloop.actorserviceprovider.impl.HttpOperation;
 import org.onap.policy.controlloop.actorserviceprovider.impl.HttpOperator;
@@ -139,6 +140,11 @@ public class AaiCustomQueryOperationTest extends BasicAaiOperation {
                         .withMessage("missing " + AaiCustomQueryOperation.VSERVER_VSERVER_NAME + " in enrichment data");
     }
 
+    @Test
+    public void testGetPropertyNames() {
+        assertThat(oper.getPropertyNames()).isEqualTo(List.of(OperationProperties.AAI_VSERVER_LINK));
+    }
+
     @Test
     public void testGenerateSubRequestId() {
         oper.generateSubRequestId(3);
index 042b64f..b211db2 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.onap.policy.controlloop.actor.aai;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -79,6 +80,11 @@ public class AaiGetPnfOperationTest extends BasicAaiOperation {
         assertEquals(AaiGetPnfOperation.NAME, oper.getName());
     }
 
+    @Test
+    public void testGetPropertyNames() {
+        assertThat(oper.getPropertyNames()).isEmpty();
+    }
+
     /**
      * Tests "success" case with simulator.
      */
index be8a264..fe0327c 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.onap.policy.controlloop.actor.aai;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -79,6 +80,11 @@ public class AaiGetTenantOperationTest extends BasicAaiOperation {
         assertEquals(AaiGetTenantOperation.NAME, oper.getName());
     }
 
+    @Test
+    public void testGetPropertyNames() {
+        assertThat(oper.getPropertyNames()).isEmpty();
+    }
+
     /**
      * Tests "success" case with simulator.
      */
index 9af2418..e07093a 100644 (file)
@@ -63,9 +63,11 @@ public abstract class AppcOperation extends BidirectionalTopicOperation<Request,
      *
      * @param params operation parameters
      * @param config configuration for this operation
+     * @param propertyNames names of properties required by this operation
      */
-    public AppcOperation(ControlLoopOperationParams params, BidirectionalTopicConfig config) {
-        super(params, config, Response.class);
+    public AppcOperation(ControlLoopOperationParams params, BidirectionalTopicConfig config,
+                    List<String> propertyNames) {
+        super(params, config, Response.class, propertyNames);
     }
 
     /**
index a318444..d1f27b5 100644 (file)
 
 package org.onap.policy.controlloop.actor.appc;
 
+import java.util.List;
 import java.util.concurrent.CompletableFuture;
 import org.onap.aai.domain.yang.GenericVnf;
 import org.onap.policy.aai.AaiConstants;
 import org.onap.policy.aai.AaiCqResponse;
 import org.onap.policy.appc.Request;
 import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome;
+import org.onap.policy.controlloop.actorserviceprovider.OperationProperties;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.BidirectionalTopicConfig;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams;
 import org.slf4j.Logger;
@@ -36,6 +38,8 @@ public class ModifyConfigOperation extends AppcOperation {
 
     public static final String NAME = "ModifyConfig";
 
+    private static final List<String> PROPERTY_NAMES = List.of(OperationProperties.AAI_RESOURCE_VNF);
+
     /**
      * Constructs the object.
      *
@@ -43,7 +47,7 @@ public class ModifyConfigOperation extends AppcOperation {
      * @param config configuration for this operation
      */
     public ModifyConfigOperation(ControlLoopOperationParams params, BidirectionalTopicConfig config) {
-        super(params, config);
+        super(params, config, PROPERTY_NAMES);
     }
 
     /**
index b2d012a..e544d46 100644 (file)
@@ -26,6 +26,7 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertSame;
 
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.Map;
 import java.util.TreeMap;
 import org.junit.After;
@@ -234,7 +235,7 @@ public class AppcOperationTest extends BasicAppcOperation {
     private static class MyOper extends AppcOperation {
 
         public MyOper(ControlLoopOperationParams params, BidirectionalTopicConfig config) {
-            super(params, config);
+            super(params, config, Collections.emptyList());
         }
 
         @Override
index 0e29dd2..d000038 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.onap.policy.controlloop.actor.appc;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -32,6 +33,7 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import java.util.Arrays;
+import java.util.List;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.atomic.AtomicBoolean;
 import org.junit.After;
@@ -45,6 +47,7 @@ import org.onap.policy.appc.Request;
 import org.onap.policy.appc.Response;
 import org.onap.policy.common.utils.coder.CoderException;
 import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome;
+import org.onap.policy.controlloop.actorserviceprovider.OperationProperties;
 import org.onap.policy.controlloop.actorserviceprovider.controlloop.ControlLoopEventContext;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.BidirectionalTopicConfig;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.BidirectionalTopicParams;
@@ -118,6 +121,11 @@ public class ModifyConfigOperationTest extends BasicAppcOperation {
         assertEquals(ModifyConfigOperation.NAME, oper.getName());
     }
 
+    @Test
+    public void testGetPropertyNames() {
+        assertThat(oper.getPropertyNames()).isEqualTo(List.of(OperationProperties.AAI_RESOURCE_VNF));
+    }
+
     @Test
     public void testStartPreprocessorAsync() throws Exception {
         CompletableFuture<OperationOutcome> future2 = new CompletableFuture<>();
index 0be723c..590bf19 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.onap.policy.controlloop.actor.appclcm;
 
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.CompletableFuture;
@@ -32,7 +33,6 @@ import org.onap.policy.appclcm.AppcLcmOutput;
 import org.onap.policy.appclcm.AppcLcmResponseCode;
 import org.onap.policy.appclcm.AppcLcmResponseStatus;
 import org.onap.policy.common.utils.coder.CoderException;
-import org.onap.policy.controlloop.VirtualControlLoopEvent;
 import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome;
 import org.onap.policy.controlloop.actorserviceprovider.impl.BidirectionalTopicOperation;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.BidirectionalTopicConfig;
@@ -62,7 +62,7 @@ public class AppcLcmOperation extends BidirectionalTopicOperation<AppcLcmDmaapWr
      * @param config configuration for this operation
      */
     public AppcLcmOperation(ControlLoopOperationParams params, BidirectionalTopicConfig config) {
-        super(params, config, AppcLcmDmaapWrapper.class);
+        super(params, config, AppcLcmDmaapWrapper.class, Collections.emptyList());
 
         if (StringUtils.isBlank(params.getTargetEntity())) {
             throw new IllegalArgumentException("missing targetEntity");
@@ -80,12 +80,11 @@ public class AppcLcmOperation extends BidirectionalTopicOperation<AppcLcmDmaapWr
 
     @Override
     protected AppcLcmDmaapWrapper makeRequest(int attempt) {
-        VirtualControlLoopEvent onset = params.getContext().getEvent();
         String subRequestId = getSubRequestId();
 
         AppcLcmCommonHeader header = new AppcLcmCommonHeader();
-        header.setOriginatorId(onset.getRequestId().toString());
-        header.setRequestId(onset.getRequestId());
+        header.setOriginatorId(params.getRequestId().toString());
+        header.setRequestId(params.getRequestId());
         header.setSubRequestId(subRequestId);
 
         AppcLcmInput inputRequest = new AppcLcmInput();
@@ -118,7 +117,7 @@ public class AppcLcmOperation extends BidirectionalTopicOperation<AppcLcmDmaapWr
         AppcLcmDmaapWrapper dmaapRequest = new AppcLcmDmaapWrapper();
         dmaapRequest.setBody(body);
         dmaapRequest.setVersion("2.0");
-        dmaapRequest.setCorrelationId(onset.getRequestId() + "-" + subRequestId);
+        dmaapRequest.setCorrelationId(params.getRequestId() + "-" + subRequestId);
         dmaapRequest.setRpcName(recipeFormatter.getUrlRecipe());
         dmaapRequest.setType("request");
 
index 6059cb5..705fd10 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.onap.policy.controlloop.actor.appclcm;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -141,6 +142,11 @@ public class AppcLcmOperationTest extends BasicBidirectionalTopicOperation<AppcL
                         .withMessage("missing targetEntity");
     }
 
+    @Test
+    public void testGetPropertyNames() {
+        assertThat(oper.getPropertyNames()).isEmpty();
+    }
+
     @Test
     public void testStartPreprocessorAsync() throws Exception {
         context = mock(ControlLoopEventContext.class);
index 0a882ce..2417812 100644 (file)
@@ -25,8 +25,10 @@ import com.google.protobuf.InvalidProtocolBufferException;
 import com.google.protobuf.Struct;
 import com.google.protobuf.Struct.Builder;
 import com.google.protobuf.util.JsonFormat;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.UUID;
@@ -48,6 +50,7 @@ import org.onap.policy.controlloop.actor.aai.AaiGetPnfOperation;
 import org.onap.policy.controlloop.actor.cds.constants.CdsActorConstants;
 import org.onap.policy.controlloop.actor.cds.request.CdsActionRequest;
 import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome;
+import org.onap.policy.controlloop.actorserviceprovider.OperationProperties;
 import org.onap.policy.controlloop.actorserviceprovider.Util;
 import org.onap.policy.controlloop.actorserviceprovider.impl.OperationPartial;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams;
@@ -84,6 +87,19 @@ public class GrpcOperation extends OperationPartial {
      */
     private final Supplier<Map<String, String>> aaiConverter;
 
+
+    // @formatter:off
+    private static final List<String> PNF_PROPERTY_NAMES = List.of(
+                            OperationProperties.AAI_PNF,
+                            OperationProperties.EVENT_ADDITIONAL_PARAMS);
+
+
+    private static final List<String> VNF_PROPERTY_NAMES = List.of(
+                            OperationProperties.AAI_MODEL_INVARIANT_GENERIC_VNF,
+                            OperationProperties.AAI_RESOURCE_SERVICE_INSTANCE,
+                            OperationProperties.EVENT_ADDITIONAL_PARAMS);
+    // @formatter:on
+
     /**
      * Constructs the object.
      *
@@ -91,7 +107,7 @@ public class GrpcOperation extends OperationPartial {
      * @param config configuration for this operation
      */
     public GrpcOperation(ControlLoopOperationParams params, GrpcConfig config) {
-        super(params, config);
+        super(params, config, Collections.emptyList());
         this.config = config;
 
         if (TargetType.PNF.equals(params.getTarget().getType())) {
@@ -103,6 +119,11 @@ public class GrpcOperation extends OperationPartial {
         }
     }
 
+    @Override
+    public List<String> getPropertyNames() {
+        return (TargetType.PNF.equals(params.getTarget().getType()) ? PNF_PROPERTY_NAMES : VNF_PROPERTY_NAMES);
+    }
+
     /**
      * If no timeout is specified, then it returns the operator's configured timeout.
      */
@@ -287,8 +308,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(getSubRequestId()).build();
+                        .setRequestId(params.getRequestId().toString()).setSubRequestId(getSubRequestId()).build();
 
         // Build CDS gRPC request action-identifier
         ActionIdentifiers actionIdentifiers =
index fe8d428..cbc88a3 100644 (file)
@@ -19,6 +19,7 @@
 
 package org.onap.policy.controlloop.actor.cds;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
@@ -30,6 +31,7 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
@@ -62,6 +64,7 @@ import org.onap.policy.controlloop.actor.aai.AaiGetPnfOperation;
 import org.onap.policy.controlloop.actor.cds.constants.CdsActorConstants;
 import org.onap.policy.controlloop.actorserviceprovider.ActorService;
 import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome;
+import org.onap.policy.controlloop.actorserviceprovider.OperationProperties;
 import org.onap.policy.controlloop.actorserviceprovider.controlloop.ControlLoopEventContext;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams;
 import org.onap.policy.controlloop.policy.PolicyResult;
@@ -170,6 +173,43 @@ public class GrpcOperationTest {
         assertTrue(outcome.getResponse() instanceof ExecutionServiceOutput);
     }
 
+    @Test
+    public void testGetPropertyNames() {
+        ControlLoopEventContext context = mock(ControlLoopEventContext.class);
+        when(context.getEvent()).thenReturn(onset);
+
+        ControlLoopOperationParams params = ControlLoopOperationParams.builder().actor(CdsActorConstants.CDS_ACTOR)
+                        .operation(GrpcOperation.NAME).context(context).actorService(new ActorService())
+                        .targetEntity(TARGET_ENTITY).target(target).build();
+        GrpcConfig config = new GrpcConfig(executor, cdsProps);
+
+        /*
+         * check VNF case
+         */
+        operation = new GrpcOperation(params, config);
+
+        // @formatter:off
+        assertThat(operation.getPropertyNames()).isEqualTo(
+                        List.of(
+                            OperationProperties.AAI_MODEL_INVARIANT_GENERIC_VNF,
+                            OperationProperties.AAI_RESOURCE_SERVICE_INSTANCE,
+                            OperationProperties.EVENT_ADDITIONAL_PARAMS));
+        // @formatter:on
+
+        /*
+         * check PNF case
+         */
+        target.setType(TargetType.PNF);
+        operation = new GrpcOperation(params, config);
+
+        // @formatter:off
+        assertThat(operation.getPropertyNames()).isEqualTo(
+                        List.of(
+                            OperationProperties.AAI_PNF,
+                            OperationProperties.EVENT_ADDITIONAL_PARAMS));
+        // @formatter:on
+    }
+
     @Test
     public void testStartPreprocessorAsync() throws InterruptedException, ExecutionException, TimeoutException {
 
index 6a7b6fd..bd4f0e3 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.onap.policy.controlloop.actor.guard;
 
+import java.util.Collections;
 import java.util.Map;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.Executor;
@@ -81,7 +82,7 @@ public class DecisionOperation extends HttpOperation<DecisionResponse> {
      * @param config configuration for this operation
      */
     public DecisionOperation(ControlLoopOperationParams params, HttpConfig config) {
-        super(params, config, DecisionResponse.class);
+        super(params, config, DecisionResponse.class, Collections.emptyList());
         this.config = (GuardConfig) config;
     }
 
index 6fe8cea..ac6d6c8 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.onap.policy.controlloop.actor.guard;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -147,6 +148,11 @@ public class DecisionOperationTest extends BasicHttpOperation {
         assertEquals(DEFAULT_OPERATION, oper.getName());
     }
 
+    @Test
+    public void testGetPropertyNames() {
+        assertThat(oper.getPropertyNames()).isEmpty();
+    }
+
     @Test
     public void testStartOperationAsync() throws Exception {
         CompletableFuture<OperationOutcome> future2 = oper.start();
index 0c44169..434b3b9 100644 (file)
@@ -20,7 +20,9 @@
 
 package org.onap.policy.controlloop.actor.sdnc;
 
+import java.util.List;
 import org.apache.commons.lang3.StringUtils;
+import org.onap.policy.controlloop.actorserviceprovider.OperationProperties;
 import org.onap.policy.controlloop.actorserviceprovider.controlloop.ControlLoopEventContext;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.HttpConfig;
@@ -42,6 +44,14 @@ public class BandwidthOnDemandOperation extends SdncOperation {
     public static final String SERVICE_ID_KEY = "service-instance.service-instance-id";
     public static final String VNF_ID = "vnfId";
 
+    // @formatter:off
+    private static final List<String> PROPERTY_NAMES = List.of(
+                            OperationProperties.ENRICHMENT_SERVICE_INSTANCE_ID,
+                            OperationProperties.ENRICHMENT_BANDWIDTH,
+                            OperationProperties.ENRICHMENT_BANDWIDTH_CHANGE_TIME,
+                            OperationProperties.ENRICHMENT_VNF_ID);
+    // @formatter:on
+
     /**
      * Constructs the object.
      *
@@ -49,7 +59,7 @@ public class BandwidthOnDemandOperation extends SdncOperation {
      * @param config configuration for this operation
      */
     public BandwidthOnDemandOperation(ControlLoopOperationParams params, HttpConfig config) {
-        super(params, config);
+        super(params, config, PROPERTY_NAMES);
     }
 
     @Override
@@ -88,7 +98,7 @@ public class BandwidthOnDemandOperation extends SdncOperation {
 
         SdncRequest request = new SdncRequest();
         request.setNsInstanceId(serviceInstance);
-        request.setRequestId(context.getRequestId());
+        request.setRequestId(params.getRequestId());
         request.setUrl("/" + getPath());
 
         SdncHealVnfInfo vnfInfo = new SdncHealVnfInfo();
index d8e1b05..d26fad8 100644 (file)
@@ -20,7 +20,9 @@
 
 package org.onap.policy.controlloop.actor.sdnc;
 
+import java.util.List;
 import org.apache.commons.lang3.StringUtils;
+import org.onap.policy.controlloop.actorserviceprovider.OperationProperties;
 import org.onap.policy.controlloop.actorserviceprovider.controlloop.ControlLoopEventContext;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.HttpConfig;
@@ -38,6 +40,12 @@ public class RerouteOperation extends SdncOperation {
     public static final String SERVICE_ID_KEY = "service-instance.service-instance-id";
     public static final String NETWORK_ID_KEY = "network-information.network-id";
 
+    // @formatter:off
+    private static final List<String> PROPERTY_NAMES = List.of(
+                            OperationProperties.ENRICHMENT_SERVICE_ID,
+                            OperationProperties.ENRICHMENT_NETWORK_ID);
+    // @formatter:on
+
     /**
      * Constructs the object.
      *
@@ -45,7 +53,7 @@ public class RerouteOperation extends SdncOperation {
      * @param config configuration for this operation
      */
     public RerouteOperation(ControlLoopOperationParams params, HttpConfig config) {
-        super(params, config);
+        super(params, config, PROPERTY_NAMES);
     }
 
     @Override
@@ -75,7 +83,7 @@ public class RerouteOperation extends SdncOperation {
 
         SdncRequest request = new SdncRequest();
         request.setNsInstanceId(serviceInstance);
-        request.setRequestId(context.getRequestId());
+        request.setRequestId(params.getRequestId());
         request.setUrl("/" + getPath());
 
         SdncHealRequest healRequest = new SdncHealRequest();
index 9b63943..4d8e35e 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.onap.policy.controlloop.actor.sdnc;
 
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.CompletableFuture;
 import javax.ws.rs.client.Entity;
@@ -44,9 +45,10 @@ public abstract class SdncOperation extends HttpOperation<SdncResponse> {
      *
      * @param params operation parameters
      * @param config configuration for this operation
+     * @param propertyNames names of properties required by this operation
      */
-    public SdncOperation(ControlLoopOperationParams params, HttpConfig config) {
-        super(params, config, SdncResponse.class);
+    public SdncOperation(ControlLoopOperationParams params, HttpConfig config, List<String> propertyNames) {
+        super(params, config, SdncResponse.class, propertyNames);
     }
 
     /**
index 95b4bd7..56b64e4 100644 (file)
 
 package org.onap.policy.controlloop.actor.sdnc;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
+import java.util.List;
 import java.util.Map;
 import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.onap.policy.common.endpoints.http.client.HttpClientFactoryInstance;
+import org.onap.policy.controlloop.actorserviceprovider.OperationProperties;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.HttpConfig;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.HttpParams;
 import org.onap.policy.controlloop.policy.PolicyResult;
@@ -68,6 +71,19 @@ public class BandwidthOnDemandOperationTest extends BasicSdncOperation {
         assertEquals(BandwidthOnDemandOperation.NAME, oper.getName());
     }
 
+    @Test
+    public void testGetPropertyNames() {
+        // @formatter:off
+        assertThat(oper.getPropertyNames()).isEqualTo(
+                        List.of(
+                            OperationProperties.ENRICHMENT_SERVICE_INSTANCE_ID,
+                            OperationProperties.ENRICHMENT_BANDWIDTH,
+                            OperationProperties.ENRICHMENT_BANDWIDTH_CHANGE_TIME,
+                            OperationProperties.ENRICHMENT_VNF_ID));
+
+        // @formatter:on
+    }
+
     /**
      * Tests "success" case with simulator.
      */
index 142f107..9f06805 100644 (file)
 
 package org.onap.policy.controlloop.actor.sdnc;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
+import java.util.List;
 import java.util.Map;
 import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.onap.policy.common.endpoints.http.client.HttpClientFactoryInstance;
+import org.onap.policy.controlloop.actorserviceprovider.OperationProperties;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.HttpConfig;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.HttpParams;
 import org.onap.policy.controlloop.policy.PolicyResult;
@@ -85,6 +88,16 @@ public class RerouteOperationTest extends BasicSdncOperation {
         assertEquals(RerouteOperation.NAME, oper.getName());
     }
 
+    @Test
+    public void testGetPropertyNames() {
+        // @formatter:off
+        assertThat(oper.getPropertyNames()).isEqualTo(
+                        List.of(
+                            OperationProperties.ENRICHMENT_SERVICE_ID,
+                            OperationProperties.ENRICHMENT_NETWORK_ID));
+        // @formatter:on
+    }
+
     @Test
     public void testMakeRequest() throws Exception {
         oper.generateSubRequestId(1);
index 417029d..fb9f71b 100644 (file)
@@ -25,6 +25,7 @@ import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import java.util.Collections;
 import java.util.Map;
 import java.util.TreeMap;
 import org.junit.Before;
@@ -57,7 +58,7 @@ public class SdncOperationTest extends BasicSdncOperation {
         healRequest.setRequestHeaderInfo(headerInfo);
         headerInfo.setSvcRequestId(SUB_REQ_ID);
 
-        oper = new SdncOperation(params, config) {
+        oper = new SdncOperation(params, config, Collections.emptyList()) {
             @Override
             protected SdncRequest makeRequest(int attempt) {
                 return request;
index 6c8f45d..f88f3c3 100644 (file)
@@ -22,8 +22,8 @@ package org.onap.policy.controlloop.actor.sdnr;
 
 import java.util.List;
 import java.util.concurrent.CompletableFuture;
-import org.onap.policy.controlloop.VirtualControlLoopEvent;
 import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome;
+import org.onap.policy.controlloop.actorserviceprovider.OperationProperties;
 import org.onap.policy.controlloop.actorserviceprovider.impl.BidirectionalTopicOperation;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.BidirectionalTopicConfig;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams;
@@ -46,6 +46,8 @@ public class SdnrOperation extends BidirectionalTopicOperation<PciMessage, PciMe
      */
     public static final String NAME = "any";
 
+    private static final List<String> PROPERTY_NAMES = List.of(OperationProperties.AAI_VSERVER_LINK);
+
     /**
      * Keys used to match the response with the request listener. The sub request ID is a
      * UUID, so it can be used to uniquely identify the response.
@@ -57,7 +59,7 @@ public class SdnrOperation extends BidirectionalTopicOperation<PciMessage, PciMe
                     List.of(new SelectorKey("body", "output", "CommonHeader", "SubRequestID"));
 
     public SdnrOperation(ControlLoopOperationParams params, BidirectionalTopicConfig config) {
-        super(params, config, PciMessage.class);
+        super(params, config, PciMessage.class, PROPERTY_NAMES);
     }
 
     /**
@@ -135,14 +137,13 @@ public class SdnrOperation extends BidirectionalTopicOperation<PciMessage, PciMe
 
     @Override
     protected PciMessage makeRequest(int attempt) {
-        VirtualControlLoopEvent onset = params.getContext().getEvent();
         String subRequestId = getSubRequestId();
 
         /* Construct an SDNR request using pci Model */
 
         PciMessage dmaapRequest = new PciMessage();
         dmaapRequest.setVersion("1.0");
-        dmaapRequest.setCorrelationId(onset.getRequestId() + "-" + subRequestId);
+        dmaapRequest.setCorrelationId(params.getRequestId() + "-" + subRequestId);
         dmaapRequest.setType("request");
         dmaapRequest.setRpcName(params.getOperation().toLowerCase());
 
@@ -151,11 +152,11 @@ public class SdnrOperation extends BidirectionalTopicOperation<PciMessage, PciMe
 
         /* The common header is a required field for all SDNR requests. */
         PciCommonHeader requestCommonHeader = new PciCommonHeader();
-        requestCommonHeader.setRequestId(onset.getRequestId());
+        requestCommonHeader.setRequestId(params.getRequestId());
         requestCommonHeader.setSubRequestId(subRequestId);
 
         sdnrRequest.setCommonHeader(requestCommonHeader);
-        sdnrRequest.setPayload(onset.getPayload());
+        sdnrRequest.setPayload(params.getContext().getEvent().getPayload());
         sdnrRequest.setAction(params.getOperation());
 
         /*
index 7e9d263..8ec1e4a 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.onap.policy.controlloop.actor.sdnr;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -29,6 +30,7 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 import java.util.Arrays;
+import java.util.List;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.atomic.AtomicBoolean;
 import org.junit.After;
@@ -38,6 +40,7 @@ import org.junit.BeforeClass;
 import org.junit.Test;
 import org.onap.policy.controlloop.actor.test.BasicBidirectionalTopicOperation;
 import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome;
+import org.onap.policy.controlloop.actorserviceprovider.OperationProperties;
 import org.onap.policy.controlloop.actorserviceprovider.controlloop.ControlLoopEventContext;
 import org.onap.policy.controlloop.actorserviceprovider.impl.BidirectionalTopicOperation.Status;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.BidirectionalTopicConfig;
@@ -85,6 +88,11 @@ public class SdnrOperationTest extends BasicSdnrOperation {
         assertEquals(DEFAULT_OPERATION, operation.getName());
     }
 
+    @Test
+    public void testGetPropertyNames() {
+        assertThat(operation.getPropertyNames()).isEqualTo(List.of(OperationProperties.AAI_VSERVER_LINK));
+    }
+
     @Test
     public void testMakeRequest() {
         operation.generateSubRequestId(1);
index cb9ec9c..f269ea0 100644 (file)
@@ -86,9 +86,10 @@ public abstract class SoOperation extends HttpOperation<SoResponse> {
      *
      * @param params operation parameters
      * @param config configuration for this operation
+     * @param propertyNames names of properties required by this operation
      */
-    public SoOperation(ControlLoopOperationParams params, HttpPollingConfig config) {
-        super(params, config, SoResponse.class);
+    public SoOperation(ControlLoopOperationParams params, HttpPollingConfig config, List<String> propertyNames) {
+        super(params, config, SoResponse.class, propertyNames);
 
         setUsePolling();
 
index c56bc22..fcd48b1 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.onap.policy.controlloop.actor.so;
 
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.CompletableFuture;
 import javax.ws.rs.client.Entity;
@@ -35,6 +36,7 @@ import org.onap.policy.aai.AaiCqResponse;
 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.OperationOutcome;
+import org.onap.policy.controlloop.actorserviceprovider.OperationProperties;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.HttpPollingConfig;
 import org.onap.policy.so.SoModelInfo;
@@ -57,6 +59,15 @@ public class VfModuleCreate extends SoOperation {
 
     private static final String PATH_PREFIX = "/";
 
+    // @formatter:off
+    private static final List<String> PROPERTY_NAMES = List.of(
+                            OperationProperties.AAI_MODEL_SERVICE,
+                            OperationProperties.AAI_MODEL_VNF,
+                            OperationProperties.AAI_MODEL_CLOUD_REGION,
+                            OperationProperties.AAI_MODEL_TENANT,
+                            OperationProperties.DATA_VF_COUNT);
+    // @formatter:off
+
     /**
      * Constructs the object.
      *
@@ -64,7 +75,7 @@ public class VfModuleCreate extends SoOperation {
      * @param config configuration for this operation
      */
     public VfModuleCreate(ControlLoopOperationParams params, HttpPollingConfig config) {
-        super(params, config);
+        super(params, config, PROPERTY_NAMES);
 
         // ensure we have the necessary parameters
         validateTarget();
index dc8b0d6..b7afb69 100644 (file)
@@ -28,6 +28,7 @@ import java.net.http.HttpResponse;
 import java.net.http.HttpResponse.BodyHandlers;
 import java.nio.charset.StandardCharsets;
 import java.util.Base64;
+import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.concurrent.CompletableFuture;
@@ -46,6 +47,7 @@ import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
 import org.onap.policy.common.endpoints.http.client.HttpClient;
 import org.onap.policy.common.endpoints.utils.NetLoggerUtil.EventType;
 import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome;
+import org.onap.policy.controlloop.actorserviceprovider.OperationProperties;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.HttpPollingConfig;
 import org.onap.policy.controlloop.actorserviceprovider.pipeline.PipelineControllerFuture;
@@ -66,6 +68,15 @@ public class VfModuleDelete extends SoOperation {
 
     private static final String PATH_PREFIX = "/";
 
+    // @formatter:off
+    private static final List<String> PROPERTY_NAMES = List.of(
+                            OperationProperties.AAI_MODEL_SERVICE,
+                            OperationProperties.AAI_MODEL_VNF,
+                            OperationProperties.AAI_MODEL_CLOUD_REGION,
+                            OperationProperties.AAI_MODEL_TENANT,
+                            OperationProperties.DATA_VF_COUNT);
+    // @formatter:on
+
     /**
      * Constructs the object.
      *
@@ -73,7 +84,7 @@ public class VfModuleDelete extends SoOperation {
      * @param config configuration for this operation
      */
     public VfModuleDelete(ControlLoopOperationParams params, HttpPollingConfig config) {
-        super(params, config);
+        super(params, config, PROPERTY_NAMES);
 
         // ensure we have the necessary parameters
         validateTarget();
index 46d96fd..7314c59 100644 (file)
@@ -60,6 +60,9 @@ public class SoOperationTest extends BasicSoOperation {
 
     private static final String VF_COUNT_KEY = SoConstants.VF_COUNT_PREFIX
                     + "[my-model-customization-id][my-model-invariant-id][my-model-version-id]";
+
+    private static final List<String> PROP_NAMES = Collections.emptyList();
+
     private SoOperation oper;
 
     /**
@@ -71,7 +74,7 @@ public class SoOperationTest extends BasicSoOperation {
 
         initConfig();
 
-        oper = new SoOperation(params, config) {};
+        oper = new SoOperation(params, config, PROP_NAMES) {};
     }
 
     @Test
@@ -83,7 +86,7 @@ public class SoOperationTest extends BasicSoOperation {
 
         // check when Target is null
         params = params.toBuilder().target(null).build();
-        assertThatIllegalArgumentException().isThrownBy(() -> new SoOperation(params, config) {})
+        assertThatIllegalArgumentException().isThrownBy(() -> new SoOperation(params, config, PROP_NAMES) {})
                         .withMessageContaining("Target information");
     }
 
@@ -222,7 +225,7 @@ public class SoOperationTest extends BasicSoOperation {
 
         // try with null target
         params = params.toBuilder().target(null).build();
-        assertThatIllegalArgumentException().isThrownBy(() -> new SoOperation(params, config) {})
+        assertThatIllegalArgumentException().isThrownBy(() -> new SoOperation(params, config, PROP_NAMES) {})
                         .withMessageContaining("missing Target");
     }
 
@@ -258,7 +261,7 @@ public class SoOperationTest extends BasicSoOperation {
 
         // null payload
         params = params.toBuilder().payload(null).build();
-        oper = new SoOperation(params, config) {};
+        oper = new SoOperation(params, config, PROP_NAMES) {};
         assertTrue(oper.buildRequestParameters().isEmpty());
     }
 
@@ -278,7 +281,7 @@ public class SoOperationTest extends BasicSoOperation {
 
         // null payload
         params = params.toBuilder().payload(null).build();
-        oper = new SoOperation(params, config) {};
+        oper = new SoOperation(params, config, PROP_NAMES) {};
         assertTrue(oper.buildConfigurationParameters().isEmpty());
     }
 
index 9426864..0db209d 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.onap.policy.controlloop.actor.so;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -30,6 +31,7 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ForkJoinPool;
@@ -50,6 +52,7 @@ import org.onap.policy.aai.AaiCqResponse;
 import org.onap.policy.common.endpoints.http.client.HttpClientFactoryInstance;
 import org.onap.policy.common.utils.coder.CoderException;
 import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome;
+import org.onap.policy.controlloop.actorserviceprovider.OperationProperties;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.HttpPollingConfig;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.HttpPollingParams;
@@ -115,6 +118,19 @@ public class VfModuleCreateTest extends BasicSoOperation {
                         .withMessageContaining("Target information");
     }
 
+    @Test
+    public void testGetPropertyNames() {
+        // @formatter:off
+        assertThat(oper.getPropertyNames()).isEqualTo(
+                        List.of(
+                            OperationProperties.AAI_MODEL_SERVICE,
+                            OperationProperties.AAI_MODEL_VNF,
+                            OperationProperties.AAI_MODEL_CLOUD_REGION,
+                            OperationProperties.AAI_MODEL_TENANT,
+                            OperationProperties.DATA_VF_COUNT));
+        // @formatter:on
+    }
+
     @Test
     public void testStartPreprocessorAsync() throws Exception {
         // insert CQ data so it's there for the check
index d7b5341..7c37dc9 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.onap.policy.controlloop.actor.so;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -39,6 +40,7 @@ import java.net.http.HttpResponse;
 import java.net.http.HttpResponse.BodyHandlers;
 import java.nio.charset.StandardCharsets;
 import java.util.Base64;
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ForkJoinPool;
@@ -63,6 +65,7 @@ import org.onap.policy.aai.AaiCqResponse;
 import org.onap.policy.common.endpoints.http.client.HttpClientFactoryInstance;
 import org.onap.policy.common.utils.coder.CoderException;
 import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome;
+import org.onap.policy.controlloop.actorserviceprovider.OperationProperties;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.HttpPollingConfig;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.HttpPollingParams;
@@ -144,6 +147,19 @@ public class VfModuleDeleteTest extends BasicSoOperation {
                         .withMessageContaining("Target information");
     }
 
+    @Test
+    public void testGetPropertyNames() {
+        // @formatter:off
+        assertThat(oper.getPropertyNames()).isEqualTo(
+                        List.of(
+                            OperationProperties.AAI_MODEL_SERVICE,
+                            OperationProperties.AAI_MODEL_VNF,
+                            OperationProperties.AAI_MODEL_CLOUD_REGION,
+                            OperationProperties.AAI_MODEL_TENANT,
+                            OperationProperties.DATA_VF_COUNT));
+        // @formatter:on
+    }
+
     @Test
     public void testStartPreprocessorAsync() throws Exception {
         // insert CQ data so it's there for the check
index d5ee44a..8bd4630 100644 (file)
 
 package org.onap.policy.controlloop.actor.vfc;
 
+import java.util.List;
 import java.util.concurrent.CompletableFuture;
 import javax.ws.rs.core.Response;
 import org.apache.commons.lang3.StringUtils;
 import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome;
+import org.onap.policy.controlloop.actorserviceprovider.OperationProperties;
 import org.onap.policy.controlloop.actorserviceprovider.controlloop.ControlLoopEventContext;
 import org.onap.policy.controlloop.actorserviceprovider.impl.HttpOperation;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams;
@@ -44,6 +46,14 @@ public abstract class VfcOperation extends HttpOperation<VfcResponse> {
     public static final String REQ_PARAM_NM = "requestParameters";
     public static final String CONFIG_PARAM_NM = "configurationParameters";
 
+    // @formatter:off
+    private static final List<String> PROPERTY_NAMES = List.of(
+                            OperationProperties.ENRICHMENT_SERVICE_INSTANCE_ID,
+                            OperationProperties.ENRICHMENT_VSERVER_ID,
+                            OperationProperties.ENRICHMENT_VSERVER_NAME,
+                            OperationProperties.ENRICHMENT_GENERIC_VNF_ID);
+    // @formatter:on
+
     /**
      * Job ID extracted from the first response.
      */
@@ -57,7 +67,7 @@ public abstract class VfcOperation extends HttpOperation<VfcResponse> {
      * @param config configuration for this operation
      */
     public VfcOperation(ControlLoopOperationParams params, HttpConfig config) {
-        super(params, config, VfcResponse.class);
+        super(params, config, VfcResponse.class, PROPERTY_NAMES);
 
         setUsePolling();
     }
@@ -180,14 +190,14 @@ public abstract class VfcOperation extends HttpOperation<VfcResponse> {
         additionalParams.setActionInfo(vmActionInfo);
 
         VfcHealRequest healRequest = new VfcHealRequest();
-        healRequest.setVnfInstanceId(params.getContext().getEvent().getAai().get(GENERIC_VNF_ID));
+        healRequest.setVnfInstanceId(params.getContext().getEnrichment().get(GENERIC_VNF_ID));
         healRequest.setCause(getName());
         healRequest.setAdditionalParams(additionalParams);
 
         VfcRequest request = new VfcRequest();
         request.setHealRequest(healRequest);
         request.setNsInstanceId(serviceInstance);
-        request.setRequestId(context.getEvent().getRequestId());
+        request.setRequestId(params.getRequestId());
 
         return request;
     }
index ed072f7..4666645 100644 (file)
 
 package org.onap.policy.controlloop.actor.vfc;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import java.util.List;
 import java.util.concurrent.CompletableFuture;
 import org.apache.commons.lang3.tuple.Pair;
 import org.junit.AfterClass;
@@ -32,6 +34,7 @@ import org.junit.BeforeClass;
 import org.junit.Test;
 import org.onap.policy.common.endpoints.http.client.HttpClientFactoryInstance;
 import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome;
+import org.onap.policy.controlloop.actorserviceprovider.OperationProperties;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.HttpPollingConfig;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.HttpPollingParams;
 import org.onap.policy.controlloop.policy.PolicyResult;
@@ -88,6 +91,18 @@ public class RestartTest extends BasicVfcOperation {
         assertEquals(0, restartOper.getPollCount());
     }
 
+    @Test
+    public void testGetPropertyNames() {
+        // @formatter:off
+        assertThat(restartOper.getPropertyNames()).isEqualTo(
+                        List.of(
+                            OperationProperties.ENRICHMENT_SERVICE_INSTANCE_ID,
+                            OperationProperties.ENRICHMENT_VSERVER_ID,
+                            OperationProperties.ENRICHMENT_VSERVER_NAME,
+                            OperationProperties.ENRICHMENT_GENERIC_VNF_ID));
+        // @formatter:on
+    }
+
     @Test
     public void testMakeRequest() {
         Pair<String, VfcRequest> resultPair = restartOper.makeRequest();
index 39977fd..dfa0865 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.onap.policy.controlloop.actorserviceprovider;
 
+import java.util.List;
 import java.util.concurrent.CompletableFuture;
 
 /**
@@ -42,6 +43,21 @@ public interface Operation {
      */
     String getName();
 
+    /**
+     * Gets the names of the properties required by the operation.
+     *
+     * @return the names of the properties required by the operation
+     */
+    List<String> getPropertyNames();
+
+    /**
+     * Sets a property.
+     *
+     * @param name property name
+     * @param value new value
+     */
+    public void setProperty(String name, Object value);
+
     /**
      * Called by enforcement PDP engine to start the operation. As part of the operation,
      * it invokes the "start" and "complete" call-backs found within the parameters.
diff --git a/models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/OperationProperties.java b/models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/OperationProperties.java
new file mode 100644 (file)
index 0000000..4284646
--- /dev/null
@@ -0,0 +1,63 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP
+ * ================================================================================
+ * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop.actorserviceprovider;
+
+/**
+ * Names of properties needed by the Actors defined within this repo. Note: this is not
+ * exhaustive, as additional property names may be returned by company-defined Actors.
+ */
+public class OperationProperties {
+    public static final String AAI_MODEL_CLOUD_REGION = "AAI/modelInvariantId/cloudRegion";
+    public static final String AAI_MODEL_INVARIANT_GENERIC_VNF = "AAI/modelInvariantId/genericVnf";
+    public static final String AAI_MODEL_SERVICE = "AAI/modelInvariantId/service";
+    public static final String AAI_MODEL_TENANT = "AAI/modelInvariantId/tenant";
+    public static final String AAI_MODEL_VNF = "AAI/modelInvariantId/vnf";
+    public static final String AAI_RESOURCE_SERVICE_INSTANCE = "AAI/resourceId/serviceInstanceId";
+    public static final String AAI_RESOURCE_VNF = "AAI/resourceId/modelInvariantId/vnf";
+    public static final String AAI_PNF = "AAI/pnf";
+    public static final String AAI_VSERVER_LINK = "AAI/vserver/link";
+
+    /*
+     * These are typically extracted from the event or from the event's enrichment data.
+     */
+    public static final String ENRICHMENT_BANDWIDTH = "enrichment/bandwidth";
+    public static final String ENRICHMENT_BANDWIDTH_CHANGE_TIME = "enrichment/bandwidth/changeTime";
+    public static final String ENRICHMENT_GENERIC_VNF_ID = "enrichment/genericVnf/id";
+    public static final String ENRICHMENT_NETWORK_ID = "enrichment/network/id";
+    public static final String ENRICHMENT_SERVICE_ID = "enrichment/service/id";
+    public static final String ENRICHMENT_SERVICE_INSTANCE_ID = "enrichment/serviceInstance/id";
+    public static final String ENRICHMENT_VNF_ID = "enrichment/vnf/id";
+    public static final String ENRICHMENT_VSERVER_ID = "enrichment/vserver/id";
+    public static final String ENRICHMENT_VSERVER_NAME = "enrichment/vserver/name";
+
+    public static final String EVENT_ADDITIONAL_PARAMS = "event/additionalParams";
+    public static final String EVENT_PAYLOAD = "event/payload";
+
+    /*
+     * These are data computed and/or tracked by the invoker.
+     */
+    public static final String DATA_VF_COUNT = "data/vfCount";
+
+
+    private OperationProperties() {
+        super();
+    }
+}
index 13231e6..a3f3a69 100644 (file)
@@ -76,10 +76,11 @@ public abstract class BidirectionalTopicOperation<Q, S> extends OperationPartial
      * @param params operation parameters
      * @param config configuration for this operation
      * @param clazz response class
+     * @param propertyNames names of properties required by this operation
      */
     public BidirectionalTopicOperation(ControlLoopOperationParams params, BidirectionalTopicConfig config,
-                    Class<S> clazz) {
-        super(params, config);
+                    Class<S> clazz, List<String> propertyNames) {
+        super(params, config, propertyNames);
         this.config = config;
         this.responseClass = clazz;
         this.forwarder = config.getForwarder();
index 4800b3a..09c876d 100644 (file)
@@ -21,6 +21,7 @@
 package org.onap.policy.controlloop.actorserviceprovider.impl;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.Executor;
@@ -90,9 +91,11 @@ public abstract class HttpOperation<T> extends OperationPartial {
      * @param params operation parameters
      * @param config configuration for this operation
      * @param clazz response class
+     * @param propertyNames names of properties required by this operation
      */
-    public HttpOperation(ControlLoopOperationParams params, HttpConfig config, Class<T> clazz) {
-        super(params, config);
+    public HttpOperation(ControlLoopOperationParams params, HttpConfig config, Class<T> clazz,
+                    List<String> propertyNames) {
+        super(params, config, propertyNames);
         this.config = config;
         this.responseClass = clazz;
     }
index b280216..060f7a6 100644 (file)
@@ -23,6 +23,7 @@ package org.onap.policy.controlloop.actorserviceprovider.impl;
 import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
@@ -103,17 +104,27 @@ public abstract class OperationPartial implements Operation {
     @Setter(AccessLevel.PROTECTED)
     private String subRequestId;
 
+    @Getter
+    private final List<String> propertyNames;
+
+    /**
+     * Values for the properties identified by {@link #getPropertyNames()}.
+     */
+    private final Map<String, Object> properties = new HashMap<>();
+
 
     /**
      * Constructs the object.
      *
      * @param params operation parameters
      * @param config configuration for this operation
+     * @param propertyNames names of properties required by this operation
      */
-    public OperationPartial(ControlLoopOperationParams params, OperatorConfig config) {
+    public OperationPartial(ControlLoopOperationParams params, OperatorConfig config, List<String> propertyNames) {
         this.params = params;
         this.config = config;
         this.fullName = params.getActor() + "." + params.getOperation();
+        this.propertyNames = propertyNames;
     }
 
     public Executor getBlockingExecutor() {
@@ -128,6 +139,27 @@ public abstract class OperationPartial implements Operation {
         return params.getOperation();
     }
 
+    /**
+     * Sets a property.
+     *
+     * @param name property name
+     * @param value new value
+     */
+    public void setProperty(String name, Object value) {
+        properties.put(name, value);
+    }
+
+    /**
+     * Gets a property's value.
+     *
+     * @param name name of the property of interest
+     * @return the property's value, or {@code null} if it has no value
+     */
+    @SuppressWarnings("unchecked")
+    public <T> T getProperty(String name) {
+        return (T) properties.get(name);
+    }
+
     @Override
     public CompletableFuture<OperationOutcome> start() {
         // allocate a controller for the entire operation
index 7fc15c9..f5dd498 100644 (file)
@@ -34,6 +34,7 @@ import org.onap.policy.common.parameters.BeanValidationResult;
 import org.onap.policy.common.parameters.BeanValidator;
 import org.onap.policy.common.parameters.annotations.NotNull;
 import org.onap.policy.controlloop.actorserviceprovider.ActorService;
+import org.onap.policy.controlloop.actorserviceprovider.Operation;
 import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome;
 import org.onap.policy.controlloop.actorserviceprovider.Util;
 import org.onap.policy.controlloop.actorserviceprovider.controlloop.ControlLoopEventContext;
@@ -88,6 +89,12 @@ public class ControlLoopOperationParams {
      */
     private Map<String, Object> payload;
 
+    /**
+     * {@code True} if the preprocessing steps have already been executed, {@code false}
+     * otherwise.
+     */
+    private boolean preprocessed;
+
     /**
      * Number of retries allowed, or {@code null} if no retries.
      */
@@ -137,6 +144,16 @@ public class ControlLoopOperationParams {
      * @throws IllegalArgumentException if the parameters are invalid
      */
     public CompletableFuture<OperationOutcome> start() {
+        return build().start();
+    }
+
+    /**
+     * Builds the specified operation.
+     *
+     * @return a new operation
+     * @throws IllegalArgumentException if the parameters are invalid
+     */
+    public Operation build() {
         BeanValidationResult result = validate();
         if (!result.isValid()) {
             logger.warn("parameter error in operation {}.{} for {}:\n{}", getActor(), getOperation(), getRequestId(),
@@ -148,8 +165,7 @@ public class ControlLoopOperationParams {
         return actorService
                     .getActor(getActor())
                     .getOperator(getOperation())
-                    .buildOperation(this)
-                    .start();
+                    .buildOperation(this);
         // @formatter:on
     }
 
index 3854fb2..110f84a 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.onap.policy.controlloop.actorserviceprovider.pipeline;
 
+import java.util.Collections;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ForkJoinPool;
 import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome;
@@ -38,7 +39,7 @@ public class PipelineUtil extends OperationPartial {
      * @param params utility parameters
      */
     public PipelineUtil(ControlLoopOperationParams params) {
-        super(params, new OperatorConfig(ForkJoinPool.commonPool()));
+        super(params, new OperatorConfig(ForkJoinPool.commonPool()), Collections.emptyList());
     }
 
     @Override
index b62eae8..e28ddeb 100644 (file)
@@ -35,6 +35,7 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.CompletableFuture;
 import java.util.function.BiConsumer;
@@ -363,7 +364,7 @@ public class BidirectionalTopicOperationTest {
     private class MyStringOperation extends BidirectionalTopicOperation<String, String> {
 
         public MyStringOperation() {
-            super(BidirectionalTopicOperationTest.this.params, config, String.class);
+            super(BidirectionalTopicOperationTest.this.params, config, String.class, Collections.emptyList());
         }
 
         @Override
@@ -385,7 +386,8 @@ public class BidirectionalTopicOperationTest {
 
     private class MyScoOperation extends BidirectionalTopicOperation<MyRequest, StandardCoderObject> {
         public MyScoOperation() {
-            super(BidirectionalTopicOperationTest.this.params, config, StandardCoderObject.class);
+            super(BidirectionalTopicOperationTest.this.params, config, StandardCoderObject.class,
+                            Collections.emptyList());
         }
 
         @Override
@@ -407,7 +409,7 @@ public class BidirectionalTopicOperationTest {
 
     private class MyOperation extends BidirectionalTopicOperation<MyRequest, MyResponse> {
         public MyOperation() {
-            super(BidirectionalTopicOperationTest.this.params, config, MyResponse.class);
+            super(BidirectionalTopicOperationTest.this.params, config, MyResponse.class, Collections.emptyList());
         }
 
         @Override
index 1b3485d..33e5303 100644 (file)
@@ -502,7 +502,7 @@ public class HttpOperationTest {
 
     private class MyGetOperation<T> extends HttpOperation<T> {
         public MyGetOperation(Class<T> responseClass) {
-            super(HttpOperationTest.this.params, HttpOperationTest.this.config, responseClass);
+            super(HttpOperationTest.this.params, HttpOperationTest.this.config, responseClass, Collections.emptyList());
         }
 
         @Override
@@ -523,7 +523,8 @@ public class HttpOperationTest {
 
     private class MyPostOperation extends HttpOperation<MyResponse> {
         public MyPostOperation() {
-            super(HttpOperationTest.this.params, HttpOperationTest.this.config, MyResponse.class);
+            super(HttpOperationTest.this.params, HttpOperationTest.this.config, MyResponse.class,
+                            Collections.emptyList());
         }
 
         @Override
@@ -550,7 +551,8 @@ public class HttpOperationTest {
 
     private class MyPutOperation extends HttpOperation<MyResponse> {
         public MyPutOperation() {
-            super(HttpOperationTest.this.params, HttpOperationTest.this.config, MyResponse.class);
+            super(HttpOperationTest.this.params, HttpOperationTest.this.config, MyResponse.class,
+                            Collections.emptyList());
         }
 
         @Override
@@ -577,7 +579,7 @@ public class HttpOperationTest {
 
     private class MyDeleteOperation extends HttpOperation<String> {
         public MyDeleteOperation() {
-            super(HttpOperationTest.this.params, HttpOperationTest.this.config, String.class);
+            super(HttpOperationTest.this.params, HttpOperationTest.this.config, String.class, Collections.emptyList());
         }
 
         @Override
index f85ef30..5ae804a 100644 (file)
@@ -28,6 +28,7 @@ import static org.junit.Assert.assertNotSame;
 import static org.junit.Assert.assertNull;
 import static org.mockito.Mockito.when;
 
+import java.util.Collections;
 import java.util.Map;
 import java.util.concurrent.CompletableFuture;
 import org.junit.Before;
@@ -157,7 +158,7 @@ public class HttpOperatorTest {
 
     private class MyOperation extends HttpOperation<String> {
         public MyOperation(ControlLoopOperationParams params, HttpConfig config) {
-            super(params, config, String.class);
+            super(params, config, String.class, Collections.emptyList());
         }
 
         @Override
index ed5ba9b..7809646 100644 (file)
@@ -31,6 +31,7 @@ import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import java.util.Collections;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ForkJoinPool;
 import java.util.concurrent.TimeUnit;
@@ -196,7 +197,7 @@ public class HttpPollingOperationTest {
     @Test
     public void testDetmStatus() {
         // make an operation that does NOT override detmStatus()
-        oper = new HttpOperation<String>(params, config, String.class) {};
+        oper = new HttpOperation<String>(params, config, String.class, Collections.emptyList()) {};
 
         assertThatThrownBy(() -> oper.detmStatus(rawResponse, response))
                         .isInstanceOf(UnsupportedOperationException.class);
@@ -230,7 +231,7 @@ public class HttpPollingOperationTest {
     private static class MyOper extends HttpOperation<String> {
 
         public MyOper(ControlLoopOperationParams params, HttpConfig config) {
-            super(params, config, String.class);
+            super(params, config, String.class, Collections.emptyList());
 
             setUsePolling();
         }
index 2a22b4b..413667b 100644 (file)
@@ -26,6 +26,7 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.when;
 
+import java.util.Collections;
 import java.util.Map;
 import org.junit.Before;
 import org.junit.Test;
@@ -111,7 +112,7 @@ public class HttpPollingOperatorTest {
 
     private static class MyOperation extends HttpOperation<String> {
         public MyOperation(ControlLoopOperationParams params, HttpConfig config) {
-            super(params, config, String.class);
+            super(params, config, String.class, Collections.emptyList());
         }
     }
 }
index e2ed2d9..9bbc528 100644 (file)
@@ -36,6 +36,7 @@ import ch.qos.logback.classic.Logger;
 import java.time.Instant;
 import java.util.ArrayDeque;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.Deque;
 import java.util.LinkedList;
 import java.util.List;
@@ -106,6 +107,8 @@ public class OperationPartialTest {
     private static final Logger logger = (Logger) LoggerFactory.getLogger(OperationPartial.class);
     private static final ExtractAppender appender = new ExtractAppender();
 
+    private static final List<String> PROP_NAMES = List.of("hello", "world");
+
     @Mock
     private ActorService service;
     @Mock
@@ -216,6 +219,22 @@ public class OperationPartialTest {
         assertNull(future.get(5, TimeUnit.SECONDS));
     }
 
+    @Test
+    public void testGetPropertyNames() {
+        assertThat(oper.getPropertyNames()).isEqualTo(PROP_NAMES);
+    }
+
+    @Test
+    public void testGetProperty_testSetProperty() {
+        oper.setProperty("propertyA", "valueA");
+        oper.setProperty("propertyB", "valueB");
+        oper.setProperty("propertyC", 20);
+
+        assertEquals("valueA", oper.getProperty("propertyA"));
+        assertEquals("valueB", oper.getProperty("propertyB"));
+        assertEquals(Integer.valueOf(20), oper.getProperty("propertyC"));
+    }
+
     @Test
     public void testStart() {
         verifyRun("testStart", 1, 1, PolicyResult.SUCCESS);
@@ -406,7 +425,7 @@ public class OperationPartialTest {
         /*
          * Use an operation that doesn't override doOperation().
          */
-        OperationPartial oper2 = new OperationPartial(params, config) {};
+        OperationPartial oper2 = new OperationPartial(params, config, Collections.emptyList()) {};
 
         oper2.start();
         assertTrue(executor.runAll(MAX_REQUESTS));
@@ -1118,7 +1137,7 @@ public class OperationPartialTest {
     @Test
     public void testGetRetryWait() {
         // need an operator that doesn't override the retry time
-        OperationPartial oper2 = new OperationPartial(params, config) {};
+        OperationPartial oper2 = new OperationPartial(params, config, Collections.emptyList()) {};
         assertEquals(OperationPartial.DEFAULT_RETRY_WAIT_MS, oper2.getRetryWaitMs());
     }
 
@@ -1290,7 +1309,7 @@ public class OperationPartialTest {
 
 
         public MyOper() {
-            super(OperationPartialTest.this.params, config);
+            super(OperationPartialTest.this.params, config, PROP_NAMES);
         }
 
         @Override
index e4c8304..98ca673 100644 (file)
@@ -126,7 +126,7 @@ public class ControlLoopOperationParamsTest {
         params = ControlLoopOperationParams.builder().actorService(actorService).completeCallback(completer)
                         .context(context).executor(executor).actor(ACTOR).operation(OPERATION).payload(payload)
                         .retry(RETRY).target(TARGET).targetEntity(TARGET_ENTITY).timeoutSec(TIMEOUT)
-                        .startCallback(starter).build();
+                        .startCallback(starter).preprocessed(true).build();
 
         outcome = params.makeOutcome();
     }
@@ -138,6 +138,13 @@ public class ControlLoopOperationParamsTest {
         assertThatIllegalArgumentException().isThrownBy(() -> params.toBuilder().context(null).build().start());
     }
 
+    @Test
+    public void testBuild() {
+        assertSame(operation, params.build());
+
+        assertThatIllegalArgumentException().isThrownBy(() -> params.toBuilder().context(null).build().build());
+    }
+
     @Test
     public void testGetRequestId() {
         assertSame(REQ_ID, params.getRequestId());
@@ -291,6 +298,14 @@ public class ControlLoopOperationParamsTest {
         assertNull(ControlLoopOperationParams.builder().build().getPayload());
     }
 
+    @Test
+    public void test() {
+        assertTrue(params.isPreprocessed());
+
+        // should be false when unspecified
+        assertFalse(ControlLoopOperationParams.builder().build().isPreprocessed());
+    }
+
     @Test
     public void testGetRetry() {
         assertSame(RETRY, params.getRetry());