Created a new simplified API for creating policies 31/96831/1
authorChenfei Gao <cgao@research.att.com>
Wed, 9 Oct 2019 20:36:05 +0000 (16:36 -0400)
committerChenfei Gao <cgao@research.att.com>
Wed, 9 Oct 2019 20:36:20 +0000 (16:36 -0400)
Added a new endpoint to create multiple policies in one call
Added corresponding provider method
Added corresponding junit tests

Issue-ID: POLICY-1991
Change-Id: I09202ededfd88cf9f1ac62ea036e98e3b5d78f98
Signed-off-by: Chenfei Gao <cgao@research.att.com>
main/src/main/java/org/onap/policy/api/main/rest/ApiRestController.java
main/src/main/java/org/onap/policy/api/main/rest/provider/PolicyProvider.java
main/src/test/java/org/onap/policy/api/main/rest/TestApiRestServer.java
main/src/test/java/org/onap/policy/api/main/rest/provider/TestPolicyProvider.java

index 8c3d55f..67baa8a 100644 (file)
@@ -938,6 +938,69 @@ public class ApiRestController extends CommonRestController {
         }\r
     }\r
 \r
+    /**\r
+     * Creates one or more new policies in one call.\r
+     *\r
+     * @param body the body of policy following TOSCA definition\r
+     *\r
+     * @return the Response object containing the results of the API operation\r
+     */\r
+    @POST\r
+    @Path("/policies")\r
+    @ApiOperation(value = "Create one or more new policies",\r
+            notes = "Client should provide TOSCA body of the new polic(ies)",\r
+            authorizations = @Authorization(value = "basicAuth"),\r
+            tags = { "Policy", },\r
+            response = ToscaServiceTemplate.class,\r
+            responseHeaders = {\r
+                    @ResponseHeader(name = "X-MinorVersion",\r
+                                    description = "Used to request or communicate a MINOR version back from the client"\r
+                                                + " to the server, and from the server back to the client",\r
+                                    response = String.class),\r
+                    @ResponseHeader(name = "X-PatchVersion",\r
+                                    description = "Used only to communicate a PATCH version in a response for"\r
+                                                + " troubleshooting purposes only, and will not be provided by"\r
+                                                + " the client on request",\r
+                                    response = String.class),\r
+                    @ResponseHeader(name = "X-LatestVersion",\r
+                                    description = "Used only to communicate an API's latest version",\r
+                                    response = String.class),\r
+                    @ResponseHeader(name = "X-ONAP-RequestID",\r
+                                    description = "Used to track REST transactions for logging purpose",\r
+                                    response = UUID.class)\r
+            },\r
+            extensions = {\r
+                    @Extension(name = "interface info", properties = {\r
+                            @ExtensionProperty(name = "api-version", value = "1.0.0"),\r
+                            @ExtensionProperty(name = "last-mod-release", value = "El Alto")\r
+                    })\r
+            })\r
+    @ApiResponses(value = {\r
+            @ApiResponse(code = 400, message = "Invalid Body"),\r
+            @ApiResponse(code = 401, message = "Authentication Error"),\r
+            @ApiResponse(code = 403, message = "Authorization Error"),\r
+            @ApiResponse(code = 404, message = "Resource Not Found"),\r
+            @ApiResponse(code = 500, message = "Internal Server Error")\r
+        })\r
+    public Response createPolicies(\r
+            @HeaderParam("X-ONAP-RequestID") @ApiParam("RequestID for http transaction") UUID requestId,\r
+            @ApiParam(value = "Entity body of policy", required = true) ToscaServiceTemplate body) {\r
+\r
+        if (NetLoggerUtil.getNetworkLogger().isInfoEnabled()) {\r
+            NetLoggerUtil.log(EventType.IN, CommInfrastructure.REST, "/policies", toJson(body));\r
+        }\r
+\r
+        try (PolicyProvider policyProvider = new PolicyProvider()) {\r
+            ToscaServiceTemplate serviceTemplate = policyProvider.createPolicies(body);\r
+            updateApiStatisticsCounter(Target.POLICY, Result.SUCCESS, HttpMethod.POST);\r
+            return makeOkResponse(requestId, serviceTemplate);\r
+        } catch (PfModelException | PfModelRuntimeException pfme) {\r
+            LOGGER.error("POST /policies", pfme);\r
+            updateApiStatisticsCounter(Target.POLICY, Result.FAILURE, HttpMethod.POST);\r
+            return makeErrorResponse(requestId, pfme);\r
+        }\r
+    }\r
+\r
     /**\r
      * Deletes the specified version of a particular policy.\r
      *\r
index 66fd7f0..99dcd71 100644 (file)
@@ -144,6 +144,20 @@ public class PolicyProvider extends CommonModelProvider {
         return modelsProvider.createPolicies(body);\r
     }\r
 \r
+    /**\r
+     * Creates one or more new policies.\r
+     *\r
+     * @param body the entity body of policy\r
+     *\r
+     * @return the ToscaServiceTemplate object\r
+     *\r
+     * @throws PfModelException the PfModel parsing exception\r
+     */\r
+    public ToscaServiceTemplate createPolicies(ToscaServiceTemplate body) throws PfModelException {\r
+\r
+        return modelsProvider.createPolicies(body);\r
+    }\r
+\r
     /**\r
      * Deletes the policy matching specified ID and version of both policy type and policy.\r
      *\r
index b065277..6e51e36 100644 (file)
@@ -151,6 +151,7 @@ public class TestApiRestServer {
             + "onap.policies.controlloop.Operational/versions/1.0.0/policies/operational.scaleout/versions/1";
     private static final String OPS_POLICIES_VFIREWALL_VERSION = "policytypes/"
             + "onap.policies.controlloop.Operational/versions/1.0.0/policies/operational.modifyconfig/versions/1";
+    private static final String POLICIES = "policies";
 
     private static final String KEYSTORE = System.getProperty("user.dir") + "/src/test/resources/ssl/policy-keystore";
     private static final CommonTestData COMMON_TEST_DATA = new CommonTestData();
@@ -170,6 +171,11 @@ public class TestApiRestServer {
         "policies/vFirewall.policy.monitoring.input.tosca.yaml"
     };
 
+    private String[] toscaPoliciesResourceNames = {
+        "policies/vCPE.policies.optimization.input.tosca.json",
+        "policies/vCPE.policies.optimization.input.tosca.yaml"
+    };
+
     private String[] toscaPolicyTypeResourceNames = {
         "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app.yaml",
         "policytypes/onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server.yaml",
@@ -291,6 +297,44 @@ public class TestApiRestServer {
         }
     }
 
+    @Test
+    public void testCreatePoliciesPersistent() throws Exception {
+        setupParameters(); // setup DB
+        main = startApiService(true);
+        for (String resrcName : toscaPolicyResourceNames) {
+            Response rawResponse = createResource(POLICYTYPES_TCA_POLICIES, resrcName, true);
+            assertEquals(Response.Status.OK.getStatusCode(), rawResponse.getStatus());
+            ToscaServiceTemplate response = rawResponse.readEntity(ToscaServiceTemplate.class);
+            assertNotNull(response);
+            assertFalse(response.getToscaTopologyTemplate().getPolicies().isEmpty());
+        }
+    }
+
+    @Test
+    public void testSimpleCreatePolicies() throws Exception {
+        main = startApiService(true);
+        for (String resrcName : toscaPoliciesResourceNames) {
+            Response rawResponse = createResource(POLICIES, resrcName, true);
+            assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
+            ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
+            assertEquals("policy type onap.policies.optimization.AffinityPolicy:0.0.0 for "
+                + "policy OSDF_CASABLANCA.Affinity_vCPE_1:1.0.0 does not exist", error.getErrorMessage());
+        }
+    }
+
+    @Test
+    public void testSimpleCreatePoliciesPersistent() throws Exception {
+        setupParameters(); // setup DB
+        main = startApiService(true);
+        for (String resrcName : toscaPoliciesResourceNames) {
+            Response rawResponse = createResource(POLICIES, resrcName, true);
+            assertEquals(Response.Status.OK.getStatusCode(), rawResponse.getStatus());
+            ToscaServiceTemplate response = rawResponse.readEntity(ToscaServiceTemplate.class);
+            assertNotNull(response);
+            assertFalse(response.getToscaTopologyTemplate().getPolicies().isEmpty());
+        }
+    }
+
     @Test
     public void testCreateGuardPolicies() {
         try {
@@ -377,6 +421,44 @@ public class TestApiRestServer {
         }
     }
 
+    @Test
+    public void testHttpsCreatePoliciesPersistent() throws Exception {
+        setupParameters(); // setup DB
+        main = startApiService(false);
+        for (String resrcName : toscaPolicyResourceNames) {
+            Response rawResponse = createResource(POLICYTYPES_TCA_POLICIES, resrcName, false);
+            assertEquals(Response.Status.OK.getStatusCode(), rawResponse.getStatus());
+            ToscaServiceTemplate response = rawResponse.readEntity(ToscaServiceTemplate.class);
+            assertNotNull(response);
+            assertFalse(response.getToscaTopologyTemplate().getPolicies().isEmpty());
+        }
+    }
+
+    @Test
+    public void testHttpsSimpleCreatePolicies() throws Exception {
+        main = startApiService(false);
+        for (String resrcName : toscaPoliciesResourceNames) {
+            Response rawResponse = createResource(POLICIES, resrcName, false);
+            assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
+            ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
+            assertEquals("policy type onap.policies.optimization.AffinityPolicy:0.0.0 for "
+                + "policy OSDF_CASABLANCA.Affinity_vCPE_1:1.0.0 does not exist", error.getErrorMessage());
+        }
+    }
+
+    @Test
+    public void testHttpsSimpleCreatePoliciesPersistent() throws Exception {
+        setupParameters(); // setup DB
+        main = startApiService(false);
+        for (String resrcName : toscaPoliciesResourceNames) {
+            Response rawResponse = createResource(POLICIES, resrcName, false);
+            assertEquals(Response.Status.OK.getStatusCode(), rawResponse.getStatus());
+            ToscaServiceTemplate response = rawResponse.readEntity(ToscaServiceTemplate.class);
+            assertNotNull(response);
+            assertFalse(response.getToscaTopologyTemplate().getPolicies().isEmpty());
+        }
+    }
+
     @Test
     public void testHttpsCreateGuardPolicies() {
         try {
index e81cbf4..2e43170 100644 (file)
@@ -75,6 +75,19 @@ public class TestPolicyProvider {
     private static final String POLICY_RESOURCE_WITH_BAD_POLICYTYPE_ID = "policies/vCPE.policy.bad.policytypeid.json";
     private static final String POLICY_RESOURCE_WITH_BAD_POLICYTYPE_VERSION =
             "policies/vCPE.policy.bad.policytypeversion.json";
+    private static final String MULTIPLE_POLICIES_RESOURCE = "policies/vCPE.policies.optimization.input.tosca.json";
+
+    // @formatter:off
+    private String[] toscaPolicyTypeResourceNames = {
+        "policytypes/onap.policies.optimization.AffinityPolicy.yaml",
+        "policytypes/onap.policies.optimization.DistancePolicy.yaml",
+        "policytypes/onap.policies.optimization.HpaPolicy.yaml",
+        "policytypes/onap.policies.optimization.QueryPolicy.yaml",
+        "policytypes/onap.policies.optimization.SubscriberPolicy.yaml",
+        "policytypes/onap.policies.optimization.Vim_fit.yaml",
+        "policytypes/onap.policies.optimization.VnfPolicy.yaml"
+    };
+    // @formatter:on
 
     /**
      * Initializes parameters.
@@ -268,6 +281,32 @@ public class TestPolicyProvider {
         }).doesNotThrowAnyException();
     }
 
+    @Test
+    public void testSimpleCreatePolicy() throws Exception {
+
+        String errorMessage = "policy type onap.policies.optimization.AffinityPolicy:0.0.0 for "
+            + "policy OSDF_CASABLANCA.Affinity_vCPE_1:1.0.0 does not exist";
+        assertThatThrownBy(() -> {
+            String multiPoliciesString = ResourceUtils.getResourceAsString(MULTIPLE_POLICIES_RESOURCE);
+            ToscaServiceTemplate multiPoliciesServiceTemplate =
+                    standardCoder.decode(multiPoliciesString, ToscaServiceTemplate.class);
+            policyProvider.createPolicies(multiPoliciesServiceTemplate);
+        }).hasMessage(errorMessage);
+
+        // Create required policy types
+        for (String policyTypeName : toscaPolicyTypeResourceNames) {
+            ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder.decode(
+                    ResourceUtils.getResourceAsString(policyTypeName), ToscaServiceTemplate.class);
+            policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
+        }
+
+        // Create multiple policies in one call
+        String multiPoliciesString = ResourceUtils.getResourceAsString(MULTIPLE_POLICIES_RESOURCE);
+        ToscaServiceTemplate multiPoliciesServiceTemplate =
+                standardCoder.decode(multiPoliciesString, ToscaServiceTemplate.class);
+        policyProvider.createPolicies(multiPoliciesServiceTemplate);
+    }
+
     @Test
     public void testDeletePolicy() {