diff options
author | Jim Hahn <jrh3@att.com> | 2020-08-21 13:43:08 -0400 |
---|---|---|
committer | Jim Hahn <jrh3@att.com> | 2020-10-27 14:55:15 -0400 |
commit | 19ef8b24a98c09a349e6ae7309f535a0135463f6 (patch) | |
tree | d988e5a58865ae6f3a38dcb31e4f195f18e59946 /models-interactions/model-actors/actor.appc | |
parent | 6b29d2c19e288148171db0c0e446e18dcd46effd (diff) |
Make Actors event-agnostic
Removed event and event-context code from the Actor code. Also removed
the preprocessing steps from the Actor code, giving the application
complete control over any preprocessing.
Also fixed a bug wherein the APPC actor was treating the
AAI_RESOURCE_VNF property as a String instead of as a GenericVnf.
Issue-ID: POLICY-2746-actor
Change-Id: Ibc05fe39ffedc0bc461abf10e6a960861ac70119
Signed-off-by: Jim Hahn <jrh3@att.com>
Diffstat (limited to 'models-interactions/model-actors/actor.appc')
5 files changed, 19 insertions, 205 deletions
diff --git a/models-interactions/model-actors/actor.appc/src/main/java/org/onap/policy/controlloop/actor/appc/AppcOperation.java b/models-interactions/model-actors/actor.appc/src/main/java/org/onap/policy/controlloop/actor/appc/AppcOperation.java index 70c70823c..89d5c4f2f 100644 --- a/models-interactions/model-actors/actor.appc/src/main/java/org/onap/policy/controlloop/actor/appc/AppcOperation.java +++ b/models-interactions/model-actors/actor.appc/src/main/java/org/onap/policy/controlloop/actor/appc/AppcOperation.java @@ -23,7 +23,7 @@ package org.onap.policy.controlloop.actor.appc; import java.util.List; import java.util.Map; import java.util.Map.Entry; -import java.util.concurrent.CompletableFuture; +import org.onap.aai.domain.yang.GenericVnf; import org.onap.policy.appc.CommonHeader; import org.onap.policy.appc.Request; import org.onap.policy.appc.Response; @@ -71,14 +71,6 @@ public abstract class AppcOperation extends BidirectionalTopicOperation<Request, } /** - * Starts the GUARD. - */ - @Override - protected CompletableFuture<OperationOutcome> startPreprocessorAsync() { - return startGuardAsync(); - } - - /** * Makes a request, given the target VNF. This is a support function for * {@link #makeRequest(int)}. * @@ -86,7 +78,7 @@ public abstract class AppcOperation extends BidirectionalTopicOperation<Request, * @param targetVnf target VNF * @return a new request */ - protected Request makeRequest(int attempt, String targetVnf) { + protected Request makeRequest(int attempt, GenericVnf targetVnf) { Request request = new Request(); request.setCommonHeader(new CommonHeader()); request.getCommonHeader().setRequestId(params.getRequestId()); @@ -102,7 +94,7 @@ public abstract class AppcOperation extends BidirectionalTopicOperation<Request, } // add/replace specific values - request.getPayload().put(VNF_ID_KEY, targetVnf); + request.getPayload().put(VNF_ID_KEY, targetVnf.getVnfId()); return request; } diff --git a/models-interactions/model-actors/actor.appc/src/main/java/org/onap/policy/controlloop/actor/appc/ModifyConfigOperation.java b/models-interactions/model-actors/actor.appc/src/main/java/org/onap/policy/controlloop/actor/appc/ModifyConfigOperation.java index 1f5b9fd10..524c797b6 100644 --- a/models-interactions/model-actors/actor.appc/src/main/java/org/onap/policy/controlloop/actor/appc/ModifyConfigOperation.java +++ b/models-interactions/model-actors/actor.appc/src/main/java/org/onap/policy/controlloop/actor/appc/ModifyConfigOperation.java @@ -21,21 +21,12 @@ 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; -import org.slf4j.LoggerFactory; public class ModifyConfigOperation extends AppcOperation { - private static final Logger logger = LoggerFactory.getLogger(ModifyConfigOperation.class); - public static final String NAME = "ModifyConfig"; private static final List<String> PROPERTY_NAMES = List.of(OperationProperties.AAI_RESOURCE_VNF); @@ -50,46 +41,8 @@ public class ModifyConfigOperation extends AppcOperation { super(params, config, PROPERTY_NAMES); } - /** - * Ensures that A&AI customer query has been performed, and then runs the guard query. - */ - @Override - @SuppressWarnings("unchecked") - protected CompletableFuture<OperationOutcome> startPreprocessorAsync() { - if (params.isPreprocessed()) { - return null; - } - - ControlLoopOperationParams cqParams = params.toBuilder().actor(AaiConstants.ACTOR_NAME) - .operation(AaiCqResponse.OPERATION).payload(null).retry(null).timeoutSec(null).build(); - - // run Custom Query and Guard, in parallel - return allOf(() -> params.getContext().obtain(AaiCqResponse.CONTEXT_KEY, cqParams), this::startGuardAsync); - } - @Override protected Request makeRequest(int attempt) { - return makeRequest(attempt, getVnfId()); - } - - protected String getVnfId() { - GenericVnf vnf = this.getProperty(OperationProperties.AAI_RESOURCE_VNF); - if (vnf != null) { - return vnf.getVnfId(); - } - - AaiCqResponse cq = params.getContext().getProperty(AaiCqResponse.CONTEXT_KEY); - if (cq == null) { - throw new IllegalStateException("target vnf-id could not be determined"); - } - - GenericVnf genvnf = cq.getGenericVnfByModelInvariantId(params.getTargetEntityIds() - .get(ControlLoopOperationParams.PARAMS_ENTITY_RESOURCEID)); - if (genvnf == null) { - logger.info("{}: target entity could not be found for {}", getFullName(), params.getRequestId()); - throw new IllegalArgumentException("target vnf-id could not be found"); - } - - return genvnf.getVnfId(); + return makeRequest(attempt, getRequiredProperty(OperationProperties.AAI_RESOURCE_VNF, "resource VNF")); } } diff --git a/models-interactions/model-actors/actor.appc/src/test/java/org/onap/policy/controlloop/actor/appc/AppcOperationTest.java b/models-interactions/model-actors/actor.appc/src/test/java/org/onap/policy/controlloop/actor/appc/AppcOperationTest.java index db104b6bb..72e9065fc 100644 --- a/models-interactions/model-actors/actor.appc/src/test/java/org/onap/policy/controlloop/actor/appc/AppcOperationTest.java +++ b/models-interactions/model-actors/actor.appc/src/test/java/org/onap/policy/controlloop/actor/appc/AppcOperationTest.java @@ -23,7 +23,6 @@ package org.onap.policy.controlloop.actor.appc; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import java.util.Arrays; @@ -82,26 +81,12 @@ public class AppcOperationTest extends BasicAppcOperation { } @Test - public void testStartPreprocessorAsync() { - assertNotNull(oper.startPreprocessorAsync()); - } - - /** - * Tests startPreprocessorAsync(), when preprocessing is disabled. - */ - @Test - public void testStartPreprocessorAsyncDisabled() { - params = params.toBuilder().preprocessed(true).build(); - assertNull(new MyOper(params, config).startPreprocessorAsync()); - } - - @Test public void testMakeRequest() { oper.generateSubRequestId(2); String subreq = oper.getSubRequestId(); assertNotNull(subreq); - Request request = oper.makeRequest(2, MY_VNF); + Request request = oper.makeRequest(2, genvnf); assertEquals(DEFAULT_OPERATION, request.getAction()); assertNotNull(request.getPayload()); @@ -112,18 +97,18 @@ public class AppcOperationTest extends BasicAppcOperation { assertEquals(subreq, header.getSubRequestId()); - request = oper.makeRequest(2, MY_VNF); + request = oper.makeRequest(2, genvnf); assertEquals(subreq, request.getCommonHeader().getSubRequestId()); // repeat using a null payload params = params.toBuilder().payload(null).build(); oper = new MyOper(params, config); - assertEquals(Map.of(AppcOperation.VNF_ID_KEY, MY_VNF), oper.makeRequest(2, MY_VNF).getPayload()); + assertEquals(Map.of(AppcOperation.VNF_ID_KEY, MY_VNF), oper.makeRequest(2, genvnf).getPayload()); } @Test public void testConvertPayload() { - Request request = oper.makeRequest(2, MY_VNF); + Request request = oper.makeRequest(2, genvnf); // @formatter:off assertEquals( @@ -143,7 +128,7 @@ public class AppcOperationTest extends BasicAppcOperation { params = params.toBuilder().payload(payload).build(); oper = new MyOper(params, config); - request = oper.makeRequest(2, MY_VNF); + request = oper.makeRequest(2, genvnf); // @formatter:off assertEquals( @@ -164,7 +149,7 @@ public class AppcOperationTest extends BasicAppcOperation { params = params.toBuilder().payload(payload).build(); oper = new MyOper(params, config); - request = oper.makeRequest(2, MY_VNF); + request = oper.makeRequest(2, genvnf); payload.put(AppcOperation.VNF_ID_KEY, MY_VNF); payload.put(KEY1, "abc"); @@ -177,7 +162,7 @@ public class AppcOperationTest extends BasicAppcOperation { @Test public void testGetExpectedKeyValues() { oper.generateSubRequestId(2); - Request request = oper.makeRequest(2, MY_VNF); + Request request = oper.makeRequest(2, genvnf); assertEquals(Arrays.asList(request.getCommonHeader().getSubRequestId()), oper.getExpectedKeyValues(50, request)); } @@ -242,7 +227,7 @@ public class AppcOperationTest extends BasicAppcOperation { } } - private static class MyOper extends AppcOperation { + private class MyOper extends AppcOperation { public MyOper(ControlLoopOperationParams params, BidirectionalTopicConfig config) { super(params, config, Collections.emptyList()); @@ -250,7 +235,7 @@ public class AppcOperationTest extends BasicAppcOperation { @Override protected Request makeRequest(int attempt) { - return makeRequest(attempt, MY_VNF); + return makeRequest(attempt, genvnf); } } } diff --git a/models-interactions/model-actors/actor.appc/src/test/java/org/onap/policy/controlloop/actor/appc/BasicAppcOperation.java b/models-interactions/model-actors/actor.appc/src/test/java/org/onap/policy/controlloop/actor/appc/BasicAppcOperation.java index 9d434cebf..aed2431e6 100644 --- a/models-interactions/model-actors/actor.appc/src/test/java/org/onap/policy/controlloop/actor/appc/BasicAppcOperation.java +++ b/models-interactions/model-actors/actor.appc/src/test/java/org/onap/policy/controlloop/actor/appc/BasicAppcOperation.java @@ -20,7 +20,6 @@ package org.onap.policy.controlloop.actor.appc; -import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -32,6 +31,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; import java.util.function.BiConsumer; +import org.onap.aai.domain.yang.GenericVnf; import org.onap.policy.appc.Request; import org.onap.policy.appc.Response; import org.onap.policy.appc.ResponseCode; @@ -44,12 +44,9 @@ import org.onap.policy.controlloop.actor.test.BasicBidirectionalTopicOperation; import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome; import org.onap.policy.controlloop.actorserviceprovider.OperationResult; import org.onap.policy.controlloop.actorserviceprovider.Util; -import org.onap.policy.controlloop.actorserviceprovider.impl.OperationMaker; -import org.onap.policy.controlloop.actorserviceprovider.parameters.BidirectionalTopicConfig; import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams; import org.onap.policy.simulators.AppcLegacyTopicServer; import org.onap.policy.simulators.TopicServer; -import org.powermock.reflect.Whitebox; /** * Superclass for various operator tests. @@ -66,6 +63,7 @@ public abstract class BasicAppcOperation extends BasicBidirectionalTopicOperatio protected static final String RESOURCE_ID = "my-resource"; protected Response response; + protected GenericVnf genvnf; /** * Constructs the object using a default actor and operation name. @@ -97,6 +95,9 @@ public abstract class BasicAppcOperation extends BasicBidirectionalTopicOperatio response.setStatus(status); status.setCode(ResponseCode.SUCCESS.getValue()); status.setDescription(MY_DESCRIPTION); + + genvnf = new GenericVnf(); + genvnf.setVnfId(MY_VNF); } public void tearDown() { @@ -131,25 +132,6 @@ public abstract class BasicAppcOperation extends BasicBidirectionalTopicOperatio assertEquals(MY_DESCRIPTION, outcome.getMessage()); } - /** - * Verifies that an exception is thrown if a field is missing from the enrichment - * data. - * - * @param fieldName name of the field to be removed from the enrichment data - * @param expectedText text expected in the exception message - */ - protected void verifyMissing(String fieldName, String expectedText, - OperationMaker<BidirectionalTopicConfig, AppcOperation> maker) { - - makeContext(); - enrichment.remove(fieldName); - - AppcOperation oper = maker.apply(params, config); - - assertThatIllegalArgumentException().isThrownBy(() -> Whitebox.invokeMethod(oper, "makeRequest", 1)) - .withMessageContaining("missing").withMessageContaining(expectedText); - } - @Override protected void makeContext() { super.makeContext(); diff --git a/models-interactions/model-actors/actor.appc/src/test/java/org/onap/policy/controlloop/actor/appc/ModifyConfigOperationTest.java b/models-interactions/model-actors/actor.appc/src/test/java/org/onap/policy/controlloop/actor/appc/ModifyConfigOperationTest.java index 749b6c86c..ee3ac0242 100644 --- a/models-interactions/model-actors/actor.appc/src/test/java/org/onap/policy/controlloop/actor/appc/ModifyConfigOperationTest.java +++ b/models-interactions/model-actors/actor.appc/src/test/java/org/onap/policy/controlloop/actor/appc/ModifyConfigOperationTest.java @@ -21,48 +21,26 @@ 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.assertj.core.api.Assertions.assertThatIllegalStateException; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.mock; -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; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; -import org.mockito.Mock; -import org.onap.aai.domain.yang.GenericVnf; -import org.onap.policy.aai.AaiCqResponse; 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.OperationResult; -import org.onap.policy.controlloop.actorserviceprovider.controlloop.ControlLoopEventContext; import org.onap.policy.controlloop.actorserviceprovider.parameters.BidirectionalTopicConfig; import org.onap.policy.controlloop.actorserviceprovider.parameters.BidirectionalTopicParams; public class ModifyConfigOperationTest extends BasicAppcOperation { - @Mock - private GenericVnf genvnf; - @Mock - private AaiCqResponse cq; - private ModifyConfigOperation oper; @@ -85,8 +63,6 @@ public class ModifyConfigOperationTest extends BasicAppcOperation { @Override public void setUp() throws Exception { super.setUp(); - when(genvnf.getVnfId()).thenReturn(MY_VNF); - when(cq.getGenericVnfByModelInvariantId(any())).thenReturn(genvnf); oper = new ModifyConfigOperation(params, config); } @@ -106,16 +82,9 @@ public class ModifyConfigOperationTest extends BasicAppcOperation { BidirectionalTopicParams.builder().sinkTopic(MY_SINK).sourceTopic(MY_SINK).build(); config = new BidirectionalTopicConfig(blockingExecutor, opParams, topicMgr, AppcOperation.SELECTOR_KEYS); - params.getContext().setProperty(AaiCqResponse.CONTEXT_KEY, cq); - params = params.toBuilder().retry(0).timeoutSec(5).executor(blockingExecutor).preprocessed(true).build(); - oper = new ModifyConfigOperation(params, config) { - @Override - protected CompletableFuture<OperationOutcome> startGuardAsync() { - return null; - } - }; + oper = new ModifyConfigOperation(params, config); oper.setProperty(OperationProperties.AAI_RESOURCE_VNF, genvnf); @@ -136,45 +105,6 @@ public class ModifyConfigOperationTest extends BasicAppcOperation { } @Test - public void testStartPreprocessorAsync() throws Exception { - CompletableFuture<OperationOutcome> future2 = new CompletableFuture<>(); - context = mock(ControlLoopEventContext.class); - when(context.obtain(eq(AaiCqResponse.CONTEXT_KEY), any())).thenReturn(future2); - when(context.getEvent()).thenReturn(event); - params = params.toBuilder().context(context).build(); - - AtomicBoolean guardStarted = new AtomicBoolean(); - - oper = new ModifyConfigOperation(params, config) { - @Override - protected CompletableFuture<OperationOutcome> startGuardAsync() { - guardStarted.set(true); - return super.startGuardAsync(); - } - }; - - CompletableFuture<OperationOutcome> future3 = oper.startPreprocessorAsync(); - assertNotNull(future3); - assertFalse(future.isDone()); - assertTrue(guardStarted.get()); - verify(context).obtain(eq(AaiCqResponse.CONTEXT_KEY), any()); - - future2.complete(params.makeOutcome(null)); - assertTrue(executor.runAll(100)); - assertTrue(future3.isDone()); - assertEquals(OperationResult.SUCCESS, future3.get().getResult()); - } - - /** - * Tests startPreprocessorAsync(), when preprocessing is disabled. - */ - @Test - public void testStartPreprocessorAsyncDisabled() { - params = params.toBuilder().preprocessed(true).build(); - assertNull(new ModifyConfigOperation(params, config).startPreprocessorAsync()); - } - - @Test public void testMakeRequest() throws CoderException { oper.setProperty(OperationProperties.AAI_RESOURCE_VNF, genvnf); @@ -185,32 +115,4 @@ public class ModifyConfigOperationTest extends BasicAppcOperation { verifyRequest("modifyConfig.json", request, IGNORE_FIELDS); } - - @Test - public void testGetVnfIdViaProperty() throws CoderException { - oper.setProperty(OperationProperties.AAI_RESOURCE_VNF, genvnf); - assertEquals(MY_VNF, oper.getVnfId()); - } - - @Test - public void testGetVnfId() throws CoderException { - // no CQ data - assertThatIllegalStateException().isThrownBy(() -> oper.getVnfId()) - .withMessage("target vnf-id could not be determined"); - - cq = new AaiCqResponse("{}"); - - // missing vnf-id - params.getContext().setProperty(AaiCqResponse.CONTEXT_KEY, cq); - assertThatIllegalArgumentException().isThrownBy(() -> oper.getVnfId()) - .withMessage("target vnf-id could not be found"); - - // populate the CQ data with a vnf-id - genvnf = new GenericVnf(); - genvnf.setVnfId(MY_VNF); - genvnf.setModelInvariantId(RESOURCE_ID); - cq.setInventoryResponseItems(Arrays.asList(genvnf)); - - assertEquals(MY_VNF, oper.getVnfId()); - } } |