2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved.
6 * Modifications Copyright (C) 2021-2023 Nordix Foundation.
7 * Modifications Copyright (C) 2021-2022 Bell Canada. All rights reserved.
8 * ================================================================================
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 * ============LICENSE_END=========================================================
23 package org.onap.policy.pap.main.rest;
25 import com.google.re2j.PatternSyntaxException;
26 import java.util.Collection;
27 import java.util.UUID;
28 import lombok.RequiredArgsConstructor;
29 import org.onap.policy.models.base.PfModelRuntimeException;
30 import org.onap.policy.models.pap.concepts.PolicyStatus;
31 import org.onap.policy.models.pdp.concepts.PdpPolicyStatus;
32 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifierOptVersion;
33 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory;
35 import org.springframework.http.HttpStatus;
36 import org.springframework.http.ResponseEntity;
37 import org.springframework.web.bind.annotation.RestController;
40 * Class to provide REST end points for PAP component to retrieve the status of deployed
44 @RequiredArgsConstructor
45 public class PolicyStatusControllerV1 extends PapRestControllerV1 implements PolicyStatusControllerV1Api {
46 private static final String EMPTY_REGEX_ERROR_MESSAGE = "An empty string passed as a regex is not allowed";
47 private static final String EMPTY_REGEX_WARNING = ". Empty string passed as Regex.";
48 private static final String GET_DEPLOYMENTS_FAILED = "get deployments failed";
50 private static final Logger logger = LoggerFactory.getLogger(PolicyStatusControllerV1.class);
52 private final PolicyStatusProvider provider;
55 * Queries status of all deployed policies. If regex is not null or empty, the function will only return
56 * policies that match regex
58 * @param requestId request ID used in ONAP logging
59 * @param regex regex for a policy name
63 public ResponseEntity<Object> queryAllDeployedPolicies(UUID requestId, String regex) {
65 final Collection<PolicyStatus> result;
67 result = provider.getStatus();
68 } else if (regex.isBlank()) {
69 return makeRegexNotFoundResponse(requestId);
71 result = provider.getByRegex(regex);
73 return makeListOrNotFoundResponse(requestId, result);
75 } catch (PfModelRuntimeException e) {
76 logger.warn(GET_DEPLOYMENTS_FAILED, e);
77 return addLoggingHeaders(
78 addVersionControlHeaders(ResponseEntity.status(e.getErrorResponse().getResponseCode().getStatusCode())),
79 requestId).body(e.getErrorResponse().getErrorMessage());
80 } catch (PatternSyntaxException e) {
81 logger.warn(GET_DEPLOYMENTS_FAILED, e);
82 return addLoggingHeaders(addVersionControlHeaders(ResponseEntity.status(HttpStatus.BAD_REQUEST)), requestId)
83 .body(e.getMessage());
88 * Queries status of specific deployed policies.
90 * @param requestId request ID used in ONAP logging
94 public ResponseEntity<Object> queryDeployedPolicies(String name, UUID requestId) {
97 Collection<PolicyStatus> result = provider.getStatus(new ToscaConceptIdentifierOptVersion(name, null));
98 if (result.isEmpty()) {
99 return makeNotFoundResponse(requestId);
102 return addLoggingHeaders(addVersionControlHeaders(ResponseEntity.ok()), requestId).body(result);
105 } catch (PfModelRuntimeException e) {
106 logger.warn(GET_DEPLOYMENTS_FAILED, e);
107 return addLoggingHeaders(
108 addVersionControlHeaders(ResponseEntity.status(e.getErrorResponse().getResponseCode().getStatusCode())),
109 requestId).body(e.getErrorResponse().getErrorMessage());
115 * Queries status of a specific deployed policy.
117 * @param requestId request ID used in ONAP logging
121 public ResponseEntity<Object> queryDeployedPolicy(String name, String version, UUID requestId) {
124 Collection<PolicyStatus> result = provider.getStatus(new ToscaConceptIdentifierOptVersion(name, version));
125 if (result.isEmpty()) {
126 return makeNotFoundResponse(requestId);
129 return addLoggingHeaders(addVersionControlHeaders(ResponseEntity.ok()), requestId)
130 .body(result.iterator().next());
133 } catch (PfModelRuntimeException e) {
134 logger.warn(GET_DEPLOYMENTS_FAILED, e);
135 return addLoggingHeaders(
136 addVersionControlHeaders(ResponseEntity.status(e.getErrorResponse().getResponseCode().getStatusCode())),
137 requestId).body(e.getErrorResponse().getErrorMessage());
143 * Queries status of all policies.
145 * @param requestId request ID used in ONAP logging
149 public ResponseEntity<Object> getStatusOfAllPolicies(UUID requestId) {
152 return addLoggingHeaders(addVersionControlHeaders(ResponseEntity.ok()), requestId)
153 .body(provider.getPolicyStatus());
155 } catch (PfModelRuntimeException e) {
156 logger.warn(GET_DEPLOYMENTS_FAILED, e);
157 return addLoggingHeaders(
158 addVersionControlHeaders(ResponseEntity.status(e.getErrorResponse().getResponseCode().getStatusCode())),
159 requestId).body(e.getErrorResponse().getErrorMessage());
164 * Queries status of policies in a specific PdpGroup. if regex is not null or empty, the function will only return
165 * policies that match regex
167 * @param pdpGroupName name of the PdpGroup
168 * @param requestId request ID used in ONAP logging
169 * @param regex regex for a policy name
173 public ResponseEntity<Object> getStatusOfPoliciesByGroup(
179 final Collection<PdpPolicyStatus> result;
181 result = provider.getPolicyStatus(pdpGroupName);
182 } else if (regex.isBlank()) {
183 return makeRegexNotFoundResponse(requestId);
185 result = provider.getPolicyStatusByRegex(pdpGroupName, regex);
187 return makeListOrNotFoundResponse(requestId, result);
189 } catch (PfModelRuntimeException e) {
190 logger.warn(GET_DEPLOYMENTS_FAILED, e);
191 return addLoggingHeaders(
192 addVersionControlHeaders(ResponseEntity.status(e.getErrorResponse().getResponseCode().getStatusCode())),
193 requestId).body(e.getErrorResponse().getErrorMessage());
194 } catch (PatternSyntaxException e) {
195 logger.warn(GET_DEPLOYMENTS_FAILED, e);
196 return addLoggingHeaders(addVersionControlHeaders(ResponseEntity.status(HttpStatus.BAD_REQUEST)), requestId)
197 .body(e.getMessage());
202 * Queries status of all versions of a specific policy in a specific PdpGroup.
204 * @param pdpGroupName name of the PdpGroup
205 * @param policyName name of the Policy
206 * @param requestId request ID used in ONAP logging
210 public ResponseEntity<Object> getStatusOfPolicies(
216 Collection<PdpPolicyStatus> result =
217 provider.getPolicyStatus(pdpGroupName, new ToscaConceptIdentifierOptVersion(policyName, null));
218 if (result.isEmpty()) {
219 return makeNotFoundResponse(requestId);
222 return addLoggingHeaders(addVersionControlHeaders(ResponseEntity.ok()), requestId)
226 } catch (PfModelRuntimeException e) {
227 logger.warn(GET_DEPLOYMENTS_FAILED, e);
228 return addLoggingHeaders(
229 addVersionControlHeaders(ResponseEntity.status(e.getErrorResponse().getResponseCode().getStatusCode())),
230 requestId).body(e.getErrorResponse().getErrorMessage());
236 * Queries status of a specific version of a specific policy in a specific PdpGroup.
238 * @param pdpGroupName name of the PdpGroup
239 * @param policyName name of the Policy
240 * @param policyVersion version of the Policy
241 * @param requestId request ID used in ONAP logging
246 public ResponseEntity<Object> getStatusOfPolicy(
249 String policyVersion,
253 Collection<PdpPolicyStatus> result = provider.getPolicyStatus(pdpGroupName,
254 new ToscaConceptIdentifierOptVersion(policyName, policyVersion));
255 if (result.isEmpty()) {
256 return makeNotFoundResponse(requestId);
259 return addLoggingHeaders(addVersionControlHeaders(ResponseEntity.ok()), requestId)
260 .body(result.iterator().next());
263 } catch (PfModelRuntimeException e) {
264 logger.warn(GET_DEPLOYMENTS_FAILED, e);
265 return addLoggingHeaders(
266 addVersionControlHeaders(ResponseEntity.status(e.getErrorResponse().getResponseCode().getStatusCode())),
267 requestId).body(e.getErrorResponse().getErrorMessage());
272 * Makes a "not found" response.
274 * @param requestId request ID
275 * @return a "not found" response
277 private ResponseEntity<Object> makeNotFoundResponse(final UUID requestId) {
278 return addLoggingHeaders(addVersionControlHeaders(ResponseEntity.status(HttpStatus.NOT_FOUND)), requestId)
282 private ResponseEntity<Object> makeRegexNotFoundResponse(UUID requestId) {
283 logger.warn(GET_DEPLOYMENTS_FAILED + EMPTY_REGEX_WARNING);
284 return addLoggingHeaders(addVersionControlHeaders(ResponseEntity.status(HttpStatus.BAD_REQUEST)),
285 requestId).body(EMPTY_REGEX_ERROR_MESSAGE);
288 private ResponseEntity<Object> makeListOrNotFoundResponse(UUID requestId, Collection<?> result) {
289 if (result.isEmpty()) {
290 return makeNotFoundResponse(requestId);
292 return addLoggingHeaders(addVersionControlHeaders(ResponseEntity.ok()), requestId).body(result);