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.cds/src/test | |
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.cds/src/test')
2 files changed, 29 insertions, 250 deletions
diff --git a/models-interactions/model-actors/actor.cds/src/test/java/org/onap/policy/controlloop/actor/cds/GrpcOperationTest.java b/models-interactions/model-actors/actor.cds/src/test/java/org/onap/policy/controlloop/actor/cds/GrpcOperationTest.java index 709e179e6..da069d83e 100644 --- a/models-interactions/model-actors/actor.cds/src/test/java/org/onap/policy/controlloop/actor/cds/GrpcOperationTest.java +++ b/models-interactions/model-actors/actor.cds/src/test/java/org/onap/policy/controlloop/actor/cds/GrpcOperationTest.java @@ -23,13 +23,9 @@ 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; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertSame; 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.Collections; @@ -39,11 +35,7 @@ import java.util.Map; import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; -import java.util.concurrent.atomic.AtomicBoolean; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; @@ -51,11 +43,9 @@ import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.onap.aai.domain.yang.GenericVnf; -import org.onap.aai.domain.yang.Pnf; import org.onap.aai.domain.yang.ServiceInstance; import org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceInput; import org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceOutput; -import org.onap.policy.aai.AaiCqResponse; import org.onap.policy.cds.client.CdsProcessorGrpcClient; import org.onap.policy.cds.properties.CdsServerProperties; import org.onap.policy.common.utils.coder.Coder; @@ -63,15 +53,12 @@ import org.onap.policy.common.utils.coder.CoderException; import org.onap.policy.common.utils.coder.StandardCoder; import org.onap.policy.common.utils.coder.StandardCoderObject; import org.onap.policy.common.utils.time.PseudoExecutor; -import org.onap.policy.controlloop.VirtualControlLoopEvent; -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.OperationResult; import org.onap.policy.controlloop.actorserviceprovider.TargetType; -import org.onap.policy.controlloop.actorserviceprovider.controlloop.ControlLoopEventContext; import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams; import org.onap.policy.simulators.CdsSimulator; import org.onap.policy.simulators.Util; @@ -96,16 +83,11 @@ public class GrpcOperationTest { @Mock private CdsProcessorGrpcClient cdsClient; - @Mock - private ControlLoopEventContext context; private CdsServerProperties cdsProps; - private VirtualControlLoopEvent onset; private PseudoExecutor executor; - private TargetType targetType; private Map<String, String> targetEntityIds; private ControlLoopOperationParams params; private GrpcConfig config; - private CompletableFuture<OperationOutcome> cqFuture; private GrpcOperation operation; @BeforeClass @@ -136,25 +118,15 @@ public class GrpcOperationTest { // Setup cdsClient when(cdsClient.sendRequest(any(ExecutionServiceInput.class))).thenReturn(mock(CountDownLatch.class)); - // Setup onset event - onset = new VirtualControlLoopEvent(); - onset.setRequestId(REQUEST_ID); - // Setup executor executor = new PseudoExecutor(); - targetType = TargetType.VM; targetEntityIds = new HashMap<>(); targetEntityIds.put(ControlLoopOperationParams.PARAMS_ENTITY_RESOURCEID, RESOURCE_ID); - cqFuture = new CompletableFuture<>(); - when(context.obtain(eq(AaiCqResponse.CONTEXT_KEY), any())).thenReturn(cqFuture); - when(context.getEvent()).thenReturn(onset); - - params = ControlLoopOperationParams.builder().actor(CdsActorConstants.CDS_ACTOR) - .operation(GrpcOperation.NAME).context(context).actorService(new ActorService()) - .targetEntity(TARGET_ENTITY).targetType(targetType).targetEntityIds(targetEntityIds) - .build(); + params = ControlLoopOperationParams.builder().actor(CdsActorConstants.CDS_ACTOR).operation(GrpcOperation.NAME) + .requestId(REQUEST_ID).actorService(new ActorService()).targetEntity(TARGET_ENTITY) + .build(); } /** @@ -162,49 +134,12 @@ public class GrpcOperationTest { */ @Test public void testSuccess() throws Exception { - ControlLoopEventContext context = new ControlLoopEventContext(onset); - loadCqData(context); - Map<String, Object> payload = Map.of("artifact_name", "my_artifact", "artifact_version", "1.0"); params = ControlLoopOperationParams.builder().actor(CdsActorConstants.CDS_ACTOR).operation("subscribe") - .context(context).actorService(new ActorService()).targetEntity(TARGET_ENTITY) - .targetType(targetType).targetEntityIds(targetEntityIds) - .retry(0).timeoutSec(5).executor(blockingExecutor).payload(payload).build(); - - cdsProps.setHost("localhost"); - cdsProps.setPort(sim.getPort()); - cdsProps.setTimeout(3); - - GrpcConfig config = new GrpcConfig(blockingExecutor, cdsProps); - - operation = new GrpcOperation(params, config) { - @Override - protected CompletableFuture<OperationOutcome> startGuardAsync() { - // indicate that guard completed successfully - return CompletableFuture.completedFuture(params.makeOutcome(null)); - } - }; - - OperationOutcome outcome = operation.start().get(); - assertEquals(OperationResult.SUCCESS, outcome.getResult()); - assertTrue(outcome.getResponse() instanceof ExecutionServiceOutput); - } - - /** - * Tests "success" case with simulator using properties. - */ - @Test - public void testSuccessViaProperties() throws Exception { - ControlLoopEventContext context = new ControlLoopEventContext(onset); - loadCqData(context); - - Map<String, Object> payload = Map.of("artifact_name", "my_artifact", "artifact_version", "1.0"); - - params = ControlLoopOperationParams.builder().actor(CdsActorConstants.CDS_ACTOR).operation("subscribe") - .context(context).actorService(new ActorService()).targetEntity(TARGET_ENTITY) - .targetType(targetType).targetEntityIds(targetEntityIds) - .retry(0).timeoutSec(5).executor(blockingExecutor).payload(payload).preprocessed(true).build(); + .requestId(REQUEST_ID).actorService(new ActorService()).targetEntity(TARGET_ENTITY) + .retry(0).timeoutSec(5).executor(blockingExecutor).payload(payload) + .preprocessed(true).build(); cdsProps.setHost("localhost"); cdsProps.setPort(sim.getPort()); @@ -255,136 +190,22 @@ public class GrpcOperationTest { } @Test - public void testGetPnf() { - ControlLoopEventContext context = new ControlLoopEventContext(onset); - params = params.toBuilder().context(context).build(); - operation = new GrpcOperation(params, config); - - // in neither property nor context - assertThatIllegalArgumentException().isThrownBy(() -> operation.getPnfData()).withMessage("missing PNF data"); - - // only in context - Pnf pnf = new Pnf(); - params.getContext().setProperty(AaiGetPnfOperation.getKey(params.getTargetEntity()), pnf); - assertSame(pnf, operation.getPnfData()); - - // both - should choose the property - Pnf pnf2 = new Pnf(); - operation.setProperty(OperationProperties.AAI_PNF, pnf2); - assertSame(pnf2, operation.getPnfData()); - } - - @Test public void testGetServiceInstanceId() { - ControlLoopEventContext context = new ControlLoopEventContext(onset); - params = params.toBuilder().context(context).build(); operation = new GrpcOperation(params, config); - - // in neither property nor custom query - context.setProperty(AaiCqResponse.CONTEXT_KEY, mock(AaiCqResponse.class)); - assertThatIllegalArgumentException().isThrownBy(() -> operation.getServiceInstanceId()) - .withMessage("Target service instance could not be found"); - - // only in custom query - loadCqData(params.getContext()); + loadVnfData(); assertEquals(MY_SVC_ID, operation.getServiceInstanceId()); - - // both - should choose the property - ServiceInstance serviceInstance = new ServiceInstance(); - serviceInstance.setServiceInstanceId("another-service-id"); - operation.setProperty(OperationProperties.AAI_SERVICE, serviceInstance); - assertEquals("another-service-id", operation.getServiceInstanceId()); } @Test public void testGetVnfId() { - ControlLoopEventContext context = new ControlLoopEventContext(onset); - params = params.toBuilder().context(context).build(); operation = new GrpcOperation(params, config); - - // in neither property nor custom query - context.setProperty(AaiCqResponse.CONTEXT_KEY, mock(AaiCqResponse.class)); - assertThatIllegalArgumentException().isThrownBy(() -> operation.getVnfId()) - .withMessage("Target generic vnf could not be found"); - - // only in custom query - loadCqData(params.getContext()); + loadVnfData(); assertEquals(MY_VNF, operation.getVnfId()); - - // both - should choose the property - GenericVnf vnf = new GenericVnf(); - vnf.setVnfId("another-vnf-id"); - operation.setProperty(OperationProperties.AAI_RESOURCE_VNF, vnf); - assertEquals("another-vnf-id", operation.getVnfId()); - } - - @Test - public void testStartPreprocessorAsync() throws InterruptedException, ExecutionException, TimeoutException { - AtomicBoolean guardStarted = new AtomicBoolean(); - - operation = new GrpcOperation(params, config) { - @Override - protected CompletableFuture<OperationOutcome> startGuardAsync() { - guardStarted.set(true); - return cqFuture; - } - }; - - CompletableFuture<OperationOutcome> future3 = operation.startPreprocessorAsync(); - assertNotNull(future3); - assertTrue(guardStarted.get()); - verify(context).obtain(eq(AaiCqResponse.CONTEXT_KEY), any()); - - cqFuture.complete(params.makeOutcome(null)); - assertTrue(executor.runAll(100)); - assertEquals(OperationResult.SUCCESS, future3.get(2, TimeUnit.SECONDS).getResult()); - assertTrue(future3.isDone()); - } - - /** - * Tests startPreprocessorAsync() when the target type is PNF. - */ - @Test - public void testStartPreprocessorAsyncPnf() throws InterruptedException, ExecutionException, TimeoutException { - AtomicBoolean guardStarted = new AtomicBoolean(); - - params = params.toBuilder().targetType(TargetType.PNF).build(); - - operation = new GrpcOperation(params, config) { - @Override - protected CompletableFuture<OperationOutcome> startGuardAsync() { - guardStarted.set(true); - return cqFuture; - } - }; - - CompletableFuture<OperationOutcome> future3 = operation.startPreprocessorAsync(); - assertNotNull(future3); - assertTrue(guardStarted.get()); - verify(context).obtain(eq(AaiGetPnfOperation.getKey(TARGET_ENTITY)), any()); - - cqFuture.complete(params.makeOutcome(null)); - assertTrue(executor.runAll(100)); - assertEquals(OperationResult.SUCCESS, future3.get(2, TimeUnit.SECONDS).getResult()); - assertTrue(future3.isDone()); - } - - /** - * Tests startPreprocessorAsync(), when preprocessing is disabled. - */ - @Test - public void testStartPreprocessorAsyncDisabled() { - params = params.toBuilder().preprocessed(true).build(); - assertNull(new GrpcOperation(params, config).startPreprocessorAsync()); } @Test public void testStartOperationAsync() throws Exception { - - ControlLoopEventContext context = new ControlLoopEventContext(onset); - loadCqData(context); - - verifyOperation(context); + verifyOperation(TargetType.VNF, this::loadVnfData); } /** @@ -392,24 +213,7 @@ public class GrpcOperationTest { */ @Test public void testStartOperationAsyncPnf() throws Exception { - - targetType = TargetType.PNF; - - ControlLoopEventContext context = new ControlLoopEventContext(onset); - loadPnfData(context); - - verifyOperation(context); - } - - @Test - public void testStartOperationAsyncWithAdditionalParams() throws Exception { - - Map<String, String> additionalParams = new HashMap<>(); - additionalParams.put("test", "additionalParams"); - onset.setAdditionalEventParams(additionalParams); - ControlLoopEventContext context = new ControlLoopEventContext(onset); - loadCqData(context); - verifyOperation(context); + verifyOperation(TargetType.PNF, this::loadPnfData); } @Test @@ -419,39 +223,15 @@ public class GrpcOperationTest { .isThrownBy(() -> operation.startOperationAsync(1, params.makeOutcome(null))); } - @Test - public void testGetAdditionalEventParams() { - operation = new GrpcOperation(params, config); - - // in neither property nor context - assertNull(operation.getAdditionalEventParams()); - - final Map<String, String> eventParams = Collections.emptyMap(); - - // only in context - onset.setAdditionalEventParams(eventParams); - assertSame(eventParams, operation.getAdditionalEventParams()); - - // both - should choose the property, even if it's null - operation.setProperty(OperationProperties.EVENT_ADDITIONAL_PARAMS, null); - assertNull(operation.getAdditionalEventParams()); - - // both - should choose the property - final Map<String, String> propParams = Collections.emptyMap(); - operation.setProperty(OperationProperties.EVENT_ADDITIONAL_PARAMS, propParams); - assertSame(propParams, operation.getAdditionalEventParams()); - } - - private void verifyOperation(ControlLoopEventContext context) { + private void verifyOperation(TargetType targetType, Runnable loader) { Map<String, Object> payloadMap = Map.of(CdsActorConstants.KEY_CBA_NAME, CDS_BLUEPRINT_NAME, CdsActorConstants.KEY_CBA_VERSION, CDS_BLUEPRINT_VERSION, "data", "{\"mapInfo\":{\"key\":\"val\"},\"arrayInfo\":[\"one\",\"two\"],\"paramInfo\":\"val\"}"); ControlLoopOperationParams params = ControlLoopOperationParams.builder().actor(CdsActorConstants.CDS_ACTOR) - .operation(GrpcOperation.NAME).context(context).actorService(new ActorService()) - .targetEntity(TARGET_ENTITY).targetType(targetType).targetEntityIds(targetEntityIds) - .payload(payloadMap).build(); + .operation(GrpcOperation.NAME).requestId(REQUEST_ID).actorService(new ActorService()) + .targetType(targetType).targetEntity(TARGET_ENTITY).payload(payloadMap).build(); GrpcConfig config = new GrpcConfig(executor, cdsProps); operation = new GrpcOperation(params, config); @@ -459,28 +239,31 @@ public class GrpcOperationTest { assertEquals(1000, operation.getTimeoutMs(0)); assertEquals(2000, operation.getTimeoutMs(2)); operation.generateSubRequestId(1); + + loader.run(); CompletableFuture<OperationOutcome> future3 = operation.startOperationAsync(1, params.makeOutcome(null)); assertNotNull(future3); } - private void loadPnfData(ControlLoopEventContext context) throws CoderException { - String json = "{'dataA': 'valueA', 'dataB': 'valueB'}".replace('\'', '"'); - StandardCoderObject sco = coder.decode(json, StandardCoderObject.class); + private void loadPnfData() { + try { + String json = "{'dataA': 'valueA', 'dataB': 'valueB'}".replace('\'', '"'); + StandardCoderObject sco = coder.decode(json, StandardCoderObject.class); + + operation.setProperty(OperationProperties.AAI_PNF, sco); - context.setProperty(AaiGetPnfOperation.getKey(TARGET_ENTITY), sco); + } catch (CoderException e) { + throw new IllegalArgumentException("cannot decode PNF json", e); + } } - private void loadCqData(ControlLoopEventContext context) { + private void loadVnfData() { GenericVnf genvnf = new GenericVnf(); genvnf.setVnfId(MY_VNF); + operation.setProperty(OperationProperties.AAI_RESOURCE_VNF, genvnf); ServiceInstance serviceInstance = new ServiceInstance(); serviceInstance.setServiceInstanceId(MY_SVC_ID); - - AaiCqResponse cq = mock(AaiCqResponse.class); - when(cq.getGenericVnfByModelInvariantId(any())).thenReturn(genvnf); - when(cq.getServiceInstance()).thenReturn(serviceInstance); - - context.setProperty(AaiCqResponse.CONTEXT_KEY, cq); + operation.setProperty(OperationProperties.AAI_SERVICE, serviceInstance); } } diff --git a/models-interactions/model-actors/actor.cds/src/test/java/org/onap/policy/controlloop/actor/cds/GrpcOperatorTest.java b/models-interactions/model-actors/actor.cds/src/test/java/org/onap/policy/controlloop/actor/cds/GrpcOperatorTest.java index 11121c0b3..3e3b1f573 100644 --- a/models-interactions/model-actors/actor.cds/src/test/java/org/onap/policy/controlloop/actor/cds/GrpcOperatorTest.java +++ b/models-interactions/model-actors/actor.cds/src/test/java/org/onap/policy/controlloop/actor/cds/GrpcOperatorTest.java @@ -25,16 +25,14 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.Assert.assertEquals; import java.util.Map; +import java.util.UUID; import org.junit.Before; import org.junit.Test; import org.mockito.MockitoAnnotations; import org.onap.policy.cds.properties.CdsServerProperties; -import org.onap.policy.controlloop.VirtualControlLoopEvent; import org.onap.policy.controlloop.actor.cds.constants.CdsActorConstants; import org.onap.policy.controlloop.actorserviceprovider.Operation; -import org.onap.policy.controlloop.actorserviceprovider.TargetType; import org.onap.policy.controlloop.actorserviceprovider.Util; -import org.onap.policy.controlloop.actorserviceprovider.controlloop.ControlLoopEventContext; import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams; import org.onap.policy.controlloop.actorserviceprovider.parameters.ParameterValidationRuntimeException; @@ -85,10 +83,8 @@ public class GrpcOperatorTest { @Test public void testBuildOperation() { - VirtualControlLoopEvent event = new VirtualControlLoopEvent(); - ControlLoopEventContext context = new ControlLoopEventContext(event); ControlLoopOperationParams params = ControlLoopOperationParams.builder().actor(CdsActorConstants.CDS_ACTOR) - .operation(GrpcOperation.NAME).context(context).targetType(TargetType.VM).build(); + .operation(GrpcOperation.NAME).requestId(UUID.randomUUID()).build(); // not configured yet assertThatIllegalStateException().isThrownBy(() -> operation.buildOperation(params)); |