aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/parameters/ControlLoopOperationParams.java44
-rw-r--r--models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/parameters/ControlLoopOperationParamsTest.java58
2 files changed, 89 insertions, 13 deletions
diff --git a/models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/parameters/ControlLoopOperationParams.java b/models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/parameters/ControlLoopOperationParams.java
index f5dd49877..d0b7c26a8 100644
--- a/models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/parameters/ControlLoopOperationParams.java
+++ b/models-interactions/model-actors/actorServiceProvider/src/main/java/org/onap/policy/controlloop/actorserviceprovider/parameters/ControlLoopOperationParams.java
@@ -33,6 +33,7 @@ import lombok.Getter;
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.VirtualControlLoopEvent;
import org.onap.policy.controlloop.actorserviceprovider.ActorService;
import org.onap.policy.controlloop.actorserviceprovider.Operation;
import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome;
@@ -68,10 +69,14 @@ public class ControlLoopOperationParams {
/**
* Event for which the operation applies.
*/
- @NotNull
private ControlLoopEventContext context;
/**
+ * If {@code null}, this value is extracted from the context.
+ */
+ private UUID requestId;
+
+ /**
* Executor to use to run the operation.
*/
@NotNull
@@ -175,7 +180,12 @@ public class ControlLoopOperationParams {
* @return the event's request ID, or {@code null} if no request ID is available
*/
public UUID getRequestId() {
- return (context == null || context.getEvent() == null ? null : context.getEvent().getRequestId());
+ if (requestId == null && context != null && context.getEvent() != null) {
+ // cache the request ID
+ requestId = context.getEvent().getRequestId();
+ }
+
+ return requestId;
}
/**
@@ -230,6 +240,34 @@ public class ControlLoopOperationParams {
* @return the validation result
*/
public BeanValidationResult validate() {
- return new BeanValidator().validateTop(ControlLoopOperationParams.class.getSimpleName(), this);
+ BeanValidationResult result =
+ new BeanValidator().validateTop(ControlLoopOperationParams.class.getSimpleName(), this);
+
+ // validate that we have a request ID, or that we can get it from the context's
+ // event
+
+ if (context == null) {
+ // no context specified - invoker must provide a request ID then
+ result.validateNotNull("requestId", requestId);
+
+ } else if (requestId == null) {
+ // have a context, but no request ID - check the context's event for the
+ // request ID
+ BeanValidationResult contextResult = new BeanValidationResult("context", context);
+ VirtualControlLoopEvent event = context.getEvent();
+ contextResult.validateNotNull("event", event);
+
+ if (event != null) {
+ // cache the request id for later use
+ BeanValidationResult eventResult = new BeanValidationResult("event", event);
+ eventResult.validateNotNull("requestId", event.getRequestId());
+
+ contextResult.addResult(eventResult);
+ }
+
+ result.addResult(contextResult);
+ }
+
+ return result;
}
}
diff --git a/models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/parameters/ControlLoopOperationParamsTest.java b/models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/parameters/ControlLoopOperationParamsTest.java
index 98ca6736d..634d7b132 100644
--- a/models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/parameters/ControlLoopOperationParamsTest.java
+++ b/models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/parameters/ControlLoopOperationParamsTest.java
@@ -60,6 +60,8 @@ import org.onap.policy.controlloop.actorserviceprovider.spi.Actor;
import org.onap.policy.controlloop.policy.Target;
public class ControlLoopOperationParamsTest {
+ private static final String NULL_MSG = "null";
+ private static final String REQUEST_ID_NAME = "requestId";
private static final String EXPECTED_EXCEPTION = "expected exception";
private static final String ACTOR = "my-actor";
private static final String OPERATION = "my-operation";
@@ -68,6 +70,7 @@ public class ControlLoopOperationParamsTest {
private static final Integer RETRY = 3;
private static final Integer TIMEOUT = 100;
private static final UUID REQ_ID = UUID.randomUUID();
+ private static final UUID REQ_ID2 = UUID.randomUUID();
@Mock
private Actor actor;
@@ -133,28 +136,41 @@ public class ControlLoopOperationParamsTest {
@Test
public void testStart() {
- assertSame(operFuture, params.start());
-
assertThatIllegalArgumentException().isThrownBy(() -> params.toBuilder().context(null).build().start());
+
+ assertSame(operFuture, params.start());
}
@Test
public void testBuild() {
- assertSame(operation, params.build());
-
assertThatIllegalArgumentException().isThrownBy(() -> params.toBuilder().context(null).build().build());
+
+ assertSame(operation, params.build());
}
@Test
public void testGetRequestId() {
assertSame(REQ_ID, params.getRequestId());
+ // when both request ID and event request ID are set - should use request ID
+ // parameter
+ assertSame(REQ_ID2, params.toBuilder().requestId(REQ_ID2).build().getRequestId());
+ }
+
+ /**
+ * Tests getRequestId() when the request ID is not available in the context.
+ */
+ @Test
+ public void testGetRequestIdNotFromContext() {
// try with null context
assertNull(params.toBuilder().context(null).build().getRequestId());
// try with null event
when(context.getEvent()).thenReturn(null);
assertNull(params.getRequestId());
+
+ // set request ID directly
+ assertSame(REQ_ID2, params.toBuilder().requestId(REQ_ID2).build().getRequestId());
}
@Test
@@ -225,12 +241,14 @@ public class ControlLoopOperationParamsTest {
@Test
public void testValidateFields() {
- testValidate("actor", "null", bldr -> bldr.actor(null));
- testValidate("actorService", "null", bldr -> bldr.actorService(null));
- testValidate("context", "null", bldr -> bldr.context(null));
- testValidate("executor", "null", bldr -> bldr.executor(null));
- testValidate("operation", "null", bldr -> bldr.operation(null));
- testValidate("target", "null", bldr -> bldr.targetEntity(null));
+ testValidate("actor", NULL_MSG, bldr -> bldr.actor(null));
+ testValidate("actorService", NULL_MSG, bldr -> bldr.actorService(null));
+ testValidate("executor", NULL_MSG, bldr -> bldr.executor(null));
+ testValidate("operation", NULL_MSG, bldr -> bldr.operation(null));
+ testValidate("target", NULL_MSG, bldr -> bldr.targetEntity(null));
+
+ // note: if context is null, then it will ACTUALLY complain about the request ID
+ testValidate(REQUEST_ID_NAME, NULL_MSG, bldr -> bldr.context(null));
// check edge cases
assertTrue(params.toBuilder().build().validate().isValid());
@@ -242,6 +260,26 @@ public class ControlLoopOperationParamsTest {
// test with minimal fields
assertTrue(ControlLoopOperationParams.builder().actorService(actorService).context(context).actor(ACTOR)
.operation(OPERATION).targetEntity(TARGET_ENTITY).build().validate().isValid());
+
+ // test when event has no request ID
+ when(event.getRequestId()).thenReturn(null);
+ BeanValidationResult result = params.validate();
+ assertFalse(result.isValid());
+ assertThat(result.getResult()).contains("event").contains(REQUEST_ID_NAME).contains(NULL_MSG);
+
+ // try when context has no event
+ when(context.getEvent()).thenReturn(null);
+ result = params.validate();
+ assertFalse(result.isValid());
+ assertThat(result.getResult()).contains("event").doesNotContain(REQUEST_ID_NAME).contains(NULL_MSG);
+
+ // has both request ID and context, but no event
+ result = params.toBuilder().requestId(REQ_ID2).build().validate();
+ assertTrue(result.isValid());
+
+ // has request ID, but not context
+ result = params.toBuilder().requestId(REQ_ID2).context(null).build().validate();
+ assertTrue(result.isValid());
}
private void testValidate(String fieldName, String expected,