package org.onap.policy.pap.main.rest;
+import com.google.gson.annotations.SerializedName;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
import javax.ws.rs.core.Response.Status;
+import lombok.Getter;
import org.onap.policy.common.parameters.BeanValidationResult;
+import org.onap.policy.common.parameters.BeanValidator;
import org.onap.policy.common.parameters.ObjectValidationResult;
import org.onap.policy.common.parameters.ValidationResult;
import org.onap.policy.common.parameters.ValidationStatus;
+import org.onap.policy.common.parameters.annotations.NotNull;
+import org.onap.policy.common.parameters.annotations.Pattern;
+import org.onap.policy.common.parameters.annotations.Valid;
+import org.onap.policy.common.utils.coder.CoderException;
+import org.onap.policy.common.utils.coder.StandardCoder;
import org.onap.policy.common.utils.services.Registry;
+import org.onap.policy.models.base.PfKey;
import org.onap.policy.models.base.PfModelException;
import org.onap.policy.models.base.PfModelRuntimeException;
import org.onap.policy.models.pap.concepts.PdpDeployPolicies;
*/
public class PdpGroupDeployProvider extends ProviderBase {
private static final Logger logger = LoggerFactory.getLogger(PdpGroupDeployProvider.class);
+ private static final StandardCoder coder = new StandardCoder();
private static final String POLICY_RESULT_NAME = "policy";
*/
public void updateGroupPolicies(DeploymentGroups groups) throws PfModelException {
ValidationResult result = groups.validatePapRest();
-
if (!result.isValid()) {
String msg = result.getResult().trim();
- logger.warn(msg);
throw new PfModelException(Status.BAD_REQUEST, msg);
}
* @throws PfModelException if an error occurred
*/
public void deployPolicies(PdpDeployPolicies policies) throws PfModelException {
+ try {
+ MyPdpDeployPolicies checked = coder.convert(policies, MyPdpDeployPolicies.class);
+ ValidationResult result = new BeanValidator().validateTop(PdpDeployPolicies.class.getSimpleName(), checked);
+ if (!result.isValid()) {
+ String msg = result.getResult().trim();
+ throw new PfModelException(Status.BAD_REQUEST, msg);
+ }
+ } catch (CoderException e) {
+ throw new PfModelException(Status.INTERNAL_SERVER_ERROR, "cannot decode request", e);
+ }
+
process(policies, this::deploySimplePolicies);
}
return false;
}
+
+ /*
+ * These are only used to validate the incoming request.
+ */
+
+ @Getter
+ public static class MyPdpDeployPolicies {
+ @NotNull
+ private List<@NotNull @Valid PolicyIdent> policies;
+ }
+
+ @Getter
+ public static class PolicyIdent {
+ @SerializedName("policy-id")
+ @NotNull
+ @Pattern(regexp = PfKey.NAME_REGEXP)
+ private String name;
+
+ @SerializedName("policy-version")
+ @Pattern(regexp = "\\d+([.]\\d+[.]\\d+)?")
+ private String version;
+ }
}
import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
public class TestPdpGroupDeployProvider extends ProviderSuper {
+
private static final String EXPECTED_EXCEPTION = "expected exception";
private static final String POLICY2_NAME = "policyB";
assertThatCode(() -> prov.deployPolicies(loadEmptyRequest())).doesNotThrowAnyException();
}
+ /**
+ * Tests deployPolicies() when the policies are invalid.
+ */
+ @Test
+ public void testDeployPoliciesInvalidPolicies() throws Exception {
+ // valid list
+ PdpDeployPolicies policies0 = loadFile("PapPoliciesList.json", PdpDeployPolicies.class);
+ assertThatCode(() -> prov.deployPolicies(policies0)).doesNotThrowAnyException();
+
+ // null list
+ PdpDeployPolicies policies = new PdpDeployPolicies();
+ assertThatThrownBy(() -> prov.deployPolicies(policies)).isInstanceOf(PfModelException.class)
+ .hasMessageContaining("policies");
+
+ // list containing null item
+ PdpDeployPolicies policies2 = loadFile("PapPoliciesNullItem.json", PdpDeployPolicies.class);
+ assertThatThrownBy(() -> prov.deployPolicies(policies2)).isInstanceOf(PfModelException.class)
+ .hasMessageContaining("policies").hasMessageContaining("null");
+
+ // list containing a policy with a null name
+ PdpDeployPolicies policies3 = loadFile("PapPoliciesNullPolicyName.json", PdpDeployPolicies.class);
+ assertThatThrownBy(() -> prov.deployPolicies(policies3)).isInstanceOf(PfModelException.class)
+ .hasMessageContaining("policies").hasMessageContaining("name").hasMessageContaining("null")
+ .hasMessageNotContaining("\"value\"");
+
+ // list containing a policy with an invalid name
+ PdpDeployPolicies policies4 = loadFile("PapPoliciesInvalidPolicyName.json", PdpDeployPolicies.class);
+ assertThatThrownBy(() -> prov.deployPolicies(policies4)).isInstanceOf(PfModelException.class)
+ .hasMessageContaining("policies").hasMessageContaining("name").hasMessageContaining("$ abc")
+ .hasMessageNotContaining("version");
+
+ // list containing a policy with an invalid version
+ PdpDeployPolicies policies5 = loadFile("PapPoliciesInvalidPolicyVersion.json", PdpDeployPolicies.class);
+ assertThatThrownBy(() -> prov.deployPolicies(policies5)).isInstanceOf(PfModelException.class)
+ .hasMessageContaining("policies").hasMessageContaining("version").hasMessageContaining("abc123")
+ .hasMessageNotContaining("name");
+ }
+
/**
* Tests deployPolicies() when the supported policy type uses a wild-card.
*