CPS-635 - Module Resource call does not include body
[cps.git] / cps-ncmp-service / src / main / java / org / onap / cps / ncmp / api / impl / operation / DmiOperations.java
1 /*
2  *  ============LICENSE_START=======================================================
3  *  Copyright (C) 2021 Nordix Foundation
4  *  ================================================================================
5  *  Licensed under the Apache License, Version 2.0 (the "License");
6  *  you may not use this file except in compliance with the License.
7  *  You may obtain a copy of the License at
8  *
9  *        http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  *
17  *  SPDX-License-Identifier: Apache-2.0
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.cps.ncmp.api.impl.operation;
22
23 import com.fasterxml.jackson.annotation.JsonValue;
24 import lombok.Getter;
25 import org.jetbrains.annotations.NotNull;
26 import org.onap.cps.ncmp.api.impl.client.DmiRestClient;
27 import org.springframework.http.HttpHeaders;
28 import org.springframework.http.ResponseEntity;
29 import org.springframework.stereotype.Component;
30
31 @Component
32 public class DmiOperations {
33     @Getter
34     public enum DataStoreEnum {
35         PASSTHROUGH_OPERATIONAL("ncmp-datastore:passthrough-operational"),
36         PASSTHROUGH_RUNNING("ncmp-datastore:passthrough-running");
37         private String value;
38
39         DataStoreEnum(final String value) {
40             this.value = value;
41         }
42
43         @Override
44         @JsonValue
45         public String toString() {
46             return value;
47         }
48     }
49
50     private DmiRestClient dmiRestClient;
51     private static final String DMI_API_PATH = "/dmi";
52     private static final String DMI_CM_HANDLE_PATH = "/v1/ch/{cmHandle}";
53     private static final String DMI_CM_HANDLE_DATASTORE_PATH = DMI_CM_HANDLE_PATH + "/data/ds";
54     private static final String URL_SEPARATOR = "/";
55
56     /**
57      * Constructor for {@code DmiOperations}. This method also manipulates url properties.
58      *
59      * @param dmiRestClient {@code DmiRestClient}
60      */
61     public DmiOperations(final DmiRestClient dmiRestClient) {
62         this.dmiRestClient = dmiRestClient;
63     }
64
65     /**
66      * Get resources from DMI.
67      *
68      * @param dmiServiceName dmi service name
69      * @param cmHandle cmHandle
70      * @param resourceName name of the resource(s)
71      * @return {@code ResponseEntity} response entity
72      */
73     public ResponseEntity<String> getResourceFromDmi(final String dmiServiceName,
74                                                      final String cmHandle,
75                                                      final String resourceName) {
76         final var dmiResourceDataUrl = getDmiResourceUrl(dmiServiceName, cmHandle, resourceName);
77         final var httpHeaders = new HttpHeaders();
78         return dmiRestClient.postOperation(dmiResourceDataUrl, httpHeaders);
79     }
80
81     /**
82      * Get resources from DMI for modules.
83      *
84      * @param dmiServiceName dmi service name
85      * @param jsonData module names and revisions as JSON
86      * @param cmHandle cmHandle
87      * @param resourceName name of the resource(s)
88      * @return {@code ResponseEntity} response entity
89      */
90     public ResponseEntity<String> getResourceFromDmiWithJsonData(final String dmiServiceName,
91                                                                final String jsonData,
92                                                                final String cmHandle,
93                                                                final String resourceName) {
94         final String dmiResourceDataUrl = getDmiResourceUrl(dmiServiceName, cmHandle, resourceName);
95         return dmiRestClient.postOperationWithJsonData(dmiResourceDataUrl, jsonData, new HttpHeaders());
96     }
97
98     /**
99      * This method fetches the resource data from operational data store for given cm handle
100      * identifier on given resource using dmi client.
101      *
102      * @param dmiServiceName dmi service name
103      * @param cmHandle    network resource identifier
104      * @param resourceId  resource identifier
105      * @param fieldsQuery fields query
106      * @param depthQuery  depth query
107      * @param acceptParam accept parameter
108      * @param jsonBody    json body for put operation
109      * @return {@code ResponseEntity} response entity
110      */
111     public ResponseEntity<Object> getResourceDataOperationalFromDmi(final String dmiServiceName,
112                                                                     final String cmHandle,
113                                                                     final String resourceId,
114                                                                     final String fieldsQuery,
115                                                                     final Integer depthQuery,
116                                                                     final String acceptParam,
117                                                                     final String jsonBody) {
118         final var dmiResourceDataUrl = getDmiDatastoreUrl(dmiServiceName, cmHandle, resourceId,
119             fieldsQuery, depthQuery, DataStoreEnum.PASSTHROUGH_OPERATIONAL);
120         final var httpHeaders = prepareHeader(acceptParam);
121         return dmiRestClient.putOperationWithJsonData(dmiResourceDataUrl, jsonBody, httpHeaders);
122     }
123
124     /**
125      * This method fetches the resource data from pass-through running data store for given cm handle
126      * identifier on given resource using dmi client.
127      *
128      * @param dmiServiceName dmi service name
129      * @param cmHandle    network resource identifier
130      * @param resourceId  resource identifier
131      * @param fieldsQuery fields query
132      * @param depthQuery  depth query
133      * @param acceptParam accept parameter
134      * @param jsonBody    json body for put operation
135      * @return {@code ResponseEntity} response entity
136      */
137     public ResponseEntity<Object> getResourceDataPassThroughRunningFromDmi(final String dmiServiceName,
138                                                                            final String cmHandle,
139                                                                            final String resourceId,
140                                                                            final String fieldsQuery,
141                                                                            final Integer depthQuery,
142                                                                            final String acceptParam,
143                                                                            final String jsonBody) {
144         final var dmiResourceDataUrl = getDmiDatastoreUrl(dmiServiceName, cmHandle, resourceId,
145             fieldsQuery, depthQuery, DataStoreEnum.PASSTHROUGH_RUNNING);
146         final var httpHeaders = prepareHeader(acceptParam);
147         return dmiRestClient.putOperationWithJsonData(dmiResourceDataUrl, jsonBody, httpHeaders);
148     }
149
150     /**
151      * This method creates the resource data from pass-through running data store for given cm handle
152      * identifier on given resource using dmi client.
153      *
154      * @param dmiServiceName dmi service name
155      * @param cmHandle    network resource identifier
156      * @param resourceId  resource identifier
157      * @param jsonBody    json body for put operation
158      * @return {@code ResponseEntity} response entity
159      */
160     public ResponseEntity<String> createResourceDataPassThroughRunningFromDmi(final String dmiServiceName,
161                                                                             final String cmHandle,
162                                                                             final String resourceId,
163                                                                             final String jsonBody) {
164         final var stringBuilder = getStringBuilderForPassThroughRunningUrl(dmiServiceName,
165             cmHandle, resourceId, DataStoreEnum.PASSTHROUGH_RUNNING);
166         return dmiRestClient.postOperationWithJsonData(stringBuilder.toString(), jsonBody, new HttpHeaders());
167     }
168
169     @NotNull
170     private String getDmiResourceUrl(final String dmiServiceName,
171                                      final String cmHandle,
172                                      final String resourceName) {
173         final var stringBuilder = new StringBuilder(dmiServiceName);
174         stringBuilder.append(DMI_API_PATH);
175         stringBuilder.append(DMI_CM_HANDLE_PATH.replace("{cmHandle}", cmHandle));
176         stringBuilder.append(URL_SEPARATOR + resourceName);
177         return stringBuilder.toString();
178     }
179
180     @NotNull
181     private String getDmiDatastoreUrl(final String dmiServiceName,
182                                       final String cmHandle,
183                                       final String resourceId,
184                                       final String fieldsQuery,
185                                       final Integer depthQuery,
186                                       final DataStoreEnum dataStoreEnum) {
187         final var stringBuilder = getStringBuilderForPassThroughRunningUrl(dmiServiceName,
188             cmHandle, resourceId, dataStoreEnum);
189         appendFieldsAndDepth(stringBuilder, fieldsQuery, depthQuery);
190         return stringBuilder.toString();
191     }
192
193     @NotNull
194     private StringBuilder getStringBuilderForPassThroughRunningUrl(final String dmiServiceName,
195                                                                    final String cmHandle,
196                                                                    final String resourceId,
197                                                                    final DataStoreEnum dataStoreEnum) {
198         final var stringBuilder = new StringBuilder(dmiServiceName);
199         stringBuilder.append(DMI_API_PATH);
200         stringBuilder.append(DMI_CM_HANDLE_DATASTORE_PATH.replace("{cmHandle}", cmHandle));
201         stringBuilder.append(URL_SEPARATOR + dataStoreEnum.getValue());
202         stringBuilder.append(URL_SEPARATOR + resourceId);
203         return stringBuilder;
204     }
205
206     private void appendFieldsAndDepth(final StringBuilder stringBuilder,
207                                       final String fieldsQuery,
208                                       final Integer depthQuery) {
209         final var doesFieldExists = (fieldsQuery != null && !fieldsQuery.isEmpty());
210         if (doesFieldExists) {
211             stringBuilder.append("?").append("fields=").append(fieldsQuery);
212         }
213         if (depthQuery != null) {
214             if (doesFieldExists) {
215                 stringBuilder.append("&");
216             } else {
217                 stringBuilder.append("?");
218             }
219             stringBuilder.append("depth=").append(depthQuery);
220         }
221     }
222
223     private HttpHeaders prepareHeader(final String acceptParam) {
224         final var httpHeaders = new HttpHeaders();
225         if (acceptParam != null && !acceptParam.isEmpty()) {
226             httpHeaders.set(HttpHeaders.ACCEPT, acceptParam);
227         }
228         return httpHeaders;
229     }
230 }