verify schema validation for any policy type 64/115064/2
authorjhh <jorge.hernandez-herrero@att.com>
Wed, 18 Nov 2020 22:40:39 +0000 (16:40 -0600)
committerjhh <jorge.hernandez-herrero@att.com>
Wed, 18 Nov 2020 23:08:33 +0000 (17:08 -0600)
Issue-ID: POLICY-2880
Signed-off-by: jhh <jorge.hernandez-herrero@att.com>
Change-Id: I0cc6e8967d42d347415857dc77976f2b8ab86516
Signed-off-by: jhh <jorge.hernandez-herrero@att.com>
feature-lifecycle/src/main/java/org/onap/policy/drools/server/restful/RestLifecycleManager.java
feature-lifecycle/src/test/java/org/onap/policy/drools/server/restful/RestLifecycleManagerTest.java
feature-lifecycle/src/test/resources/lifecycle.kmodule
feature-lifecycle/src/test/resources/schemas/onap.policies.typeA-1.0.0.schema.json [new file with mode: 0644]
feature-lifecycle/src/test/resources/tosca-policy-other-unvalidated.json [moved from feature-lifecycle/src/test/resources/tosca-policy-other.json with 77% similarity]
feature-lifecycle/src/test/resources/tosca-policy-other-validated.json [new file with mode: 0644]
feature-lifecycle/src/test/resources/tosca-policy-other-validation-error.json [new file with mode: 0644]

index 957ecfa..b430533 100644 (file)
@@ -286,8 +286,10 @@ public class RestLifecycleManager {
         List<ToscaPolicy> policies =
                 LifecycleFeature.fsm.getPoliciesMap().values().stream().collect(Collectors.toList());
         policies.add(toscaPolicy);
-        return Response.status(Response.Status.OK)
-                       .entity(LifecycleFeature.fsm.update(getPolicyUpdate(policies)))
+
+        boolean updateResult = LifecycleFeature.fsm.update(getPolicyUpdate(policies));
+        return Response.status((updateResult ? Response.Status.OK : Response.Status.NOT_ACCEPTABLE))
+                       .entity(updateResult)
                        .build();
     }
 
index 0751eb5..3a04c31 100644 (file)
@@ -18,6 +18,7 @@
 
 package org.onap.policy.drools.server.restful;
 
+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.assertFalse;
@@ -76,9 +77,17 @@ public class RestLifecycleManagerTest {
     private static final String EXAMPLE_NATIVE_ARTIFACT_POLICY_JSON =
             "src/test/resources/tosca-policy-native-artifact-example.json";
 
-    private static final String EXAMPLE_OTHER_POLICY_NAME = "other";
-    private static final String EXAMPLE_OTHER_POLICY_JSON =
-            "src/test/resources/tosca-policy-other.json";
+    private static final String EXAMPLE_OTHER_UNVAL_POLICY_NAME = "other-unvalidated";
+    private static final String EXAMPLE_OTHER_UNVAL_POLICY_JSON =
+            "src/test/resources/tosca-policy-other-unvalidated.json";
+
+    private static final String EXAMPLE_OTHER_VAL_POLICY_NAME = "other-validated";
+    private static final String EXAMPLE_OTHER_VAL_POLICY_JSON =
+            "src/test/resources/tosca-policy-other-validated.json";
+
+    private static final String EXAMPLE_OTHER_VAL_ERROR_POLICY_NAME = "other-validation-error";
+    private static final String EXAMPLE_OTHER_VAL_ERROR_POLICY_JSON =
+            "src/test/resources/tosca-policy-other-validation-error.json";
 
     private static final String OP_POLICY_NAME_VCPE = "operational.restart";
     private static final String VCPE_OPERATIONAL_DROOLS_POLICY_JSON =
@@ -216,11 +225,12 @@ public class RestLifecycleManagerTest {
 
         /* verify new supported operational policy types */
 
-        resourceLists("policyTypes", 4);
+        resourceLists("policyTypes", 5);
         get("policyTypes/onap.policies.native.drools.Artifact/1.0.0", Status.OK.getStatusCode());
         get("policyTypes/onap.policies.native.drools.Controller/1.0.0", Status.OK.getStatusCode());
         get("policyTypes/onap.policies.controlloop.operational.common.Drools/1.0.0", Status.OK.getStatusCode());
         get("policyTypes/onap.policies.type1.type2/1.0.0", Status.OK.getStatusCode());
+        get("policyTypes/onap.policies.typeA/1.0.0", Status.OK.getStatusCode());
 
         /* verify controller and artifact policies */
 
@@ -237,10 +247,24 @@ public class RestLifecycleManagerTest {
         }
         testNotNativePolicy(opPolicy);
 
-        /* add tosca "other" of policy type "other" with no attached type schema */
+        /* add tosca policy "other-unvalidated" of policy type "type1.type2" with no attached type schema */
+
+        testNotNativePolicy(getPolicyFromFile(EXAMPLE_OTHER_UNVAL_POLICY_JSON, EXAMPLE_OTHER_UNVAL_POLICY_NAME));
+
+        /* add tosca policy "other-validated" of policy type "typeA" with an attached type schema */
+
+        testNotNativePolicy(getPolicyFromFile(EXAMPLE_OTHER_VAL_POLICY_JSON, EXAMPLE_OTHER_VAL_POLICY_NAME));
 
-        ToscaPolicy otherPolicy = getPolicyFromFile(EXAMPLE_OTHER_POLICY_JSON, EXAMPLE_OTHER_POLICY_NAME);
-        testNotNativePolicy(otherPolicy);
+        /* try to add invalid tosca policy "other-validation-error" of policy type "typeA" */
+
+        ToscaPolicy toscaPolicyValError =
+                getPolicyFromFile(EXAMPLE_OTHER_VAL_ERROR_POLICY_JSON, EXAMPLE_OTHER_VAL_ERROR_POLICY_NAME);
+        assertThat(
+                listPost("policies/operations/validation", toString(toscaPolicyValError),
+                        Status.NOT_ACCEPTABLE.getStatusCode())).isNotEmpty();
+
+        booleanPost("policies", toString(toscaPolicyValError),
+                Status.NOT_ACCEPTABLE.getStatusCode(), Boolean.FALSE);
 
         /* individual deploy/undeploy operations */
 
@@ -278,6 +302,7 @@ public class RestLifecycleManagerTest {
         get("policyTypes/onap.policies.native.drools.Controller/1.0.0", Status.OK.getStatusCode());
         get("policyTypes/onap.policies.controlloop.operational.common.Drools/1.0.0", Status.NOT_FOUND.getStatusCode());
         get("policyTypes/onap.policies.type1.type2/1.0.0", Status.NOT_FOUND.getStatusCode());
+        get("policyTypes/onap.policies.typeA/1.0.0", Status.NOT_FOUND.getStatusCode());
 
         resourceLists("policies", 1);
         get("policies/" + opPolicy.getName() + "/" + opPolicy.getVersion(), Status.NOT_FOUND.getStatusCode());
@@ -293,6 +318,7 @@ public class RestLifecycleManagerTest {
         get("policyTypes/onap.policies.native.drools.Controller/1.0.0", Status.OK.getStatusCode());
         get("policyTypes/onap.policies.controlloop.operational.common.Drools/1.0.0", Status.NOT_FOUND.getStatusCode());
         get("policyTypes/onap.policies.type1.type2/1.0.0", Status.NOT_FOUND.getStatusCode());
+        get("policyTypes/onap.policies.typeA/1.0.0", Status.NOT_FOUND.getStatusCode());
 
         resourceLists("policies", 0);
         get("policies/" + opPolicy.getName() + "/" + opPolicy.getVersion(), Status.NOT_FOUND.getStatusCode());
@@ -301,17 +327,17 @@ public class RestLifecycleManagerTest {
 
         assertThatIllegalArgumentException().isThrownBy(() -> PolicyControllerConstants.getFactory().get("lifecycle"));
         opPolicy.getMetadata().remove("policy-id");
-        assertFalse(
+        assertThat(
             listPost("policies/operations/validation", toString(opPolicy),
-                    Status.NOT_ACCEPTABLE.getStatusCode()).isEmpty());
+                    Status.NOT_ACCEPTABLE.getStatusCode())).isNotEmpty();
     }
 
-    private void testNotNativePolicy(ToscaPolicy opPolicy) throws CoderException {
-        assertTrue(
-            listPost("policies/operations/validation", toString(opPolicy),
-                    Status.OK.getStatusCode()).isEmpty());
+    private void testNotNativePolicy(ToscaPolicy toscaPolicy) throws CoderException {
+        assertThat(
+            listPost("policies/operations/validation", toString(toscaPolicy),
+                    Status.OK.getStatusCode())).isEmpty();
 
-        booleanPost("policies", toString(opPolicy), Status.OK.getStatusCode(), Boolean.TRUE);
+        booleanPost("policies", toString(toscaPolicy), Status.OK.getStatusCode(), Boolean.TRUE);
         assertTrue(PolicyControllerConstants.getFactory().get("lifecycle").isAlive());
         assertTrue(PolicyControllerConstants.getFactory().get("lifecycle").getDrools().isBrained());
         assertEquals(1,
@@ -319,18 +345,18 @@ public class RestLifecycleManagerTest {
                 .getFactory().get("lifecycle").getDrools().facts("junits", ToscaPolicy.class).size());
 
         resourceLists("policies", 3);
-        get("policies/" + opPolicy.getName() + "/" + opPolicy.getVersion(), Status.OK.getStatusCode());
+        get("policies/" + toscaPolicy.getName() + "/" + toscaPolicy.getVersion(), Status.OK.getStatusCode());
         get("policies/example.controller/1.0.0", Status.OK.getStatusCode());
         get("policies/example.artifact/1.0.0", Status.OK.getStatusCode());
 
-        booleanDelete("policies/" + opPolicy.getName() + "/" + opPolicy.getVersion(),
+        booleanDelete("policies/" + toscaPolicy.getName() + "/" + toscaPolicy.getVersion(),
                 Status.OK.getStatusCode(), Boolean.TRUE);
         assertEquals(0,
             PolicyControllerConstants
                 .getFactory().get("lifecycle").getDrools().facts("junits", ToscaPolicy.class).size());
 
         resourceLists("policies", 2);
-        get("policies/" + opPolicy.getName() + "/" + opPolicy.getVersion(), Status.NOT_FOUND.getStatusCode());
+        get("policies/" + toscaPolicy.getName() + "/" + toscaPolicy.getVersion(), Status.NOT_FOUND.getStatusCode());
         get("policies/example.controller/1.0.0", Status.OK.getStatusCode());
         get("policies/example.artifact/1.0.0", Status.OK.getStatusCode());
     }
index 529730b..56ca092 100644 (file)
@@ -3,7 +3,7 @@
   ============LICENSE_START=======================================================
   feature-controller-logging
   ================================================================================
-  Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+  Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
   ================================================================================
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   -->
 
 <kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
-    <kbase name="onap.policies.controlloop.operational.common.Drools" default="false" equalsBehavior="equality"/>
+    <kbase name="onap.policies.typeA" default="false" equalsBehavior="equality"/>
+    <kbase name="onap.policies.controlloop.operational.common.Drools"
+        includes="onap.policies.typeA" default="false" equalsBehavior="equality"/>
     <kbase name="onap.policies.type1.type2" includes="onap.policies.controlloop.operational.common.Drools">
         <ksession name="junits" />
     </kbase>
-</kmodule>
+</kmodule>
\ No newline at end of file
diff --git a/feature-lifecycle/src/test/resources/schemas/onap.policies.typeA-1.0.0.schema.json b/feature-lifecycle/src/test/resources/schemas/onap.policies.typeA-1.0.0.schema.json
new file mode 100644 (file)
index 0000000..9171246
--- /dev/null
@@ -0,0 +1,106 @@
+{
+    "definitions": {},
+    "$schema": "http://json-schema.org/draft-07/schema#",
+    "$id": "http://www.onap.org/policy/models/schemas/onap.policies.typeA.schema.json",
+    "type": "object",
+    "title": "The Root Schema",
+    "required": [
+        "type",
+        "type_version",
+        "version",
+        "metadata",
+        "properties"
+    ],
+    "properties": {
+        "type": {
+            "$id": "#/properties/type",
+            "type": "string",
+            "title": "Policy Type",
+            "default": "onap.policies.typeA",
+            "examples": [
+                "onap.policies.typeA"
+            ],
+            "pattern": "^(.+)$"
+        },
+        "type_version": {
+            "$id": "#/properties/type_version",
+            "type": "string",
+            "title": "Policy Type Version",
+            "default": "1.0.0",
+            "examples": [
+                "1.0.0"
+            ],
+            "pattern": "^(.+)$"
+        },
+        "name": {
+            "$id": "#/properties/name",
+            "type": "string",
+            "title": "Policy Name",
+            "default": "",
+            "examples": [
+                "example"
+            ],
+            "pattern": "^(.*)$"
+        },
+        "version": {
+            "$id": "#/properties/version",
+            "type": "string",
+            "title": "Policy Version",
+            "default": "1.0.0",
+            "examples": [
+                "1.0.0"
+            ],
+            "pattern": "^(.+)$"
+        },
+        "metadata": {
+            "$id": "#/properties/metadata",
+            "type": "object",
+            "title": "Metadata",
+            "required": [
+                "policy-id"
+            ],
+            "properties": {
+                "policy-id": {
+                    "$id": "#/properties/metadata/properties/policy-id",
+                    "type": "string",
+                    "title": "Policy ID",
+                    "examples": [
+                        "operational.restart"
+                    ],
+                    "pattern": "^(.+)$"
+                }
+            }
+        },
+        "properties": {
+            "$id": "#/properties/properties",
+            "type": "object",
+            "title": "Properties",
+            "required": [
+                "fieldA",
+                "fieldB"
+            ],
+            "properties": {
+                "fieldA": {
+                    "$id": "#/properties/properties/properties/fieldA",
+                    "type": "string",
+                    "title": "Field A",
+                    "examples": [
+                        "FieldA"
+                    ],
+                    "pattern": "^(.+)$"
+                },
+                "fieldB": {
+                    "$id": "#/properties/properties/properties/fieldB",
+                    "type": "integer",
+                    "title": "Timeout in seconds",
+                    "minimum": 1,
+                    "maximum": 5,
+                    "default": 1,
+                    "examples": [
+                        3
+                    ]
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
@@ -3,13 +3,13 @@
     "topology_template": {
         "policies": [
             {
-                "other": {
+                "other-unvalidated": {
                     "type": "onap.policies.type1.type2",
                     "type_version": "1.0.0",
-                    "name": "other",
+                    "name": "other-unvalidated",
                     "version": "1.0.0",
                     "metadata": {
-                        "policy-id": "other"
+                        "policy-id": "other-unvalidated"
                     },
                     "properties": {
                         "field1": "abc",
diff --git a/feature-lifecycle/src/test/resources/tosca-policy-other-validated.json b/feature-lifecycle/src/test/resources/tosca-policy-other-validated.json
new file mode 100644 (file)
index 0000000..e79435c
--- /dev/null
@@ -0,0 +1,22 @@
+{
+    "tosca_definitions_version": "tosca_simple_yaml_1_0_0",
+    "topology_template": {
+        "policies": [
+            {
+                "other-validated": {
+                    "type": "onap.policies.typeA",
+                    "type_version": "1.0.0",
+                    "name": "other-validated",
+                    "version": "1.0.0",
+                    "metadata": {
+                        "policy-id": "other-validated"
+                    },
+                    "properties": {
+                        "fieldA": "abc",
+                        "fieldB": 2
+                    }
+                }
+            }
+        ]
+    }
+}
diff --git a/feature-lifecycle/src/test/resources/tosca-policy-other-validation-error.json b/feature-lifecycle/src/test/resources/tosca-policy-other-validation-error.json
new file mode 100644 (file)
index 0000000..f7af04b
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "tosca_definitions_version": "tosca_simple_yaml_1_0_0",
+    "topology_template": {
+        "policies": [
+            {
+                "other-validation-error": {
+                    "type": "onap.policies.typeA",
+                    "type_version": "1.0.0",
+                    "name": "other-validation-error",
+                    "version": "1.0.0",
+                    "metadata": {
+                        "policy-id": "other-validation-error"
+                    },
+                    "properties": {
+                        "fieldA": "abc"
+                    }
+                }
+            }
+        ]
+    }
+}