Default ActorImpl should have an "operations" property 27/109027/4
authorJim Hahn <jrh3@att.com>
Wed, 10 Jun 2020 19:44:29 +0000 (15:44 -0400)
committerJim Hahn <jrh3@att.com>
Thu, 11 Jun 2020 16:28:45 +0000 (12:28 -0400)
Added "operations" level to actor properties.  Also renamed CommonActorParams
to ActorParams, in the process.

Note: This impacts the properties specified in drools-apps.

Issue-ID: POLICY-2629
Change-Id: I155bcb6ced73cb54e656d34e0b184fb2ed6250d1
Signed-off-by: Jim Hahn <jrh3@att.com>
16 files changed:
models-interactions/model-actors/actor.cds/src/test/resources/service.yaml
models-interactions/model-actors/actor.guard/src/test/java/org/onap/policy/controlloop/actor/guard/GuardActorParamsTest.java
models-interactions/model-actors/actor.so/src/test/java/org/onap/policy/controlloop/actor/so/SoActorParamsTest.java
models-interactions/model-actors/actor.test/src/test/resources/service.yaml
models-interactions/model-actors/actor.test/src/test/resources/serviceFull.yaml
models-interactions/model-actors/actor.test/src/test/resources/serviceInvalidHttp.yaml
models-interactions/model-actors/actor.vfc/src/test/resources/service.yaml
models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/impl/ActorImpl.java
models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/parameters/ActorParams.java [moved from models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/parameters/CommonActorParams.java with 97% similarity]
models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/parameters/BidirectionalTopicActorParams.java
models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/parameters/HttpActorParams.java
models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/ActorServiceTest.java
models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/impl/ActorImplTest.java
models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/parameters/ActorParamsTest.java [moved from models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/parameters/CommonActorParamsTest.java with 87% similarity]
models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/parameters/BidirectionalTopicActorParamsTest.java
models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/parameters/HttpActorParamsTest.java

index 0d3c76f..19ff698 100644 (file)
 #
 actors:
   CDS:
-    any:
-      timeout: 10
-      port: 6700
-      host: my-host
-      username: my-user
-      password: my-pass
+    operations:
+      any:
+        timeout: 10
+        port: 6700
+        host: my-host
+        username: my-user
+        password: my-pass
index 0fef3bd..71c75b8 100644 (file)
@@ -32,7 +32,7 @@ import org.junit.Before;
 import org.junit.Test;
 import org.onap.policy.common.parameters.ValidationResult;
 import org.onap.policy.controlloop.actorserviceprovider.Util;
-import org.onap.policy.controlloop.actorserviceprovider.parameters.CommonActorParams;
+import org.onap.policy.controlloop.actorserviceprovider.parameters.ActorParams;
 
 public class GuardActorParamsTest {
     private static final String CONTAINER = "my-container";
@@ -75,14 +75,14 @@ public class GuardActorParamsTest {
         assertTrue(params.validate(CONTAINER).isValid());
 
         // only a few fields are required
-        GuardActorParams sparse = Util.translate(CONTAINER, Map.of(CommonActorParams.OPERATIONS_FIELD, operations),
+        GuardActorParams sparse = Util.translate(CONTAINER, Map.of(ActorParams.OPERATIONS_FIELD, operations),
                         GuardActorParams.class);
         assertTrue(sparse.validate(CONTAINER).isValid());
 
         assertEquals(GuardActorParams.DEFAULT_ACTION, sparse.getAction());
 
         // check fields from superclass
-        testValidateField(CommonActorParams.OPERATIONS_FIELD, "null", params2 -> params2.setOperations(null));
+        testValidateField(ActorParams.OPERATIONS_FIELD, "null", params2 -> params2.setOperations(null));
         testValidateField("timeoutSec", "minimum", params2 -> params2.setTimeoutSec(-1));
     }
 
index 5fb6472..93f3055 100644 (file)
@@ -31,7 +31,7 @@ import org.junit.Before;
 import org.junit.Test;
 import org.onap.policy.common.parameters.ValidationResult;
 import org.onap.policy.controlloop.actorserviceprovider.Util;
-import org.onap.policy.controlloop.actorserviceprovider.parameters.CommonActorParams;
+import org.onap.policy.controlloop.actorserviceprovider.parameters.ActorParams;
 
 
 public class SoActorParamsTest {
@@ -68,7 +68,7 @@ public class SoActorParamsTest {
         assertTrue(params.validate(CONTAINER).isValid());
 
         // only a few fields are required
-        SoActorParams sparse = Util.translate(CONTAINER, Map.of(CommonActorParams.OPERATIONS_FIELD, operations),
+        SoActorParams sparse = Util.translate(CONTAINER, Map.of(ActorParams.OPERATIONS_FIELD, operations),
                         SoActorParams.class);
         assertTrue(sparse.validate(CONTAINER).isValid());
 
@@ -76,7 +76,7 @@ public class SoActorParamsTest {
         testValidateField("waitSecGet", "minimum", params2 -> params2.setWaitSecGet(0));
 
         // check fields from superclass
-        testValidateField(CommonActorParams.OPERATIONS_FIELD, "null", params2 -> params2.setOperations(null));
+        testValidateField(ActorParams.OPERATIONS_FIELD, "null", params2 -> params2.setOperations(null));
         testValidateField("timeoutSec", "minimum", params2 -> params2.setTimeoutSec(-1));
 
         // check edge cases
index 49de7da..1d16040 100644 (file)
@@ -19,5 +19,6 @@
 #
 actors:
   MyActor:
-    MyOperationA: {}
-    MyOperationB: {}
\ No newline at end of file
+    operations:
+      MyOperationA: {}
+      MyOperationB: {}
index 9818215..8c6271e 100644 (file)
@@ -38,5 +38,6 @@ topics:
     managed: true
 actors:
   MyActor:
-    MyOperationA: {}
-    MyOperationB: {}
\ No newline at end of file
+    operations:
+      MyOperationA: {}
+      MyOperationB: {}
index b31e8e8..4161268 100644 (file)
@@ -25,5 +25,6 @@ httpClients:
   managed: true
 actors:
   MyActor:
-    MyOperationA: {}
-    MyOperationB: {}
\ No newline at end of file
+    operations:
+      MyOperationA: {}
+      MyOperationB: {}
index 26192e0..f698851 100644 (file)
@@ -25,7 +25,8 @@ httpClients:
   managed: true
 actors:
   VFC:
-    Restart:
+    operations:
+      Restart:
         clientName: my-client
         pathGet: jobs
         maxGets: 20
index 6113f93..c3c815e 100644 (file)
@@ -29,6 +29,7 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Function;
 import org.onap.policy.controlloop.actorserviceprovider.Operator;
 import org.onap.policy.controlloop.actorserviceprovider.Util;
+import org.onap.policy.controlloop.actorserviceprovider.parameters.ActorParams;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.ParameterValidationRuntimeException;
 import org.onap.policy.controlloop.actorserviceprovider.spi.Actor;
 import org.slf4j.Logger;
@@ -156,7 +157,8 @@ public class ActorImpl extends StartConfigPartial<Map<String, Object>> implement
 
     /**
      * Extracts the operator parameters from the actor parameters, for a given operator.
-     * This method assumes each operation has its own set of parameters.
+     * This method translates the parameters to an {@link ActorParams} and then creates a function
+     * that will extract operator-specific parameters.
      *
      * @param actorParameters actor parameters
      * @return a function to extract the operator parameters from the actor parameters.
@@ -164,8 +166,13 @@ public class ActorImpl extends StartConfigPartial<Map<String, Object>> implement
      *         the given operation name
      */
     protected Function<String, Map<String, Object>> makeOperatorParameters(Map<String, Object> actorParameters) {
+        String actorName = getName();
 
-        return operName -> Util.translateToMap(getName() + "." + operName, actorParameters.get(operName));
+        // @formatter:off
+        return Util.translate(actorName, actorParameters, ActorParams.class)
+                        .doValidation(actorName)
+                        .makeOperationParameters(actorName);
+        // @formatter:on
     }
 
     /**
@@ -38,7 +38,7 @@ import org.onap.policy.controlloop.actorserviceprovider.Util;
 @Getter
 @Setter
 @EqualsAndHashCode
-public class CommonActorParams {
+public class ActorParams {
     /**
      * Name of the "operations" field contained within actor parameters.
      */
@@ -84,7 +84,7 @@ public class CommonActorParams {
      * @return "this"
      * @throws IllegalArgumentException if the parameters are invalid
      */
-    public CommonActorParams doValidation(String name) {
+    public ActorParams doValidation(String name) {
         ValidationResult result = validate(name);
         if (!result.isValid()) {
             throw new ParameterValidationRuntimeException("invalid parameters", result);
index d589e1d..616f674 100644 (file)
@@ -31,7 +31,7 @@ import org.onap.policy.common.parameters.annotations.Min;
 @Getter
 @Setter
 @EqualsAndHashCode(callSuper = true)
-public class HttpActorParams extends CommonActorParams {
+public class HttpActorParams extends ActorParams {
 
     /*
      * Optional, default values that are used if missing from the operation-specific
index 0f282f6..97f6bba 100644 (file)
@@ -36,6 +36,7 @@ import static org.mockito.Mockito.when;
 
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.TreeMap;
@@ -46,6 +47,7 @@ import org.junit.Test;
 import org.onap.policy.common.parameters.ObjectValidationResult;
 import org.onap.policy.common.parameters.ValidationStatus;
 import org.onap.policy.controlloop.actorserviceprovider.impl.ActorImpl;
+import org.onap.policy.controlloop.actorserviceprovider.parameters.ActorParams;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.ParameterValidationRuntimeException;
 import org.onap.policy.controlloop.actorserviceprovider.spi.Actor;
 
@@ -80,10 +82,10 @@ public class ActorServiceTest {
         actor3 = spy(new ActorImpl(ACTOR3));
         actor4 = spy(new ActorImpl(ACTOR4));
 
-        sub1 = Map.of("sub A", "value A");
-        sub2 = Map.of("sub B", "value B");
-        sub3 = Map.of("sub C", "value C");
-        sub4 = Map.of("sub D", "value D");
+        sub1 = Map.of("sub A", "value A", ActorParams.OPERATIONS_FIELD, Collections.emptyMap());
+        sub2 = Map.of("sub B", "value B", ActorParams.OPERATIONS_FIELD, Collections.emptyMap());
+        sub3 = Map.of("sub C", "value C", ActorParams.OPERATIONS_FIELD, Collections.emptyMap());
+        sub4 = Map.of("sub D", "value D", ActorParams.OPERATIONS_FIELD, Collections.emptyMap());
 
         params = Map.of(ACTOR1, sub1, ACTOR2, sub2, ACTOR3, sub3, ACTOR4, sub4);
 
index 681378d..cf07d3b 100644 (file)
@@ -36,7 +36,6 @@ import static org.mockito.Mockito.when;
 
 import java.util.Iterator;
 import java.util.Map;
-import java.util.TreeMap;
 import java.util.stream.Collectors;
 import org.junit.Before;
 import org.junit.Test;
@@ -44,6 +43,7 @@ import org.onap.policy.common.parameters.ObjectValidationResult;
 import org.onap.policy.common.parameters.ValidationStatus;
 import org.onap.policy.controlloop.actorserviceprovider.Operation;
 import org.onap.policy.controlloop.actorserviceprovider.Operator;
+import org.onap.policy.controlloop.actorserviceprovider.parameters.ActorParams;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams;
 import org.onap.policy.controlloop.actorserviceprovider.parameters.ParameterValidationRuntimeException;
 
@@ -84,7 +84,7 @@ public class ActorImplTest {
         sub3 = Map.of("sub C", "value C");
         sub4 = Map.of("sub D", "value D");
 
-        params = Map.of(OPER1, sub1, OPER2, sub2, OPER3, sub3, OPER4, sub4);
+        params = Map.of(ActorParams.OPERATIONS_FIELD, Map.of(OPER1, sub1, OPER2, sub2, OPER3, sub3, OPER4, sub4));
 
         actor = makeActor(oper1, oper2, oper3, oper4);
     }
@@ -285,15 +285,12 @@ public class ActorImplTest {
      */
     @Test
     public void testDoConfigureConfigure() {
-        // need mutable parameters
-        params = new TreeMap<>(params);
-
         // configure one operator
         oper1.configure(sub1);
 
         // configure another and remove its parameters
         oper2.configure(sub2);
-        params.remove(OPER2);
+        params = Map.of(ActorParams.OPERATIONS_FIELD, Map.of(OPER1, sub1, OPER3, sub3, OPER4, sub4));
 
         // create a new, unconfigured actor
         Operator oper5 = spy(new MyOper("UNCONFIGURED"));
@@ -39,7 +39,7 @@ import org.junit.Test;
 import org.onap.policy.common.parameters.ValidationResult;
 import org.onap.policy.controlloop.actorserviceprovider.Util;
 
-public class CommonActorParamsTest {
+public class ActorParamsTest {
 
     private static final String CONTAINER = "my-container";
 
@@ -52,7 +52,7 @@ public class CommonActorParamsTest {
     private static final String TEXT2B = "bye";
 
     private Map<String, Map<String, Object>> operations;
-    private CommonActorParams params;
+    private ActorParams params;
 
     /**
      * Initializes {@link #operations} with two items and {@link params} with a fully
@@ -64,7 +64,7 @@ public class CommonActorParamsTest {
         operations.put(PATH1, Map.of("path", URI1));
         operations.put(PATH2, Map.of("path", URI2, "text2", TEXT2B));
 
-        params = makeCommonActorParams();
+        params = makeActorParams();
     }
 
     @Test
@@ -96,29 +96,29 @@ public class CommonActorParamsTest {
         assertTrue(params.validate(CONTAINER).isValid());
 
         // only a few fields are required
-        CommonActorParams sparse = Util.translate(CONTAINER,
-                        Map.of(CommonActorParams.OPERATIONS_FIELD, operations, "timeoutSec", 1),
-                        CommonActorParams.class);
+        ActorParams sparse = Util.translate(CONTAINER,
+                        Map.of(ActorParams.OPERATIONS_FIELD, operations, "timeoutSec", 1),
+                        ActorParams.class);
         assertTrue(sparse.validate(CONTAINER).isValid());
 
-        testValidateField(CommonActorParams.OPERATIONS_FIELD, "null", params2 -> params2.setOperations(null));
+        testValidateField(ActorParams.OPERATIONS_FIELD, "null", params2 -> params2.setOperations(null));
     }
 
-    private void testValidateField(String fieldName, String expected, Consumer<CommonActorParams> makeInvalid) {
+    private void testValidateField(String fieldName, String expected, Consumer<ActorParams> makeInvalid) {
 
         // original params should be valid
         ValidationResult result = params.validate(CONTAINER);
         assertTrue(fieldName, result.isValid());
 
         // make invalid params
-        CommonActorParams params2 = makeCommonActorParams();
+        ActorParams params2 = makeActorParams();
         makeInvalid.accept(params2);
         result = params2.validate(CONTAINER);
         assertFalse(fieldName, result.isValid());
         assertThat(result.getResult()).contains(CONTAINER).contains(fieldName).contains(expected);
     }
 
-    private CommonActorParams makeCommonActorParams() {
+    private ActorParams makeActorParams() {
         MyParams params2 = new MyParams();
         params2.setOperations(operations);
         params2.setText1(TEXT1);
@@ -128,7 +128,7 @@ public class CommonActorParamsTest {
     }
 
     @Setter
-    public static class MyParams extends CommonActorParams {
+    public static class MyParams extends ActorParams {
         @SuppressWarnings("unused")
         private String text1;
 
index 1276950..769e0fc 100644 (file)
@@ -77,11 +77,11 @@ public class BidirectionalTopicActorParamsTest {
 
         // only a few fields are required
         BidirectionalTopicActorParams sparse =
-                        Util.translate(CONTAINER, Map.of(CommonActorParams.OPERATIONS_FIELD, operMap, "timeoutSec", 1),
+                        Util.translate(CONTAINER, Map.of(ActorParams.OPERATIONS_FIELD, operMap, "timeoutSec", 1),
                                         BidirectionalTopicActorParams.class);
         assertTrue(sparse.validate(CONTAINER).isValid());
 
-        testValidateField(CommonActorParams.OPERATIONS_FIELD, "null", params2 -> params2.setOperations(null));
+        testValidateField(ActorParams.OPERATIONS_FIELD, "null", params2 -> params2.setOperations(null));
         testValidateField("timeoutSec", "minimum", params2 -> params2.setTimeoutSec(-1));
 
         // check edge cases
index 99bf633..5812b04 100644 (file)
@@ -65,10 +65,10 @@ public class HttpActorParamsTest {
 
         // only a few fields are required
         HttpActorParams sparse = Util.translate(CONTAINER,
-                        Map.of(CommonActorParams.OPERATIONS_FIELD, operations, "timeoutSec", 1), HttpActorParams.class);
+                        Map.of(ActorParams.OPERATIONS_FIELD, operations, "timeoutSec", 1), HttpActorParams.class);
         assertTrue(sparse.validate(CONTAINER).isValid());
 
-        testValidateField(CommonActorParams.OPERATIONS_FIELD, "null", params2 -> params2.setOperations(null));
+        testValidateField(ActorParams.OPERATIONS_FIELD, "null", params2 -> params2.setOperations(null));
         testValidateField("timeoutSec", "minimum", params2 -> params2.setTimeoutSec(-1));
 
         // check edge cases