Migrate pap startup & controllers to spring boot
[policy/pap.git] / main / src / main / java / org / onap / policy / pap / main / rest / PolicyStatusControllerV1.java
index bc83862..4322747 100644 (file)
@@ -2,8 +2,9 @@
  * ============LICENSE_START=======================================================
  * ONAP PAP
  * ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved.
  * Modifications Copyright (C) 2021 Nordix Foundation.
+ * Modifications Copyright (C) 2021 Bell Canada. 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.
@@ -21,6 +22,7 @@
 
 package org.onap.policy.pap.main.rest;
 
+import com.google.re2j.PatternSyntaxException;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import io.swagger.annotations.ApiResponse;
@@ -29,44 +31,55 @@ import io.swagger.annotations.Authorization;
 import io.swagger.annotations.Extension;
 import io.swagger.annotations.ExtensionProperty;
 import io.swagger.annotations.ResponseHeader;
-import java.util.List;
-import java.util.Optional;
+import java.util.Collection;
 import java.util.UUID;
-import javax.ws.rs.GET;
-import javax.ws.rs.HeaderParam;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.core.Response;
-import org.onap.policy.common.utils.services.Registry;
+import lombok.RequiredArgsConstructor;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.base.PfModelRuntimeException;
 import org.onap.policy.models.pap.concepts.PolicyStatus;
-import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
-import org.onap.policy.pap.main.PapConstants;
-import org.onap.policy.pap.main.notification.PolicyNotifier;
+import org.onap.policy.models.pdp.concepts.PdpPolicyStatus;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifierOptVersion;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
 
 /**
  * Class to provide REST end points for PAP component to retrieve the status of deployed
  * policies.
  */
+@RestController
+@RequestMapping(path = "/policy/pap/v1")
+@RequiredArgsConstructor
 public class PolicyStatusControllerV1 extends PapRestControllerV1 {
-    private final PolicyNotifier notifier;
+    private static final String EMPTY_REGEX_ERROR_MESSAGE = "An empty string passed as a regex is not allowed";
+    private static final String EMPTY_REGEX_WARNING = ". Empty string passed as Regex.";
+    private static final String GET_DEPLOYMENTS_FAILED = "get deployments failed";
 
-    public PolicyStatusControllerV1() {
-        this.notifier = Registry.get(PapConstants.REG_POLICY_NOTIFIER, PolicyNotifier.class);
-    }
+    private static final Logger logger = LoggerFactory.getLogger(PolicyStatusControllerV1.class);
+
+    private final PolicyStatusProvider provider;
 
     /**
-     * Queries status of all deployed policies.
+     * Queries status of all deployed policies. If regex is not null or empty, the function will only return
+     * policies that match regex
      *
      * @param requestId request ID used in ONAP logging
+     * @param regex regex for a policy name
      * @return a response
      */
     // @formatter:off
-    @GET
-    @Path("policies/deployed")
+    @GetMapping("policies/deployed")
     @ApiOperation(value = "Queries status of all deployed policies",
         notes = "Queries status of all deployed policies, returning success and failure counts of the PDPs",
         responseContainer = "List", response = PolicyStatus.class,
-        tags = {"Policy Administration (PAP) API"},
+        tags = {"Policy Deployment Status"},
         authorizations = @Authorization(value = AUTHORIZATION_TYPE),
         responseHeaders = {
             @ResponseHeader(name = VERSION_MINOR_NAME, description = VERSION_MINOR_DESCRIPTION,
@@ -77,22 +90,48 @@ public class PolicyStatusControllerV1 extends PapRestControllerV1 {
                             response = String.class),
             @ResponseHeader(name = REQUEST_ID_NAME, description = REQUEST_ID_HDR_DESCRIPTION,
                             response = UUID.class)},
-        extensions = {@Extension(name = EXTENSION_NAME,
-            properties = {@ExtensionProperty(name = API_VERSION_NAME, value = API_VERSION),
-                @ExtensionProperty(name = LAST_MOD_NAME, value = LAST_MOD_RELEASE)})})
-    @ApiResponses(value = {@ApiResponse(code = AUTHENTICATION_ERROR_CODE, message = AUTHENTICATION_ERROR_MESSAGE),
-                    @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE),
-                    @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE)})
+        extensions = {
+            @Extension(name = EXTENSION_NAME,
+                properties = {
+                    @ExtensionProperty(name = API_VERSION_NAME, value = API_VERSION),
+                    @ExtensionProperty(name = LAST_MOD_NAME, value = LAST_MOD_RELEASE)
+                })
+            })
+    @ApiResponses(value = {
+        @ApiResponse(code = AUTHENTICATION_ERROR_CODE, message = AUTHENTICATION_ERROR_MESSAGE),
+        @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE),
+        @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE)
+    })
     // @formatter:on
 
-    public Response queryAllDeployedPolicies(
-                    @HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) final UUID requestId) {
+    public ResponseEntity<Object> queryAllDeployedPolicies(
+        @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) @RequestHeader(
+            required = false,
+            value = REQUEST_ID_NAME) final UUID requestId,
+        @ApiParam(value = "Regex for a policy name") @RequestParam(required = false, value = "regex") String regex) {
+        try {
+            final Collection<PolicyStatus> result;
+            if (regex == null) {
+                result = provider.getStatus();
+            } else if (regex.isBlank()) {
+                return makeRegexNotFoundResponse(requestId);
+            } else {
+                result = provider.getByRegex(regex);
+            }
+            return makeListOrNotFoundResponse(requestId, result);
 
-        return addLoggingHeaders(addVersionControlHeaders(Response.status(Response.Status.OK)), requestId)
-                        .entity(notifier.getStatus()).build();
+        } catch (PfModelException | PfModelRuntimeException e) {
+            logger.warn(GET_DEPLOYMENTS_FAILED, e);
+            return addLoggingHeaders(
+                addVersionControlHeaders(ResponseEntity.status(e.getErrorResponse().getResponseCode().getStatusCode())),
+                requestId).body(e.getErrorResponse().getErrorMessage());
+        } catch (PatternSyntaxException e) {
+            logger.warn(GET_DEPLOYMENTS_FAILED, e);
+            return addLoggingHeaders(addVersionControlHeaders(ResponseEntity.status(HttpStatus.BAD_REQUEST)), requestId)
+                .body(e.getMessage());
+        }
     }
 
-
     /**
      * Queries status of specific deployed policies.
      *
@@ -100,12 +139,11 @@ public class PolicyStatusControllerV1 extends PapRestControllerV1 {
      * @return a response
      */
     // @formatter:off
-    @GET
-    @Path("policies/deployed/{name}")
+    @GetMapping("policies/deployed/{name}")
     @ApiOperation(value = "Queries status of specific deployed policies",
         notes = "Queries status of specific deployed policies, returning success and failure counts of the PDPs",
         responseContainer = "List", response = PolicyStatus.class,
-        tags = {"Policy Administration (PAP) API"},
+        tags = {"Policy Deployment Status"},
         authorizations = @Authorization(value = AUTHORIZATION_TYPE),
         responseHeaders = {
             @ResponseHeader(name = VERSION_MINOR_NAME, description = VERSION_MINOR_DESCRIPTION,
@@ -116,25 +154,40 @@ public class PolicyStatusControllerV1 extends PapRestControllerV1 {
                             response = String.class),
             @ResponseHeader(name = REQUEST_ID_NAME, description = REQUEST_ID_HDR_DESCRIPTION,
                             response = UUID.class)},
-        extensions = {@Extension(name = EXTENSION_NAME,
-            properties = {@ExtensionProperty(name = API_VERSION_NAME, value = API_VERSION),
-                @ExtensionProperty(name = LAST_MOD_NAME, value = LAST_MOD_RELEASE)})})
-    @ApiResponses(value = {@ApiResponse(code = AUTHENTICATION_ERROR_CODE, message = AUTHENTICATION_ERROR_MESSAGE),
-                    @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE),
-                    @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE)})
+        extensions = {
+            @Extension(name = EXTENSION_NAME,
+                properties = {
+                    @ExtensionProperty(name = API_VERSION_NAME, value = API_VERSION),
+                    @ExtensionProperty(name = LAST_MOD_NAME, value = LAST_MOD_RELEASE)
+                })
+            })
+    @ApiResponses(value = {
+        @ApiResponse(code = AUTHENTICATION_ERROR_CODE, message = AUTHENTICATION_ERROR_MESSAGE),
+        @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE),
+        @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE)
+    })
     // @formatter:on
 
-    public Response queryDeployedPolicies(
-                    @ApiParam(value = "Policy Id", required = true) @PathParam("name") String name,
-                    @HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) final UUID requestId) {
+    public ResponseEntity<Object> queryDeployedPolicies(
+                    @ApiParam(value = "Policy Id") @PathVariable("name") String name,
+                    @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) @RequestHeader(
+                        required = false,
+                        value = REQUEST_ID_NAME) final UUID requestId) {
 
-        List<PolicyStatus> result = notifier.getStatus(name);
-        if (result.isEmpty()) {
-            return makeNotFoundResponse(requestId);
+        try {
+            Collection<PolicyStatus> result = provider.getStatus(new ToscaConceptIdentifierOptVersion(name, null));
+            if (result.isEmpty()) {
+                return makeNotFoundResponse(requestId);
 
-        } else {
-            return addLoggingHeaders(addVersionControlHeaders(Response.status(Response.Status.OK)), requestId)
-                            .entity(result).build();
+            } else {
+                return addLoggingHeaders(addVersionControlHeaders(ResponseEntity.ok()), requestId).body(result);
+            }
+
+        } catch (PfModelException | PfModelRuntimeException e) {
+            logger.warn(GET_DEPLOYMENTS_FAILED, e);
+            return addLoggingHeaders(
+                addVersionControlHeaders(ResponseEntity.status(e.getErrorResponse().getResponseCode().getStatusCode())),
+                requestId).body(e.getErrorResponse().getErrorMessage());
         }
     }
 
@@ -146,11 +199,198 @@ public class PolicyStatusControllerV1 extends PapRestControllerV1 {
      * @return a response
      */
     // @formatter:off
-    @GET
-    @Path("policies/deployed/{name}/{version}")
+    @GetMapping("policies/deployed/{name}/{version}")
     @ApiOperation(value = "Queries status of a specific deployed policy",
         notes = "Queries status of a specific deployed policy, returning success and failure counts of the PDPs",
         response = PolicyStatus.class,
+        tags = {"Policy Deployment Status"},
+        authorizations = @Authorization(value = AUTHORIZATION_TYPE),
+        responseHeaders = {
+            @ResponseHeader(name = VERSION_MINOR_NAME, description = VERSION_MINOR_DESCRIPTION,
+                            response = String.class),
+            @ResponseHeader(name = VERSION_PATCH_NAME, description = VERSION_PATCH_DESCRIPTION,
+                            response = String.class),
+            @ResponseHeader(name = VERSION_LATEST_NAME, description = VERSION_LATEST_DESCRIPTION,
+                            response = String.class),
+            @ResponseHeader(name = REQUEST_ID_NAME, description = REQUEST_ID_HDR_DESCRIPTION,
+                            response = UUID.class)},
+        extensions = {
+            @Extension(name = EXTENSION_NAME,
+                properties = {
+                    @ExtensionProperty(name = API_VERSION_NAME, value = API_VERSION),
+                    @ExtensionProperty(name = LAST_MOD_NAME, value = LAST_MOD_RELEASE)
+                })
+            })
+    @ApiResponses(value = {
+        @ApiResponse(code = AUTHENTICATION_ERROR_CODE, message = AUTHENTICATION_ERROR_MESSAGE),
+        @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE),
+        @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE)
+    })
+    // @formatter:on
+
+    public ResponseEntity<Object> queryDeployedPolicy(@ApiParam(value = "Policy Id") @PathVariable("name") String name,
+                    @ApiParam(value = "Policy Version") @PathVariable("version") String version,
+                    @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) @RequestHeader(
+                        required = false,
+                        value = REQUEST_ID_NAME) final UUID requestId) {
+
+        try {
+            Collection<PolicyStatus> result = provider.getStatus(new ToscaConceptIdentifierOptVersion(name, version));
+            if (result.isEmpty()) {
+                return makeNotFoundResponse(requestId);
+
+            } else {
+                return addLoggingHeaders(addVersionControlHeaders(ResponseEntity.ok()), requestId)
+                    .body(result.iterator().next());
+            }
+
+        } catch (PfModelException | PfModelRuntimeException e) {
+            logger.warn(GET_DEPLOYMENTS_FAILED, e);
+            return addLoggingHeaders(
+                addVersionControlHeaders(ResponseEntity.status(e.getErrorResponse().getResponseCode().getStatusCode())),
+                requestId).body(e.getErrorResponse().getErrorMessage());
+        }
+    }
+
+
+    /**
+     * Queries status of all policies.
+     *
+     * @param requestId request ID used in ONAP logging
+     * @return a response
+     */
+    // @formatter:off
+    @GetMapping("policies/status")
+    @ApiOperation(value = "Queries status of policies in all PdpGroups",
+        notes = "Queries status of policies in all PdpGroups, "
+            + "returning status of policies in all the PDPs belonging to all PdpGroups",
+        responseContainer = "List", response = PdpPolicyStatus.class,
+        tags = {"Policy Status"},
+        authorizations = @Authorization(value = AUTHORIZATION_TYPE),
+        responseHeaders = {
+            @ResponseHeader(name = VERSION_MINOR_NAME, description = VERSION_MINOR_DESCRIPTION,
+                            response = String.class),
+            @ResponseHeader(name = VERSION_PATCH_NAME, description = VERSION_PATCH_DESCRIPTION,
+                            response = String.class),
+            @ResponseHeader(name = VERSION_LATEST_NAME, description = VERSION_LATEST_DESCRIPTION,
+                            response = String.class),
+            @ResponseHeader(name = REQUEST_ID_NAME, description = REQUEST_ID_HDR_DESCRIPTION,
+                            response = UUID.class)},
+        extensions = {
+            @Extension(name = EXTENSION_NAME,
+                properties = {
+                    @ExtensionProperty(name = API_VERSION_NAME, value = API_VERSION),
+                    @ExtensionProperty(name = LAST_MOD_NAME, value = LAST_MOD_RELEASE)
+                })
+            })
+    @ApiResponses(value = {
+        @ApiResponse(code = AUTHENTICATION_ERROR_CODE, message = AUTHENTICATION_ERROR_MESSAGE),
+        @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE),
+        @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE)
+    })
+    // @formatter:on
+
+    public ResponseEntity<Object> getStatusOfAllPolicies(
+        @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) @RequestHeader(
+            required = false,
+            value = REQUEST_ID_NAME) final UUID requestId) {
+
+        try {
+            return addLoggingHeaders(addVersionControlHeaders(ResponseEntity.ok()), requestId)
+                .body(provider.getPolicyStatus());
+
+        } catch (PfModelException | PfModelRuntimeException e) {
+            logger.warn(GET_DEPLOYMENTS_FAILED, e);
+            return addLoggingHeaders(
+                addVersionControlHeaders(ResponseEntity.status(e.getErrorResponse().getResponseCode().getStatusCode())),
+                requestId).body(e.getErrorResponse().getErrorMessage());
+        }
+    }
+
+    /**
+     * Queries status of policies in a specific PdpGroup. if regex is not null or empty, the function will only return
+     * policies that match regex
+     *
+     * @param pdpGroupName name of the PdpGroup
+     * @param requestId request ID used in ONAP logging
+     * @param regex regex for a policy name
+     * @return a response
+     */
+    // @formatter:off
+    @GetMapping("policies/status/{pdpGroupName}")
+    @ApiOperation(value = "Queries status of policies in a specific PdpGroup",
+        notes = "Queries status of policies in a specific PdpGroup, "
+            + "returning status of policies in all the PDPs belonging to the PdpGroup",
+        responseContainer = "List", response = PdpPolicyStatus.class,
+        tags = {"Policy Status"},
+        authorizations = @Authorization(value = AUTHORIZATION_TYPE),
+        responseHeaders = {
+            @ResponseHeader(name = VERSION_MINOR_NAME, description = VERSION_MINOR_DESCRIPTION,
+                            response = String.class),
+            @ResponseHeader(name = VERSION_PATCH_NAME, description = VERSION_PATCH_DESCRIPTION,
+                            response = String.class),
+            @ResponseHeader(name = VERSION_LATEST_NAME, description = VERSION_LATEST_DESCRIPTION,
+                            response = String.class),
+            @ResponseHeader(name = REQUEST_ID_NAME, description = REQUEST_ID_HDR_DESCRIPTION,
+                            response = UUID.class)},
+        extensions = {
+            @Extension(name = EXTENSION_NAME,
+                properties = {
+                    @ExtensionProperty(name = API_VERSION_NAME, value = API_VERSION),
+                    @ExtensionProperty(name = LAST_MOD_NAME, value = LAST_MOD_RELEASE)
+                })
+            })
+    @ApiResponses(value = {
+        @ApiResponse(code = AUTHENTICATION_ERROR_CODE, message = AUTHENTICATION_ERROR_MESSAGE),
+        @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE),
+        @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE)
+    })
+    // @formatter:on
+
+    public ResponseEntity<Object> getStatusOfPoliciesByGroup(
+        @ApiParam(value = "PDP Group Name") @PathVariable("pdpGroupName") String pdpGroupName,
+        @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) @RequestHeader(
+            required = false,
+            value = REQUEST_ID_NAME) final UUID requestId,
+        @ApiParam(value = "Regex for a policy name") @RequestParam(required = false, value = "regex") String regex) {
+
+        try {
+            final Collection<PdpPolicyStatus> result;
+            if (regex == null) {
+                result = provider.getPolicyStatus(pdpGroupName);
+            } else if (regex.isBlank()) {
+                return makeRegexNotFoundResponse(requestId);
+            } else {
+                result = provider.getPolicyStatusByRegex(pdpGroupName, regex);
+            }
+            return makeListOrNotFoundResponse(requestId, result);
+
+        } catch (PfModelException | PfModelRuntimeException e) {
+            logger.warn(GET_DEPLOYMENTS_FAILED, e);
+            return addLoggingHeaders(
+                addVersionControlHeaders(ResponseEntity.status(e.getErrorResponse().getResponseCode().getStatusCode())),
+                requestId).body(e.getErrorResponse().getErrorMessage());
+        } catch (PatternSyntaxException e) {
+            logger.warn(GET_DEPLOYMENTS_FAILED, e);
+            return addLoggingHeaders(addVersionControlHeaders(ResponseEntity.status(HttpStatus.BAD_REQUEST)), requestId)
+                .body(e.getMessage());
+        }
+    }
+
+    /**
+     * Queries status of all versions of a specific policy in a specific PdpGroup.
+     *
+     * @param pdpGroupName name of the PdpGroup
+     * @param policyName name of the Policy
+     * @param requestId request ID used in ONAP logging
+     * @return a response
+     */
+    // @formatter:off
+    @GetMapping("policies/status/{pdpGroupName}/{policyName}")
+    @ApiOperation(value = "Queries status of all versions of a specific policy in a specific PdpGroup",
+        notes = "Queries status of all versions of a specific policy in a specific PdpGroup,"
+            + " returning status of all versions of the policy in the PDPs belonging to the PdpGroup",
+        responseContainer = "List", response = PdpPolicyStatus.class,
         tags = {"Policy Administration (PAP) API"},
         authorizations = @Authorization(value = AUTHORIZATION_TYPE),
         responseHeaders = {
@@ -162,38 +402,136 @@ public class PolicyStatusControllerV1 extends PapRestControllerV1 {
                             response = String.class),
             @ResponseHeader(name = REQUEST_ID_NAME, description = REQUEST_ID_HDR_DESCRIPTION,
                             response = UUID.class)},
-        extensions = {@Extension(name = EXTENSION_NAME,
-            properties = {@ExtensionProperty(name = API_VERSION_NAME, value = API_VERSION),
-                @ExtensionProperty(name = LAST_MOD_NAME, value = LAST_MOD_RELEASE)})})
-    @ApiResponses(value = {@ApiResponse(code = AUTHENTICATION_ERROR_CODE, message = AUTHENTICATION_ERROR_MESSAGE),
-                    @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE),
-                    @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE)})
+        extensions = {
+            @Extension(name = EXTENSION_NAME,
+                properties = {
+                    @ExtensionProperty(name = API_VERSION_NAME, value = API_VERSION),
+                    @ExtensionProperty(name = LAST_MOD_NAME, value = LAST_MOD_RELEASE)
+                })
+            })
+    @ApiResponses(value = {
+        @ApiResponse(code = AUTHENTICATION_ERROR_CODE, message = AUTHENTICATION_ERROR_MESSAGE),
+        @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE),
+        @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE)
+    })
     // @formatter:on
 
-    public Response queryDeployedPolicy(@ApiParam(value = "Policy Id", required = true) @PathParam("name") String name,
-                    @ApiParam(value = "Policy Version", required = true) @PathParam("version") String version,
-                    @HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) final UUID requestId) {
+    public ResponseEntity<Object> getStatusOfPolicies(
+        @ApiParam(value = "PDP Group Name") @PathVariable("pdpGroupName") String pdpGroupName,
+        @ApiParam(value = "Policy Id") @PathVariable("policyName") String policyName,
+        @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) @RequestHeader(
+            required = false,
+            value = REQUEST_ID_NAME) final UUID requestId) {
 
-        ToscaConceptIdentifier ident = new ToscaConceptIdentifier(name, version);
-        Optional<PolicyStatus> result = notifier.getStatus(ident);
-        if (result.isPresent()) {
-            return addLoggingHeaders(addVersionControlHeaders(Response.status(Response.Status.OK)), requestId)
-                            .entity(result.get()).build();
+        try {
+            Collection<PdpPolicyStatus> result =
+                provider.getPolicyStatus(pdpGroupName, new ToscaConceptIdentifierOptVersion(policyName, null));
+            if (result.isEmpty()) {
+                return makeNotFoundResponse(requestId);
 
-        } else {
-            return makeNotFoundResponse(requestId);
+            } else {
+                return addLoggingHeaders(addVersionControlHeaders(ResponseEntity.ok()), requestId)
+                    .body(result);
+            }
+
+        } catch (PfModelException | PfModelRuntimeException e) {
+            logger.warn(GET_DEPLOYMENTS_FAILED, e);
+            return addLoggingHeaders(
+                addVersionControlHeaders(ResponseEntity.status(e.getErrorResponse().getResponseCode().getStatusCode())),
+                requestId).body(e.getErrorResponse().getErrorMessage());
         }
     }
 
 
+    /**
+     * Queries status of a specific version of a specific policy in a specific PdpGroup.
+     *
+     * @param pdpGroupName name of the PdpGroup
+     * @param policyName name of the Policy
+     * @param policyVersion version of the Policy
+     * @param requestId request ID used in ONAP logging
+     * @return a response
+     */
+    // @formatter:off
+    @GetMapping("policies/status/{pdpGroupName}/{policyName}/{policyVersion}")
+    @ApiOperation(value = "Queries status of a specific version of a specific policy in a specific PdpGroup",
+        notes = "Queries status of a specific version of a specific policy in a specific PdpGroup,"
+            + " returning status of the policy in the PDPs belonging to the PdpGroup",
+        response = PdpPolicyStatus.class,
+        tags = {"Policy Administration (PAP) API"},
+        authorizations = @Authorization(value = AUTHORIZATION_TYPE),
+        responseHeaders = {
+            @ResponseHeader(name = VERSION_MINOR_NAME, description = VERSION_MINOR_DESCRIPTION,
+                            response = String.class),
+            @ResponseHeader(name = VERSION_PATCH_NAME, description = VERSION_PATCH_DESCRIPTION,
+                            response = String.class),
+            @ResponseHeader(name = VERSION_LATEST_NAME, description = VERSION_LATEST_DESCRIPTION,
+                            response = String.class),
+            @ResponseHeader(name = REQUEST_ID_NAME, description = REQUEST_ID_HDR_DESCRIPTION,
+                            response = UUID.class)},
+        extensions = {
+            @Extension(name = EXTENSION_NAME,
+                properties = {
+                    @ExtensionProperty(name = API_VERSION_NAME, value = API_VERSION),
+                    @ExtensionProperty(name = LAST_MOD_NAME, value = LAST_MOD_RELEASE)
+                })
+            })
+    @ApiResponses(value = {
+        @ApiResponse(code = AUTHENTICATION_ERROR_CODE, message = AUTHENTICATION_ERROR_MESSAGE),
+        @ApiResponse(code = AUTHORIZATION_ERROR_CODE, message = AUTHORIZATION_ERROR_MESSAGE),
+        @ApiResponse(code = SERVER_ERROR_CODE, message = SERVER_ERROR_MESSAGE)
+    })
+    // @formatter:on
+
+    public ResponseEntity<Object> getStatusOfPolicy(
+        @ApiParam(value = "PDP Group Name") @PathVariable("pdpGroupName") String pdpGroupName,
+        @ApiParam(value = "Policy Id") @PathVariable("policyName") String policyName,
+        @ApiParam(value = "Policy Version") @PathVariable("policyVersion") String policyVersion,
+        @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) @RequestHeader(
+            required = false,
+            value = REQUEST_ID_NAME) final UUID requestId) {
+
+        try {
+            Collection<PdpPolicyStatus> result = provider.getPolicyStatus(pdpGroupName,
+                new ToscaConceptIdentifierOptVersion(policyName, policyVersion));
+            if (result.isEmpty()) {
+                return makeNotFoundResponse(requestId);
+
+            } else {
+                return addLoggingHeaders(addVersionControlHeaders(ResponseEntity.ok()), requestId)
+                    .body(result.iterator().next());
+            }
+
+        } catch (PfModelException | PfModelRuntimeException e) {
+            logger.warn(GET_DEPLOYMENTS_FAILED, e);
+            return addLoggingHeaders(
+                addVersionControlHeaders(ResponseEntity.status(e.getErrorResponse().getResponseCode().getStatusCode())),
+                requestId).body(e.getErrorResponse().getErrorMessage());
+        }
+    }
+
     /**
      * Makes a "not found" response.
      *
      * @param requestId request ID
      * @return a "not found" response
      */
-    private Response makeNotFoundResponse(final UUID requestId) {
-        return addLoggingHeaders(addVersionControlHeaders(Response.status(Response.Status.NOT_FOUND)), requestId)
+    private ResponseEntity<Object> makeNotFoundResponse(final UUID requestId) {
+        return addLoggingHeaders(addVersionControlHeaders(ResponseEntity.status(HttpStatus.NOT_FOUND)), requestId)
                         .build();
     }
+
+    private ResponseEntity<Object> makeRegexNotFoundResponse(UUID requestId) {
+        logger.warn(GET_DEPLOYMENTS_FAILED + EMPTY_REGEX_WARNING);
+        return addLoggingHeaders(addVersionControlHeaders(ResponseEntity.status(HttpStatus.BAD_REQUEST)),
+            requestId).body(EMPTY_REGEX_ERROR_MESSAGE);
+    }
+
+    private ResponseEntity<Object> makeListOrNotFoundResponse(UUID requestId, Collection<?> result) {
+        if (result.isEmpty()) {
+            return makeNotFoundResponse(requestId);
+        } else {
+            return addLoggingHeaders(addVersionControlHeaders(ResponseEntity.ok()), requestId).body(result);
+        }
+    }
 }