From f01256145bd9abb97cb9fba3019dcaccaeeca509 Mon Sep 17 00:00:00 2001 From: jhh Date: Wed, 18 Nov 2020 16:40:39 -0600 Subject: verify schema validation for any policy type Issue-ID: POLICY-2880 Signed-off-by: jhh Change-Id: I0cc6e8967d42d347415857dc77976f2b8ab86516 Signed-off-by: jhh --- .../server/restful/RestLifecycleManager.java | 6 +- .../server/restful/RestLifecycleManagerTest.java | 60 ++++++++---- .../src/test/resources/lifecycle.kmodule | 8 +- .../schemas/onap.policies.typeA-1.0.0.schema.json | 106 +++++++++++++++++++++ .../resources/tosca-policy-other-unvalidated.json | 22 +++++ .../resources/tosca-policy-other-validated.json | 22 +++++ .../tosca-policy-other-validation-error.json | 21 ++++ .../src/test/resources/tosca-policy-other.json | 22 ----- 8 files changed, 223 insertions(+), 44 deletions(-) create mode 100644 feature-lifecycle/src/test/resources/schemas/onap.policies.typeA-1.0.0.schema.json create mode 100644 feature-lifecycle/src/test/resources/tosca-policy-other-unvalidated.json create mode 100644 feature-lifecycle/src/test/resources/tosca-policy-other-validated.json create mode 100644 feature-lifecycle/src/test/resources/tosca-policy-other-validation-error.json delete mode 100644 feature-lifecycle/src/test/resources/tosca-policy-other.json (limited to 'feature-lifecycle') diff --git a/feature-lifecycle/src/main/java/org/onap/policy/drools/server/restful/RestLifecycleManager.java b/feature-lifecycle/src/main/java/org/onap/policy/drools/server/restful/RestLifecycleManager.java index 957ecfa6..b430533d 100644 --- a/feature-lifecycle/src/main/java/org/onap/policy/drools/server/restful/RestLifecycleManager.java +++ b/feature-lifecycle/src/main/java/org/onap/policy/drools/server/restful/RestLifecycleManager.java @@ -286,8 +286,10 @@ public class RestLifecycleManager { List 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(); } diff --git a/feature-lifecycle/src/test/java/org/onap/policy/drools/server/restful/RestLifecycleManagerTest.java b/feature-lifecycle/src/test/java/org/onap/policy/drools/server/restful/RestLifecycleManagerTest.java index 0751eb54..3a04c313 100644 --- a/feature-lifecycle/src/test/java/org/onap/policy/drools/server/restful/RestLifecycleManagerTest.java +++ b/feature-lifecycle/src/test/java/org/onap/policy/drools/server/restful/RestLifecycleManagerTest.java @@ -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()); } diff --git a/feature-lifecycle/src/test/resources/lifecycle.kmodule b/feature-lifecycle/src/test/resources/lifecycle.kmodule index 529730bd..56ca0923 100644 --- a/feature-lifecycle/src/test/resources/lifecycle.kmodule +++ b/feature-lifecycle/src/test/resources/lifecycle.kmodule @@ -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. @@ -20,8 +20,10 @@ --> - + + - + \ 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 index 00000000..91712460 --- /dev/null +++ b/feature-lifecycle/src/test/resources/schemas/onap.policies.typeA-1.0.0.schema.json @@ -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 diff --git a/feature-lifecycle/src/test/resources/tosca-policy-other-unvalidated.json b/feature-lifecycle/src/test/resources/tosca-policy-other-unvalidated.json new file mode 100644 index 00000000..64a59b2a --- /dev/null +++ b/feature-lifecycle/src/test/resources/tosca-policy-other-unvalidated.json @@ -0,0 +1,22 @@ +{ + "tosca_definitions_version": "tosca_simple_yaml_1_0_0", + "topology_template": { + "policies": [ + { + "other-unvalidated": { + "type": "onap.policies.type1.type2", + "type_version": "1.0.0", + "name": "other-unvalidated", + "version": "1.0.0", + "metadata": { + "policy-id": "other-unvalidated" + }, + "properties": { + "field1": "abc", + "field2": 2 + } + } + } + ] + } +} 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 index 00000000..e79435c6 --- /dev/null +++ b/feature-lifecycle/src/test/resources/tosca-policy-other-validated.json @@ -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 index 00000000..f7af04bb --- /dev/null +++ b/feature-lifecycle/src/test/resources/tosca-policy-other-validation-error.json @@ -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" + } + } + } + ] + } +} diff --git a/feature-lifecycle/src/test/resources/tosca-policy-other.json b/feature-lifecycle/src/test/resources/tosca-policy-other.json deleted file mode 100644 index 33aed19b..00000000 --- a/feature-lifecycle/src/test/resources/tosca-policy-other.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "tosca_definitions_version": "tosca_simple_yaml_1_0_0", - "topology_template": { - "policies": [ - { - "other": { - "type": "onap.policies.type1.type2", - "type_version": "1.0.0", - "name": "other", - "version": "1.0.0", - "metadata": { - "policy-id": "other" - }, - "properties": { - "field1": "abc", - "field2": 2 - } - } - } - ] - } -} -- cgit 1.2.3-korg