Java 17 / Spring 6 / Spring Boot 3 Upgrade
[policy/api.git] / main / src / main / java / org / onap / policy / api / main / rest / ApiRestController.java
1 /*-\r
2  * ============LICENSE_START=======================================================\r
3  * ONAP Policy API\r
4  * ================================================================================\r
5  * Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved.\r
6  * Modifications Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved.\r
7  * Modifications Copyright (C) 2020-2023 Nordix Foundation.\r
8  * Modifications Copyright (C) 2020-2023 Bell Canada. All rights reserved.\r
9  * ================================================================================\r
10  * Licensed under the Apache License, Version 2.0 (the "License");\r
11  * you may not use this file except in compliance with the License.\r
12  * You may obtain a copy of the License at\r
13  *\r
14  *      http://www.apache.org/licenses/LICENSE-2.0\r
15  *\r
16  * Unless required by applicable law or agreed to in writing, software\r
17  * distributed under the License is distributed on an "AS IS" BASIS,\r
18  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
19  * See the License for the specific language governing permissions and\r
20  * limitations under the License.\r
21  *\r
22  * SPDX-License-Identifier: Apache-2.0\r
23  * ============LICENSE_END=========================================================\r
24  */\r
25 \r
26 package org.onap.policy.api.main.rest;\r
27 \r
28 import jakarta.ws.rs.core.Response.Status;\r
29 import java.util.List;\r
30 import java.util.UUID;\r
31 import lombok.RequiredArgsConstructor;\r
32 import org.onap.policy.api.main.exception.PolicyApiRuntimeException;\r
33 import org.onap.policy.api.main.rest.genapi.PolicyDesignApi;\r
34 import org.onap.policy.api.main.rest.provider.healthcheck.HealthCheckProvider;\r
35 import org.onap.policy.api.main.service.ToscaServiceTemplateService;\r
36 import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;\r
37 import org.onap.policy.common.endpoints.report.HealthCheckReport;\r
38 import org.onap.policy.common.endpoints.utils.NetLoggerUtil;\r
39 import org.onap.policy.common.endpoints.utils.NetLoggerUtil.EventType;\r
40 import org.onap.policy.models.base.PfModelException;\r
41 import org.onap.policy.models.base.PfModelRuntimeException;\r
42 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;\r
43 import org.springframework.context.annotation.Profile;\r
44 import org.springframework.http.ResponseEntity;\r
45 import org.springframework.web.bind.annotation.RestController;\r
46 \r
47 /**\r
48  * Class to provide REST API services.\r
49  *\r
50  * @author Chenfei Gao (cgao@research.att.com)\r
51  */\r
52 @RestController\r
53 @RequiredArgsConstructor\r
54 @Profile("default")\r
55 public class ApiRestController extends CommonRestController implements PolicyDesignApi {\r
56 \r
57     private final ToscaServiceTemplateService toscaServiceTemplateService;\r
58     private final HealthCheckProvider healthCheckProvider;\r
59 \r
60     /**\r
61      * Retrieves the healthcheck status of the API component.\r
62      *\r
63      * @return the Response object containing the results of the API operation\r
64      */\r
65     @Override\r
66     public ResponseEntity<HealthCheckReport> getHealthCheck(UUID requestId) {\r
67         final var report = healthCheckProvider.performHealthCheck();\r
68         return makeResponse(requestId, report, report.getCode());\r
69     }\r
70 \r
71     /**\r
72      * Retrieves all available policy types.\r
73      *\r
74      * @return the Response object containing the results of the API operation\r
75      */\r
76     @Override\r
77     public ResponseEntity<ToscaServiceTemplate> getAllPolicyTypes(UUID requestId) {\r
78         try {\r
79             ToscaServiceTemplate serviceTemplate = toscaServiceTemplateService.fetchPolicyTypes(null, null);\r
80             return makeOkResponse(requestId, serviceTemplate);\r
81         } catch (PfModelException | PfModelRuntimeException pfme) {\r
82             final var msg = "GET /policytypes";\r
83             throw new PolicyApiRuntimeException(msg, pfme.getCause(), pfme.getErrorResponse(), requestId);\r
84         }\r
85     }\r
86 \r
87     /**\r
88      * Retrieves all versions of a particular policy type.\r
89      *\r
90      * @param policyTypeId the ID of specified policy type\r
91      * @return the Response object containing the results of the API operation\r
92      */\r
93     @Override\r
94     public ResponseEntity<ToscaServiceTemplate> getAllVersionsOfPolicyType(\r
95         String policyTypeId,\r
96         UUID requestId) {\r
97         try {\r
98             ToscaServiceTemplate serviceTemplate = toscaServiceTemplateService.fetchPolicyTypes(policyTypeId, null);\r
99             return makeOkResponse(requestId, serviceTemplate);\r
100         } catch (PfModelException | PfModelRuntimeException pfme) {\r
101             var msg = String.format("GET /policytypes/%s", policyTypeId);\r
102             throw new PolicyApiRuntimeException(msg, pfme.getCause(), pfme.getErrorResponse(), requestId);\r
103         }\r
104     }\r
105 \r
106     /**\r
107      * Retrieves specified version of a particular policy type.\r
108      *\r
109      * @param policyTypeId the ID of specified policy type\r
110      * @param versionId    the version of specified policy type\r
111      * @return the Response object containing the results of the API operation\r
112      */\r
113     @Override\r
114     public ResponseEntity<ToscaServiceTemplate> getSpecificVersionOfPolicyType(\r
115         String policyTypeId,\r
116         String versionId,\r
117         UUID requestId) {\r
118         try {\r
119             ToscaServiceTemplate serviceTemplate =\r
120                 toscaServiceTemplateService.fetchPolicyTypes(policyTypeId, versionId);\r
121             return makeOkResponse(requestId, serviceTemplate);\r
122         } catch (PfModelException | PfModelRuntimeException pfme) {\r
123             var msg = String.format("GET /policytypes/%s/versions/%s", policyTypeId, versionId);\r
124             throw new PolicyApiRuntimeException(msg, pfme.getCause(), pfme.getErrorResponse(), requestId);\r
125         }\r
126     }\r
127 \r
128     /**\r
129      * Retrieves latest version of a particular policy type.\r
130      *\r
131      * @param policyTypeId the ID of specified policy type\r
132      * @return the Response object containing the results of the API operation\r
133      */\r
134     @Override\r
135     public ResponseEntity<ToscaServiceTemplate> getLatestVersionOfPolicyType(\r
136         String policyTypeId,\r
137         UUID requestId) {\r
138         try {\r
139             ToscaServiceTemplate serviceTemplate = toscaServiceTemplateService.fetchLatestPolicyTypes(policyTypeId);\r
140             return makeOkResponse(requestId, serviceTemplate);\r
141         } catch (PfModelException | PfModelRuntimeException pfme) {\r
142             var msg = String.format("GET /policytypes/%s/versions/latest", policyTypeId);\r
143             throw new PolicyApiRuntimeException(msg, pfme.getCause(), pfme.getErrorResponse(), requestId);\r
144         }\r
145     }\r
146 \r
147     /**\r
148      * Creates a new policy type.\r
149      *\r
150      * @param body the body of policy type following TOSCA definition\r
151      * @return the Response object containing the results of the API operation\r
152      */\r
153     @Override\r
154     public ResponseEntity<ToscaServiceTemplate> createPolicyType(\r
155         ToscaServiceTemplate body,\r
156         UUID requestId) {\r
157         if (NetLoggerUtil.getNetworkLogger().isInfoEnabled()) {\r
158             NetLoggerUtil.log(EventType.IN, CommInfrastructure.REST, "/policytypes", toJson(body));\r
159         }\r
160         try {\r
161             ToscaServiceTemplate serviceTemplate = toscaServiceTemplateService.createPolicyType(body);\r
162             return makeOkResponse(requestId, serviceTemplate);\r
163         } catch (PfModelRuntimeException pfme) {\r
164             final var msg = "POST /policytypes";\r
165             throw new PolicyApiRuntimeException(msg, pfme.getCause(), pfme.getErrorResponse(), requestId);\r
166         }\r
167     }\r
168 \r
169     /**\r
170      * Deletes specified version of a particular policy type.\r
171      *\r
172      * @param policyTypeId the ID of specified policy type\r
173      * @param versionId    the version of specified policy type\r
174      * @return the Response object containing the results of the API operation\r
175      */\r
176     @Override\r
177     public ResponseEntity<ToscaServiceTemplate> deleteSpecificVersionOfPolicyType(\r
178         String policyTypeId,\r
179         String versionId,\r
180         UUID requestId) {\r
181         try {\r
182             ToscaServiceTemplate serviceTemplate =\r
183                 toscaServiceTemplateService.deletePolicyType(policyTypeId, versionId);\r
184             return makeOkResponse(requestId, serviceTemplate);\r
185         } catch (PfModelRuntimeException pfme) {\r
186             var msg = String.format("DELETE /policytypes/%s/versions/%s", policyTypeId, versionId);\r
187             throw new PolicyApiRuntimeException(msg, pfme.getCause(), pfme.getErrorResponse(), requestId);\r
188         }\r
189     }\r
190 \r
191     /**\r
192      * Retrieves all versions of a particular policy.\r
193      *\r
194      * @param policyTypeId      the ID of specified policy type\r
195      * @param policyTypeVersion the version of specified policy type\r
196      * @return the Response object containing the results of the API operation\r
197      */\r
198     @Override\r
199     public ResponseEntity<ToscaServiceTemplate> getAllPolicies(\r
200         String policyTypeId,\r
201         String policyTypeVersion,\r
202         PolicyFetchMode mode,\r
203         UUID requestId) {\r
204         try {\r
205             ToscaServiceTemplate serviceTemplate =\r
206                 toscaServiceTemplateService.fetchPolicies(policyTypeId, policyTypeVersion, null, null, mode);\r
207             return makeOkResponse(requestId, serviceTemplate);\r
208         } catch (PfModelException | PfModelRuntimeException pfme) {\r
209             var msg = String.format("GET /policytypes/%s/versions/%s/policies", policyTypeId, policyTypeVersion);\r
210             throw new PolicyApiRuntimeException(msg, pfme.getCause(), pfme.getErrorResponse(), requestId);\r
211         }\r
212     }\r
213 \r
214     /**\r
215      * Retrieves all versions of a particular policy.\r
216      *\r
217      * @param policyTypeId      the ID of specified policy type\r
218      * @param policyTypeVersion the version of specified policy type\r
219      * @param policyId          the ID of specified policy\r
220      * @return the Response object containing the results of the API operation\r
221      */\r
222     @Override\r
223     public ResponseEntity<ToscaServiceTemplate> getAllVersionsOfPolicy(\r
224         String policyId,\r
225         String policyTypeId,\r
226         String policyTypeVersion,\r
227         PolicyFetchMode mode,\r
228         UUID requestId) {\r
229         try {\r
230             ToscaServiceTemplate serviceTemplate =\r
231                 toscaServiceTemplateService.fetchPolicies(policyTypeId, policyTypeVersion, policyId, null, mode);\r
232             return makeOkResponse(requestId, serviceTemplate);\r
233         } catch (PfModelException | PfModelRuntimeException pfme) {\r
234             var msg = String.format("/policytypes/%s/versions/%s/policies/%s",\r
235                 policyTypeId, policyTypeVersion, policyId);\r
236             throw new PolicyApiRuntimeException(msg, pfme.getCause(), pfme.getErrorResponse(), requestId);\r
237         }\r
238     }\r
239 \r
240     /**\r
241      * Retrieves the specified version of a particular policy.\r
242      *\r
243      * @param policyTypeId      the ID of specified policy type\r
244      * @param policyTypeVersion the version of specified policy type\r
245      * @param policyId          the ID of specified policy\r
246      * @param policyVersion     the version of specified policy\r
247      * @return the Response object containing the results of the API operation\r
248      */\r
249     @Override\r
250     public ResponseEntity<ToscaServiceTemplate> getSpecificVersionOfPolicy(\r
251         String policyId,\r
252         String policyTypeId,\r
253         String policyTypeVersion,\r
254         String policyVersion,\r
255         PolicyFetchMode mode,\r
256         UUID requestId) {\r
257         try {\r
258             ToscaServiceTemplate serviceTemplate = toscaServiceTemplateService\r
259                 .fetchPolicies(policyTypeId, policyTypeVersion, policyId, policyVersion, mode);\r
260             return makeOkResponse(requestId, serviceTemplate);\r
261         } catch (PfModelException | PfModelRuntimeException pfme) {\r
262             var msg = String.format("GET /policytypes/%s/versions/%s/policies/%s/versions/%s",\r
263                 policyTypeId, policyTypeVersion, policyId, policyVersion);\r
264             throw new PolicyApiRuntimeException(msg, pfme.getCause(), pfme.getErrorResponse(), requestId);\r
265         }\r
266     }\r
267 \r
268     /**\r
269      * Retrieves the latest version of a particular policy.\r
270      *\r
271      * @param policyTypeId      the ID of specified policy type\r
272      * @param policyTypeVersion the version of specified policy type\r
273      * @param policyId          the ID of specified policy\r
274      * @return the Response object containing the results of the API operation\r
275      */\r
276     @Override\r
277     public ResponseEntity<ToscaServiceTemplate> getLatestVersionOfPolicy(\r
278         String policyId,\r
279         String policyTypeId,\r
280         String policyTypeVersion,\r
281         PolicyFetchMode mode,\r
282         UUID requestId) {\r
283         try {\r
284             ToscaServiceTemplate serviceTemplate =\r
285                 toscaServiceTemplateService.fetchLatestPolicies(policyTypeId, policyTypeVersion, policyId, mode);\r
286             return makeOkResponse(requestId, serviceTemplate);\r
287         } catch (PfModelException | PfModelRuntimeException pfme) {\r
288             var msg = String.format("GET /policytypes/%s/versions/%s/policies/%s/versions/latest",\r
289                 policyTypeId, policyTypeVersion, policyId);\r
290             throw new PolicyApiRuntimeException(msg, pfme.getCause(), pfme.getErrorResponse(), requestId);\r
291         }\r
292     }\r
293 \r
294     /**\r
295      * Creates a new policy for a particular policy type and version.\r
296      *\r
297      * @param policyTypeId      the ID of specified policy type\r
298      * @param policyTypeVersion the version of specified policy type\r
299      * @param body              the body of policy following TOSCA definition\r
300      * @return the Response object containing the results of the API operation\r
301      */\r
302     @Override\r
303     public ResponseEntity<ToscaServiceTemplate> createPolicy(\r
304         String policyTypeId,\r
305         String policyTypeVersion,\r
306         ToscaServiceTemplate body,\r
307         UUID requestId) {\r
308         if (NetLoggerUtil.getNetworkLogger().isInfoEnabled()) {\r
309             NetLoggerUtil.log(EventType.IN, CommInfrastructure.REST,\r
310                 "/policytypes/" + policyTypeId + "/versions/" + policyTypeVersion + "/policies", toJson(body));\r
311         }\r
312         try {\r
313             ToscaServiceTemplate serviceTemplate =\r
314                 toscaServiceTemplateService.createPolicy(policyTypeId, policyTypeVersion, body);\r
315             return makeOkResponse(requestId, serviceTemplate);\r
316         } catch (PfModelRuntimeException pfme) {\r
317             var msg = String.format("POST /policytypes/%s/versions/%s/policies", policyTypeId, policyTypeVersion);\r
318             throw new PolicyApiRuntimeException(msg, pfme.getCause(), pfme.getErrorResponse(), requestId);\r
319         }\r
320     }\r
321 \r
322     /**\r
323      * Deletes the specified version of a particular policy.\r
324      *\r
325      * @param policyTypeId      the ID of specified policy type\r
326      * @param policyTypeVersion the version of specified policy type\r
327      * @param policyId          the ID of specified policy\r
328      * @param policyVersion     the version of specified policy\r
329      * @return the Response object containing the results of the API operation\r
330      */\r
331     @Override\r
332     public ResponseEntity<ToscaServiceTemplate> deleteSpecificVersionOfPolicy(\r
333         String policyTypeId,\r
334         String policyTypeVersion,\r
335         String policyId,\r
336         String policyVersion,\r
337         UUID requestId) {\r
338         try {\r
339             ToscaServiceTemplate serviceTemplate =\r
340                 toscaServiceTemplateService.deletePolicy(policyTypeId, policyTypeVersion, policyId, policyVersion);\r
341             return makeOkResponse(requestId, serviceTemplate);\r
342         } catch (PfModelRuntimeException pfme) {\r
343             var msg = String.format("DELETE /policytypes/%s/versions/%s/policies/%s/versions/%s",\r
344                 policyTypeId, policyTypeVersion, policyId, policyVersion);\r
345             throw new PolicyApiRuntimeException(msg, pfme.getCause(), pfme.getErrorResponse(), requestId);\r
346         }\r
347     }\r
348 \r
349     /**\r
350      * Retrieves all the available policies.\r
351      *\r
352      * @return the Response object containing the results of the API operation\r
353      */\r
354     @Override\r
355     public ResponseEntity<ToscaServiceTemplate> getPolicies(\r
356         PolicyFetchMode mode,\r
357         UUID requestId) {\r
358         try {\r
359             ToscaServiceTemplate serviceTemplate =\r
360                 toscaServiceTemplateService.fetchPolicies(null, null, null, null, mode);\r
361             return makeOkResponse(requestId, serviceTemplate);\r
362         } catch (PfModelException | PfModelRuntimeException pfme) {\r
363             final var msg = "GET /policies/ --";\r
364             if (pfme.getErrorResponse().getResponseCode().equals(Status.NOT_FOUND)) {\r
365                 pfme.getErrorResponse().setErrorMessage(ERROR_MESSAGE_NO_POLICIES_FOUND);\r
366                 pfme.getErrorResponse().setErrorDetails(List.of(ERROR_MESSAGE_NO_POLICIES_FOUND));\r
367             }\r
368             throw new PolicyApiRuntimeException(msg, pfme.getCause(), pfme.getErrorResponse(), requestId);\r
369         }\r
370     }\r
371 \r
372     /**\r
373      * Retrieves the specified version of a particular policy.\r
374      *\r
375      * @param policyId      the Name of specified policy\r
376      * @param policyVersion the version of specified policy\r
377      * @return the Response object containing the results of the API operation\r
378      */\r
379     @Override\r
380     public ResponseEntity<ToscaServiceTemplate> getSpecificPolicy(\r
381         String policyId,\r
382         String policyVersion,\r
383         PolicyFetchMode mode,\r
384         UUID requestId) {\r
385         try {\r
386             ToscaServiceTemplate serviceTemplate =\r
387                 toscaServiceTemplateService.fetchPolicies(null, null, policyId, policyVersion, mode);\r
388             return makeOkResponse(requestId, serviceTemplate);\r
389         } catch (PfModelException | PfModelRuntimeException pfme) {\r
390             var msg = String.format("GET /policies/%s/versions/%s", policyId, policyVersion);\r
391             throw new PolicyApiRuntimeException(msg, pfme.getCause(), pfme.getErrorResponse(), requestId);\r
392         }\r
393     }\r
394 \r
395     /**\r
396      * Creates one or more new policies in one call.\r
397      *\r
398      * @param body the body of policy following TOSCA definition\r
399      * @return the Response object containing the results of the API operation\r
400      */\r
401     @Override\r
402     public ResponseEntity<ToscaServiceTemplate> createPolicies(\r
403         ToscaServiceTemplate body,\r
404         UUID requestId) {\r
405         if (NetLoggerUtil.getNetworkLogger().isInfoEnabled()) {\r
406             NetLoggerUtil.log(EventType.IN, CommInfrastructure.REST, "/policies", toJson(body));\r
407         }\r
408         try {\r
409             ToscaServiceTemplate serviceTemplate = toscaServiceTemplateService.createPolicies(body);\r
410             return makeOkResponse(requestId, serviceTemplate);\r
411         } catch (PfModelRuntimeException pfme) {\r
412             final var msg = "POST /policies";\r
413             throw new PolicyApiRuntimeException(msg, pfme.getCause(), pfme.getErrorResponse(), requestId);\r
414         }\r
415     }\r
416 \r
417     /**\r
418      * Deletes the specified version of a particular policy.\r
419      *\r
420      * @param policyId      the ID of specified policy\r
421      * @param policyVersion the version of specified policy\r
422      * @return the Response object containing the results of the API operation\r
423      */\r
424     @Override\r
425     public ResponseEntity<ToscaServiceTemplate> deleteSpecificPolicy(\r
426         String policyId,\r
427         String policyVersion,\r
428         UUID requestId) {\r
429         try {\r
430             ToscaServiceTemplate serviceTemplate =\r
431                 toscaServiceTemplateService.deletePolicy(null, null, policyId, policyVersion);\r
432             return makeOkResponse(requestId, serviceTemplate);\r
433         } catch (PfModelRuntimeException pfme) {\r
434             var msg = String.format("DELETE /policies/%s/versions/%s", policyId, policyVersion);\r
435             throw new PolicyApiRuntimeException(msg, pfme.getCause(), pfme.getErrorResponse(), requestId);\r
436         }\r
437     }\r
438 }\r