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.context.annotation.Profile;
36 import org.springframework.http.HttpStatus;
37 import org.springframework.http.ResponseEntity;
38 import org.springframework.web.bind.annotation.RestController;
41 * Class to provide REST end points for PAP component to retrieve the status of deployed
45 @RequiredArgsConstructor
47 public class PolicyStatusControllerV1 extends PapRestControllerV1 implements PolicyStatusControllerV1Api {
48 private static final String EMPTY_REGEX_ERROR_MESSAGE = "An empty string passed as a regex is not allowed";
49 private static final String EMPTY_REGEX_WARNING = ". Empty string passed as Regex.";
50 private static final String GET_DEPLOYMENTS_FAILED = "get deployments failed";
52 private static final Logger logger = LoggerFactory.getLogger(PolicyStatusControllerV1.class);
54 private final PolicyStatusProvider provider;
57 * Queries status of all deployed policies. If regex is not null or empty, the function will only return
58 * policies that match regex
60 * @param requestId request ID used in ONAP logging
61 * @param regex regex for a policy name
65 public ResponseEntity<Object> queryAllDeployedPolicies(UUID requestId, String regex) {
67 final Collection<PolicyStatus> result;
69 result = provider.getStatus();
70 } else if (regex.isBlank()) {
71 return makeRegexNotFoundResponse(requestId);
73 result = provider.getByRegex(regex);
75 return makeListOrNotFoundResponse(requestId, result);
77 } catch (PfModelRuntimeException e) {
78 logger.warn(GET_DEPLOYMENTS_FAILED, e);
79 return addLoggingHeaders(
80 addVersionControlHeaders(ResponseEntity.status(e.getErrorResponse().getResponseCode().getStatusCode())),
81 requestId).body(e.getErrorResponse().getErrorMessage());
82 } catch (PatternSyntaxException e) {
83 logger.warn(GET_DEPLOYMENTS_FAILED, e);
84 return addLoggingHeaders(addVersionControlHeaders(ResponseEntity.status(HttpStatus.BAD_REQUEST)), requestId)
85 .body(e.getMessage());
90 * Queries status of specific deployed policies.
92 * @param requestId request ID used in ONAP logging
96 public ResponseEntity<Object> queryDeployedPolicies(String name, UUID requestId) {
99 Collection<PolicyStatus> result = provider.getStatus(new ToscaConceptIdentifierOptVersion(name, null));
100 if (result.isEmpty()) {
101 return makeNotFoundResponse(requestId);
104 return addLoggingHeaders(addVersionControlHeaders(ResponseEntity.ok()), requestId).body(result);
107 } catch (PfModelRuntimeException e) {
108 logger.warn(GET_DEPLOYMENTS_FAILED, e);
109 return addLoggingHeaders(
110 addVersionControlHeaders(ResponseEntity.status(e.getErrorResponse().getResponseCode().getStatusCode())),
111 requestId).body(e.getErrorResponse().getErrorMessage());
117 * Queries status of a specific deployed policy.
119 * @param requestId request ID used in ONAP logging
123 public ResponseEntity<Object> queryDeployedPolicy(String name, String version, UUID requestId) {
126 Collection<PolicyStatus> result = provider.getStatus(new ToscaConceptIdentifierOptVersion(name, version));
127 if (result.isEmpty()) {
128 return makeNotFoundResponse(requestId);
131 return addLoggingHeaders(addVersionControlHeaders(ResponseEntity.ok()), requestId)
132 .body(result.iterator().next());
135 } catch (PfModelRuntimeException e) {
136 logger.warn(GET_DEPLOYMENTS_FAILED, e);
137 return addLoggingHeaders(
138 addVersionControlHeaders(ResponseEntity.status(e.getErrorResponse().getResponseCode().getStatusCode())),
139 requestId).body(e.getErrorResponse().getErrorMessage());
145 * Queries status of all policies.
147 * @param requestId request ID used in ONAP logging
151 public ResponseEntity<Object> getStatusOfAllPolicies(UUID requestId) {
154 return addLoggingHeaders(addVersionControlHeaders(ResponseEntity.ok()), requestId)
155 .body(provider.getPolicyStatus());
157 } catch (PfModelRuntimeException e) {
158 logger.warn(GET_DEPLOYMENTS_FAILED, e);
159 return addLoggingHeaders(
160 addVersionControlHeaders(ResponseEntity.status(e.getErrorResponse().getResponseCode().getStatusCode())),
161 requestId).body(e.getErrorResponse().getErrorMessage());
166 * Queries status of policies in a specific PdpGroup. if regex is not null or empty, the function will only return
167 * policies that match regex
169 * @param pdpGroupName name of the PdpGroup
170 * @param requestId request ID used in ONAP logging
171 * @param regex regex for a policy name
175 public ResponseEntity<Object> getStatusOfPoliciesByGroup(
181 final Collection<PdpPolicyStatus> result;
183 result = provider.getPolicyStatus(pdpGroupName);
184 } else if (regex.isBlank()) {
185 return makeRegexNotFoundResponse(requestId);
187 result = provider.getPolicyStatusByRegex(pdpGroupName, regex);
189 return makeListOrNotFoundResponse(requestId, result);
191 } catch (PfModelRuntimeException e) {
192 logger.warn(GET_DEPLOYMENTS_FAILED, e);
193 return addLoggingHeaders(
194 addVersionControlHeaders(ResponseEntity.status(e.getErrorResponse().getResponseCode().getStatusCode())),
195 requestId).body(e.getErrorResponse().getErrorMessage());
196 } catch (PatternSyntaxException e) {
197 logger.warn(GET_DEPLOYMENTS_FAILED, e);
198 return addLoggingHeaders(addVersionControlHeaders(ResponseEntity.status(HttpStatus.BAD_REQUEST)), requestId)
199 .body(e.getMessage());
204 * Queries status of all versions of a specific policy in a specific PdpGroup.
206 * @param pdpGroupName name of the PdpGroup
207 * @param policyName name of the Policy
208 * @param requestId request ID used in ONAP logging
212 public ResponseEntity<Object> getStatusOfPolicies(
218 Collection<PdpPolicyStatus> result =
219 provider.getPolicyStatus(pdpGroupName, new ToscaConceptIdentifierOptVersion(policyName, null));
220 if (result.isEmpty()) {
221 return makeNotFoundResponse(requestId);
224 return addLoggingHeaders(addVersionControlHeaders(ResponseEntity.ok()), requestId)
228 } catch (PfModelRuntimeException e) {
229 logger.warn(GET_DEPLOYMENTS_FAILED, e);
230 return addLoggingHeaders(
231 addVersionControlHeaders(ResponseEntity.status(e.getErrorResponse().getResponseCode().getStatusCode())),
232 requestId).body(e.getErrorResponse().getErrorMessage());
238 * Queries status of a specific version of a specific policy in a specific PdpGroup.
240 * @param pdpGroupName name of the PdpGroup
241 * @param policyName name of the Policy
242 * @param policyVersion version of the Policy
243 * @param requestId request ID used in ONAP logging
248 public ResponseEntity<Object> getStatusOfPolicy(
251 String policyVersion,
255 Collection<PdpPolicyStatus> result = provider.getPolicyStatus(pdpGroupName,
256 new ToscaConceptIdentifierOptVersion(policyName, policyVersion));
257 if (result.isEmpty()) {
258 return makeNotFoundResponse(requestId);
261 return addLoggingHeaders(addVersionControlHeaders(ResponseEntity.ok()), requestId)
262 .body(result.iterator().next());
265 } catch (PfModelRuntimeException e) {
266 logger.warn(GET_DEPLOYMENTS_FAILED, e);
267 return addLoggingHeaders(
268 addVersionControlHeaders(ResponseEntity.status(e.getErrorResponse().getResponseCode().getStatusCode())),
269 requestId).body(e.getErrorResponse().getErrorMessage());
274 * Makes a "not found" response.
276 * @param requestId request ID
277 * @return a "not found" response
279 private ResponseEntity<Object> makeNotFoundResponse(final UUID requestId) {
280 return addLoggingHeaders(addVersionControlHeaders(ResponseEntity.status(HttpStatus.NOT_FOUND)), requestId)
284 private ResponseEntity<Object> makeRegexNotFoundResponse(UUID requestId) {
285 logger.warn(GET_DEPLOYMENTS_FAILED + EMPTY_REGEX_WARNING);
286 return addLoggingHeaders(addVersionControlHeaders(ResponseEntity.status(HttpStatus.BAD_REQUEST)),
287 requestId).body(EMPTY_REGEX_ERROR_MESSAGE);
290 private ResponseEntity<Object> makeListOrNotFoundResponse(UUID requestId, Collection<?> result) {
291 if (result.isEmpty()) {
292 return makeNotFoundResponse(requestId);
294 return addLoggingHeaders(addVersionControlHeaders(ResponseEntity.ok()), requestId).body(result);