Merge "Changing resource identifier to a query param"
[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     private static final String RESOURCE_IDENTIFIER = "resourceIdentifier";
56
57
58     /**
59      * Constructor for {@code DmiOperations}. This method also manipulates url properties.
60      *
61      * @param dmiRestClient {@code DmiRestClient}
62      */
63     public DmiOperations(final DmiRestClient dmiRestClient) {
64         this.dmiRestClient = dmiRestClient;
65     }
66
67     /**
68      * Get resources from DMI.
69      *
70      * @param dmiServiceName dmi service name
71      * @param cmHandle cmHandle
72      * @param resourceName name of the resource(s)
73      * @return {@code ResponseEntity} response entity
74      */
75     public ResponseEntity<String> getResourceFromDmi(final String dmiServiceName,
76                                                      final String cmHandle,
77                                                      final String resourceName) {
78         final var dmiResourceDataUrl = getDmiResourceUrl(dmiServiceName, cmHandle, resourceName);
79         final var httpHeaders = new HttpHeaders();
80         return dmiRestClient.postOperation(dmiResourceDataUrl, httpHeaders);
81     }
82
83     /**
84      * Get resources from DMI for modules.
85      *
86      * @param dmiServiceName dmi service name
87      * @param jsonData module names and revisions as JSON
88      * @param cmHandle cmHandle
89      * @param resourceName name of the resource(s)
90      * @return {@code ResponseEntity} response entity
91      */
92     public ResponseEntity<String> getResourceFromDmiWithJsonData(final String dmiServiceName,
93                                                                final String jsonData,
94                                                                final String cmHandle,
95                                                                final String resourceName) {
96         final String dmiResourceDataUrl = getDmiResourceUrl(dmiServiceName, cmHandle, resourceName);
97         return dmiRestClient.postOperationWithJsonData(dmiResourceDataUrl, jsonData, new HttpHeaders());
98     }
99
100     /**
101      * This method fetches the resource data from operational data store for given cm handle
102      * identifier on given resource using dmi client.
103      *
104      * @param dmiServiceName dmi service name
105      * @param cmHandle    network resource identifier
106      * @param resourceId  resource identifier
107      * @param fieldsQuery fields query
108      * @param depthQuery  depth query
109      * @param acceptParam accept parameter
110      * @param jsonBody    json body for put operation
111      * @return {@code ResponseEntity} response entity
112      */
113     public ResponseEntity<Object> getResourceDataOperationalFromDmi(final String dmiServiceName,
114                                                                     final String cmHandle,
115                                                                     final String resourceId,
116                                                                     final String fieldsQuery,
117                                                                     final Integer depthQuery,
118                                                                     final String acceptParam,
119                                                                     final String jsonBody) {
120         final var dmiResourceDataUrl = getDmiDatastoreUrl(dmiServiceName, cmHandle, resourceId,
121             fieldsQuery, depthQuery, DataStoreEnum.PASSTHROUGH_OPERATIONAL);
122         final var httpHeaders = prepareHeader(acceptParam);
123         return dmiRestClient.putOperationWithJsonData(dmiResourceDataUrl, jsonBody, httpHeaders);
124     }
125
126     /**
127      * This method fetches the resource data from pass-through running data store for given cm handle
128      * identifier on given resource using dmi client.
129      *
130      * @param dmiServiceName dmi service name
131      * @param cmHandle    network resource identifier
132      * @param resourceId  resource identifier
133      * @param fieldsQuery fields query
134      * @param depthQuery  depth query
135      * @param acceptParam accept parameter
136      * @param jsonBody    json body for put operation
137      * @return {@code ResponseEntity} response entity
138      */
139     public ResponseEntity<Object> getResourceDataPassThroughRunningFromDmi(final String dmiServiceName,
140                                                                            final String cmHandle,
141                                                                            final String resourceId,
142                                                                            final String fieldsQuery,
143                                                                            final Integer depthQuery,
144                                                                            final String acceptParam,
145                                                                            final String jsonBody) {
146         final var dmiResourceDataUrl = getDmiDatastoreUrl(dmiServiceName, cmHandle, resourceId,
147             fieldsQuery, depthQuery, DataStoreEnum.PASSTHROUGH_RUNNING);
148         final var httpHeaders = prepareHeader(acceptParam);
149         return dmiRestClient.putOperationWithJsonData(dmiResourceDataUrl, jsonBody, httpHeaders);
150     }
151
152     /**
153      * This method creates the resource data from pass-through running data store for given cm handle
154      * identifier on given resource using dmi client.
155      *
156      * @param dmiServiceName dmi service name
157      * @param cmHandle    network resource identifier
158      * @param resourceId  resource identifier
159      * @param jsonBody    json body for put operation
160      * @return {@code ResponseEntity} response entity
161      */
162     public ResponseEntity<String> createResourceDataPassThroughRunningFromDmi(final String dmiServiceName,
163                                                                             final String cmHandle,
164                                                                             final String resourceId,
165                                                                             final String jsonBody) {
166         final var stringBuilder = getStringBuilderForPassThroughRunningUrl(dmiServiceName,
167             cmHandle, resourceId, DataStoreEnum.PASSTHROUGH_RUNNING);
168         return dmiRestClient.postOperationWithJsonData(stringBuilder.toString(), jsonBody, new HttpHeaders());
169     }
170
171     @NotNull
172     private String getDmiResourceUrl(final String dmiServiceName,
173                                      final String cmHandle,
174                                      final String resourceName) {
175         final var stringBuilder = new StringBuilder(dmiServiceName);
176         stringBuilder.append(DMI_API_PATH);
177         stringBuilder.append(DMI_CM_HANDLE_PATH.replace("{cmHandle}", cmHandle));
178         stringBuilder.append(URL_SEPARATOR + resourceName);
179         return stringBuilder.toString();
180     }
181
182     @NotNull
183     private String getDmiDatastoreUrl(final String dmiServiceName,
184                                       final String cmHandle,
185                                       final String resourceId,
186                                       final String fieldsQuery,
187                                       final Integer depthQuery,
188                                       final DataStoreEnum dataStoreEnum) {
189         final var stringBuilder = getStringBuilderForPassThroughRunningUrl(dmiServiceName,
190             cmHandle, resourceId, dataStoreEnum);
191         appendFieldsAndDepth(stringBuilder, fieldsQuery, depthQuery);
192         return stringBuilder.toString();
193     }
194
195     @NotNull
196     private StringBuilder getStringBuilderForPassThroughRunningUrl(final String dmiServiceName,
197                                                                    final String cmHandle,
198                                                                    final String resourceId,
199                                                                    final DataStoreEnum dataStoreEnum) {
200         final var stringBuilder = new StringBuilder(dmiServiceName);
201         stringBuilder.append(DMI_API_PATH);
202         stringBuilder.append(DMI_CM_HANDLE_DATASTORE_PATH.replace("{cmHandle}", cmHandle));
203         stringBuilder.append(URL_SEPARATOR + dataStoreEnum.getValue());
204         stringBuilder.append("?" + RESOURCE_IDENTIFIER + "=" + resourceId);
205         return stringBuilder;
206     }
207
208     private void appendFieldsAndDepth(final StringBuilder stringBuilder,
209                                       final String fieldsQuery,
210                                       final Integer depthQuery) {
211         final var doesFieldExists = (fieldsQuery != null && !fieldsQuery.isEmpty());
212         if (doesFieldExists) {
213             stringBuilder.append("&").append("fields=").append(fieldsQuery);
214         }
215         if (depthQuery != null) {
216             stringBuilder.append("&").append("depth=").append(depthQuery);
217         }
218     }
219
220     private HttpHeaders prepareHeader(final String acceptParam) {
221         final var httpHeaders = new HttpHeaders();
222         if (acceptParam != null && !acceptParam.isEmpty()) {
223             httpHeaders.set(HttpHeaders.ACCEPT, acceptParam);
224         }
225         return httpHeaders;
226     }
227 }