package org.onap.policy.controlloop.actor.guard;
-import java.util.LinkedHashMap;
-import java.util.Map;
import java.util.concurrent.Executor;
import lombok.Getter;
import org.onap.policy.common.endpoints.http.client.HttpClient;
import org.onap.policy.common.endpoints.http.client.HttpClientFactory;
import org.onap.policy.controlloop.actorserviceprovider.parameters.HttpConfig;
+import org.onap.policy.models.decisions.concepts.DecisionRequest;
/**
* Configuration for Guard Operators.
*/
public class GuardConfig extends HttpConfig {
- private final Map<String, Object> defaultRequest = new LinkedHashMap<>();
+ private final DecisionRequest defaultRequest = new DecisionRequest();
/**
* {@code True} if the associated guard operation is disabled.
public GuardConfig(Executor blockingExecutor, GuardParams params, HttpClientFactory clientFactory) {
super(blockingExecutor, params, clientFactory);
- addProperty("ONAPComponent", params.getOnapComponent());
- addProperty("ONAPInstance", params.getOnapInstance());
- addProperty("ONAPName", params.getOnapName());
- addProperty("action", params.getAction());
+ defaultRequest.setOnapComponent(params.getOnapComponent());
+ defaultRequest.setOnapInstance(params.getOnapInstance());
+ defaultRequest.setOnapName(params.getOnapName());
+ defaultRequest.setAction(params.getAction());
this.disabled = params.isDisabled();
}
- /**
- * Adds a property to the default request, if the value is not {@code null}.
- *
- * @param key property key
- * @param value property value, or {@code null}
- */
- private void addProperty(String key, String value) {
- if (value != null) {
- defaultRequest.put(key, value);
- }
- }
-
/**
* Creates a new request, with the default values.
*
- * @return a new request map
+ * @return a new request
*/
- public Map<String, Object> makeRequest() {
- return new LinkedHashMap<>(defaultRequest);
+ public DecisionRequest makeRequest() {
+ return new DecisionRequest(defaultRequest);
}
}
import org.onap.policy.common.endpoints.utils.NetLoggerUtil.EventType;
import org.onap.policy.controlloop.actorserviceprovider.CallbackManager;
import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome;
-import org.onap.policy.controlloop.actorserviceprovider.Util;
import org.onap.policy.controlloop.actorserviceprovider.impl.HttpOperation;
import org.onap.policy.controlloop.actorserviceprovider.impl.OperationPartial;
import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams;
protected CompletableFuture<OperationOutcome> startOperationAsync(int attempt, OperationOutcome outcome) {
outcome.setSubRequestId(String.valueOf(attempt));
- DecisionRequest request = Util.translate(getName(), makeRequest(), DecisionRequest.class);
-
+ DecisionRequest request = makeRequest();
Entity<DecisionRequest> entity = Entity.entity(request, MediaType.APPLICATION_JSON);
Map<String, Object> headers = makeHeaders();
/**
* Makes a request from the payload.
*
- * @return a new request map
+ * @return a new request
*/
- protected Map<String, Object> makeRequest() {
+ protected DecisionRequest makeRequest() {
if (params.getPayload() == null) {
throw new IllegalArgumentException("missing payload");
}
- Map<String, Object> req = config.makeRequest();
- req.putAll(params.getPayload());
- req.computeIfAbsent("requestId", key -> UUID.randomUUID().toString());
+ DecisionRequest req = config.makeRequest();
+ req.setRequestId(UUID.randomUUID().toString());
+ req.setResource(Map.of("guard", params.getPayload()));
return req;
}
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.SuperBuilder;
+import org.onap.policy.common.parameters.annotations.NotBlank;
+import org.onap.policy.common.parameters.annotations.NotNull;
import org.onap.policy.controlloop.actorserviceprovider.parameters.HttpParams;
/**
- * Default values to be included if not specified in the payload.
+ * Guard parameters.
*/
+@NotBlank
+@NotNull
@Data
@EqualsAndHashCode(callSuper = true)
@SuperBuilder(toBuilder = true)
public class GuardParams extends HttpParams {
-
- /*
- * Optional, default values that are used if missing from the payload.
- */
-
private String onapName;
private String onapComponent;
private String onapInstance;
import org.mockito.MockitoAnnotations;
import org.onap.policy.common.endpoints.http.client.HttpClient;
import org.onap.policy.common.endpoints.http.client.HttpClientFactory;
-import org.onap.policy.controlloop.actorserviceprovider.Util;
import org.onap.policy.models.decisions.concepts.DecisionRequest;
public class GuardConfigTest {
expected.setOnapName(ONAP_NAME);
expected.setAction(MY_ACTION);
- DecisionRequest actual = Util.translate("", config.makeRequest(), DecisionRequest.class);
+ DecisionRequest actual = config.makeRequest();
assertEquals(expected, actual);
// check value from superclass
config = new GuardConfig(executor, params, factory);
assertFalse(config.isDisabled());
- actual = Util.translate("", config.makeRequest(), DecisionRequest.class);
+ actual = config.makeRequest();
assertEquals(new DecisionRequest(), actual);
// try with disabled=true
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.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
super.setUpBasic();
guardConfig = mock(GuardConfig.class);
- when(guardConfig.makeRequest()).thenAnswer(args -> new TreeMap<>(Map.of("action", "guard")));
+ when(guardConfig.makeRequest()).thenAnswer(args -> {
+ DecisionRequest req = new DecisionRequest();
+ req.setAction("guard");
+ req.setOnapComponent("my-onap-component");
+ req.setOnapInstance("my-onap-instance");
+ req.setOnapName("my-onap-name");
+ return req;
+ });
config = guardConfig;
initConfig();
verifyPayload("makeReqStd.json", makePayload());
verifyPayload("makeReqDefault.json", new TreeMap<>());
- Map<String, Object> payload = new TreeMap<>();
- payload.put("action", "some action");
- payload.put("hello", "world");
- payload.put("r u there?", "yes");
- payload.put("requestId", "some request id");
-
- Map<String, Object> resource = new TreeMap<>();
- payload.put("resource", resource);
- resource.put("abc", "def");
- resource.put("ghi", "jkl");
-
- verifyPayload("makeReq.json", payload);
-
// null payload - start with fresh parameters and operation
params = params.toBuilder().payload(null).build();
oper = new GuardOperation(params, config);
params.getPayload().clear();
params.getPayload().putAll(payload);
- Map<String, Object> requestMap = oper.makeRequest();
+ DecisionRequest request = oper.makeRequest();
+
+ assertEquals("guard", request.getAction());
+ assertEquals("my-onap-component", request.getOnapComponent());
+ assertEquals("my-onap-instance", request.getOnapInstance());
+ assertEquals("my-onap-name", request.getOnapName());
+ assertNotNull(request.getRequestId());
+ assertEquals(Map.of("guard", payload), request.getResource());
- verifyRequest(expectedJsonFile, requestMap, "requestId");
+ verifyRequest(expectedJsonFile, request, "requestId");
}
@Test
@Override
protected Map<String, Object> makePayload() {
- DecisionRequest req = new DecisionRequest();
- req.setAction("my-action");
- req.setOnapComponent("my-onap-component");
- req.setOnapInstance("my-onap-instance");
- req.setOnapName("my-onap-name");
- req.setRequestId("my-request-id");
-
- // add resources
- Map<String, Object> resource = new TreeMap<>();
- req.setResource(resource);
- resource.put("actor", "resource-actor");
- resource.put("operation", "resource-operation");
-
- @SuppressWarnings("unchecked")
- Map<String, Object> map = Util.translate("", req, TreeMap.class);
-
- return map;
+ return new TreeMap<>(Map.of("hello", "world", "abc", "123"));
}
}
public void testValidate() {
assertTrue(params.validate(CONTAINER).isValid());
+ testValidateField("onapName", "null", bldr -> bldr.onapName(null));
+ testValidateField("onapComponent", "null", bldr -> bldr.onapComponent(null));
+ testValidateField("onapInstance", "null", bldr -> bldr.onapInstance(null));
+ testValidateField("action", "null", bldr -> bldr.action(null));
+
// validate one of the superclass fields
testValidateField("clientName", "null", bldr -> bldr.clientName(null));
-
- // validate with mostly empty params
- params = GuardParams.builder().clientName(CLIENT).path(PATH).timeoutSec(TIMEOUT).build();
- assertTrue(params.validate(CONTAINER).isValid());
}
@Test
+++ /dev/null
-{
- "action": "some action",
- "hello": "world",
- "r u there?": "yes",
- "requestId": "abcdefghi",
- "resource": {
- "abc": "def",
- "ghi": "jkl"
- }
-}
{
+ "ONAPName": "my-onap-name",
+ "ONAPComponent": "my-onap-component",
+ "ONAPInstance": "my-onap-instance",
+ "requestId": "abcdefghi",
"action": "guard",
- "requestId": "abcdefghi"
+ "resource": {
+ "guard": {}
+ }
}
{
+ "ONAPName": "my-onap-name",
"ONAPComponent": "my-onap-component",
"ONAPInstance": "my-onap-instance",
- "ONAPName": "my-onap-name",
- "action": "my-action",
"requestId": "abcdefghi",
+ "action": "guard",
"resource": {
- "actor": "resource-actor",
- "operation": "resource-operation"
+ "guard": {
+ "abc": "123",
+ "hello": "world"
+ }
}
-}
\ No newline at end of file
+}
actors:
GUARD:
clientName: my-client
+ onapName: my-onap-name
+ onapComponent: my-onap-component
+ onapInstance: my-onap-instance
+ action: guard
operations:
Decision:
path: decide
\ No newline at end of file
Map<String, Object> payload = captor.getValue().getPayload();
assertNotNull(payload);
- @SuppressWarnings("unchecked")
- Map<String, Object> resource = (Map<String, Object>) payload.get("resource");
- assertNotNull(resource);
-
- @SuppressWarnings("unchecked")
- Map<String, Object> guard = (Map<String, Object>) resource.get("guard");
- assertNotNull(guard);
-
- Integer newCount = (Integer) guard.get(VfModuleCreate.PAYLOAD_KEY_VF_COUNT);
+ Integer newCount = (Integer) payload.get(VfModuleCreate.PAYLOAD_KEY_VF_COUNT);
assertNotNull(newCount);
assertEquals(origCount + 1, newCount.intValue());
}
Map<String, Object> payload = captor.getValue().getPayload();
assertNotNull(payload);
- @SuppressWarnings("unchecked")
- Map<String, Object> resource = (Map<String, Object>) payload.get("resource");
- assertNotNull(resource);
-
- @SuppressWarnings("unchecked")
- Map<String, Object> guard = (Map<String, Object>) resource.get("guard");
- assertNotNull(guard);
-
- Integer newCount = (Integer) guard.get(VfModuleDelete.PAYLOAD_KEY_VF_COUNT);
+ Integer newCount = (Integer) payload.get(VfModuleDelete.PAYLOAD_KEY_VF_COUNT);
assertNotNull(newCount);
assertEquals(origCount - 1, newCount.intValue());
}
*/
protected CompletableFuture<OperationOutcome> startGuardAsync() {
// get the guard payload
- Map<String, Object> guardPayload = makeGuardPayload();
-
- // wrap it in a "resource"
- Map<String, Object> resource = new LinkedHashMap<>();
- resource.put("guard", guardPayload);
-
- Map<String, Object> payload = new LinkedHashMap<>();
- payload.put("resource", resource);
+ Map<String, Object> payload = makeGuardPayload();
/*
* Note: can't use constants from actor.guard, because that would create a
protected Map<String, Object> makeGuardPayload() {
Map<String, Object> guard = new LinkedHashMap<>();
guard.put("actor", params.getActor());
- guard.put("recipe", params.getOperation());
+ guard.put("operation", params.getOperation());
guard.put("target", params.getTargetEntity());
guard.put("requestId", params.getRequestId());
Map<String, Object> payload = params.getPayload();
assertNotNull(payload);
- @SuppressWarnings("unchecked")
- Map<String, Object> resource = (Map<String, Object>) payload.get("resource");
- assertNotNull(resource);
-
- @SuppressWarnings("unchecked")
- Map<String, Object> guard = (Map<String, Object>) resource.get("guard");
- assertEquals(oper.makeGuardPayload(), guard);
+ assertEquals(oper.makeGuardPayload(), payload);
}
@Test
// request id changes, so remove it
payload.remove("requestId");
- assertEquals("{actor=my-actor, recipe=my-operation, target=my-entity}", payload.toString());
+ assertEquals("{actor=my-actor, operation=my-operation, target=my-entity}", payload.toString());
// repeat, but with closed loop name
event.setClosedLoopControlName("my-loop");
payload = oper.makeGuardPayload();
payload.remove("requestId");
- assertEquals("{actor=my-actor, recipe=my-operation, target=my-entity, clname=my-loop}", payload.toString());
+ assertEquals("{actor=my-actor, operation=my-operation, target=my-entity, clname=my-loop}", payload.toString());
}
@Test