Build XACML PDP support for native xacml policy type
[policy/xacml-pdp.git] / main / src / main / java / org / onap / policy / pdpx / main / rest / XacmlPdpRestController.java
index f668411..ad6784b 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- * 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,6 +20,7 @@
 
 package org.onap.policy.pdpx.main.rest;
 
+import com.att.research.xacml.api.Request;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -73,7 +74,8 @@ import org.slf4j.LoggerFactory;
 public class XacmlPdpRestController {
     private static final Logger LOGGER = LoggerFactory.getLogger(XacmlPdpRestController.class);
     public static final String APPLICATION_YAML = "application/yaml";
-
+    public static final String APPLICATION_XACML_JSON = "application/xacml+json";
+    public static final String APPLICATION_XACML_XML = "application/xacml+xml";
 
     @GET
     @Path("/healthcheck")
@@ -188,6 +190,57 @@ public class XacmlPdpRestController {
         }
     }
 
+    /**
+     * Our native decision entry point.
+     *
+     * @param body Should be an Xacml Request object
+     * @param requestId Unique request id
+     * @return Xacml Response or ErrorResponse object
+     */
+    @POST
+    @Path("/xacml")
+    @Produces({XacmlPdpRestController.APPLICATION_XACML_JSON, XacmlPdpRestController.APPLICATION_XACML_XML})
+    @Consumes({XacmlPdpRestController.APPLICATION_XACML_JSON, XacmlPdpRestController.APPLICATION_XACML_XML})
+    @ApiOperation(value = "Fetch the decision using specified decision parameters",
+            notes = "Returns the policy decision from Policy Xacml PDP",
+            response = com.att.research.xacml.api.Response.class,
+            responseHeaders = {
+                    @ResponseHeader(name = "X-MinorVersion",
+                            description = "Used to request or communicate a MINOR version back from the client"
+                                    + " to the server, and from the server back to the client",
+                            response = String.class),
+                    @ResponseHeader(name = "X-PatchVersion",
+                            description = "Used only to communicate a PATCH version in a response for"
+                                    + " troubleshooting purposes only, and will not be provided by"
+                                    + " the client on request",
+                            response = String.class),
+                    @ResponseHeader(name = "X-LatestVersion",
+                            description = "Used only to communicate an API's latest version", response = String.class),
+                    @ResponseHeader(name = "X-ONAP-RequestID",
+                            description = "Used to track REST transactions for logging purpose",
+                            response = UUID.class)},
+            authorizations = @Authorization(value = "basicAuth"), tags = {"Decision",},
+            extensions = {@Extension(name = "interface info",
+                    properties = {@ExtensionProperty(name = "pdpx-version", value = "1.0.0"),
+                            @ExtensionProperty(name = "last-mod-release", value = "Frankfurt")})})
+    @ApiResponses(value = {@ApiResponse(code = 400, message = "Bad Request", response = ErrorResponse.class),
+            @ApiResponse(code = 401, message = "Authentication Error"),
+            @ApiResponse(code = 403, message = "Authorization Error"),
+            @ApiResponse(code = 500, message = "Internal Server Error")})
+    public Response xacml(Request body,
+            @HeaderParam("X-ONAP-RequestID") @ApiParam("RequestID for http transaction") UUID requestId) {
+        try {
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(Response.Status.OK)), requestId)
+                    .entity(new DecisionProvider().fetchNativeDecision(body)).build();
+        } catch (DecisionException e) {
+            LOGGER.error("Decision exception", e);
+            XacmlPdpStatisticsManager.getCurrent().updateErrorCount();
+            return addLoggingHeaders(
+                    addVersionControlHeaders(Response.status((e.getErrorResponse().getResponseCode()))), requestId)
+                    .entity(e.getErrorResponse()).build();
+        }
+    }
+
     private ResponseBuilder addVersionControlHeaders(ResponseBuilder rb) {
         return rb.header("X-MinorVersion", "0").header("X-PatchVersion", "0").header("X-LatestVersion", "1.0.0");
     }