d6feaf3adfe8feefb05b65e89a9c00939a5984b2
[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     /**
83      * This method fetches the resource data from operational data store for given cm handle
84      * identifier on given resource using dmi client.
85      *
86      * @param dmiServiceName dmi service name
87      * @param cmHandle    network resource identifier
88      * @param resourceId  resource identifier
89      * @param fieldsQuery fields query
90      * @param depthQuery  depth query
91      * @param acceptParam accept parameter
92      * @param jsonBody    json body for put operation
93      * @return {@code ResponseEntity} response entity
94      */
95     public ResponseEntity<Object> getResourceDataOperationalFromDmi(final String dmiServiceName,
96                                                                     final String cmHandle,
97                                                                     final String resourceId,
98                                                                     final String fieldsQuery,
99                                                                     final Integer depthQuery,
100                                                                     final String acceptParam,
101                                                                     final String jsonBody) {
102         final var dmiResourceDataUrl = getDmiDatastoreUrl(dmiServiceName, cmHandle, resourceId,
103             fieldsQuery, depthQuery, DataStoreEnum.PASSTHROUGH_OPERATIONAL);
104         final var httpHeaders = prepareHeader(acceptParam);
105         return dmiRestClient.putOperationWithJsonData(dmiResourceDataUrl, jsonBody, httpHeaders);
106     }
107
108     /**
109      * This method fetches the resource data from pass-through running data store for given cm handle
110      * identifier on given resource using dmi client.
111      *
112      * @param dmiServiceName dmi service name
113      * @param cmHandle    network resource identifier
114      * @param resourceId  resource identifier
115      * @param fieldsQuery fields query
116      * @param depthQuery  depth query
117      * @param acceptParam accept parameter
118      * @param jsonBody    json body for put operation
119      * @return {@code ResponseEntity} response entity
120      */
121     public ResponseEntity<Object> getResourceDataPassThroughRunningFromDmi(final String dmiServiceName,
122                                                                            final String cmHandle,
123                                                                            final String resourceId,
124                                                                            final String fieldsQuery,
125                                                                            final Integer depthQuery,
126                                                                            final String acceptParam,
127                                                                            final String jsonBody) {
128         final var dmiResourceDataUrl = getDmiDatastoreUrl(dmiServiceName, cmHandle, resourceId,
129             fieldsQuery, depthQuery, DataStoreEnum.PASSTHROUGH_RUNNING);
130         final var httpHeaders = prepareHeader(acceptParam);
131         return dmiRestClient.putOperationWithJsonData(dmiResourceDataUrl, jsonBody, httpHeaders);
132     }
133
134     /**
135      * This method creates the resource data from pass-through running data store for given cm handle
136      * identifier on given resource using dmi client.
137      *
138      * @param dmiServiceName dmi service name
139      * @param cmHandle    network resource identifier
140      * @param resourceId  resource identifier
141      * @param jsonBody    json body for put operation
142      * @return {@code ResponseEntity} response entity
143      */
144     public ResponseEntity<Void> createResourceDataPassThroughRunningFromDmi(final String dmiServiceName,
145                                                                             final String cmHandle,
146                                                                             final String resourceId,
147                                                                             final String jsonBody) {
148         final var stringBuilder = getStringBuilderForPassThroughRunningUrl(dmiServiceName,
149             cmHandle, resourceId, DataStoreEnum.PASSTHROUGH_RUNNING);
150         return dmiRestClient.postOperationWithJsonData(stringBuilder.toString(), jsonBody, new HttpHeaders());
151     }
152
153     @NotNull
154     private String getDmiResourceUrl(final String dmiServiceName,
155                                      final String cmHandle,
156                                      final String resourceName) {
157         final var stringBuilder = new StringBuilder(dmiServiceName);
158         stringBuilder.append(DMI_API_PATH);
159         stringBuilder.append(DMI_CM_HANDLE_PATH.replace("{cmHandle}", cmHandle));
160         stringBuilder.append(URL_SEPARATOR + resourceName);
161         return stringBuilder.toString();
162     }
163
164     @NotNull
165     private String getDmiDatastoreUrl(final String dmiServiceName,
166                                       final String cmHandle,
167                                       final String resourceId,
168                                       final String fieldsQuery,
169                                       final Integer depthQuery,
170                                       final DataStoreEnum dataStoreEnum) {
171         final var stringBuilder = getStringBuilderForPassThroughRunningUrl(dmiServiceName,
172             cmHandle, resourceId, dataStoreEnum);
173         appendFieldsAndDepth(stringBuilder, fieldsQuery, depthQuery);
174         return stringBuilder.toString();
175     }
176
177     @NotNull
178     private StringBuilder getStringBuilderForPassThroughRunningUrl(final String dmiServiceName,
179                                                                    final String cmHandle,
180                                                                    final String resourceId,
181                                                                    final DataStoreEnum dataStoreEnum) {
182         final var stringBuilder = new StringBuilder(dmiServiceName);
183         stringBuilder.append(DMI_API_PATH);
184         stringBuilder.append(DMI_CM_HANDLE_DATASTORE_PATH.replace("{cmHandle}", cmHandle));
185         stringBuilder.append(URL_SEPARATOR + dataStoreEnum.getValue());
186         stringBuilder.append(URL_SEPARATOR + resourceId);
187         return stringBuilder;
188     }
189
190     private void appendFieldsAndDepth(final StringBuilder stringBuilder,
191                                       final String fieldsQuery,
192                                       final Integer depthQuery) {
193         final var doesFieldExists = (fieldsQuery != null && !fieldsQuery.isEmpty());
194         if (doesFieldExists) {
195             stringBuilder.append("?").append("fields=").append(fieldsQuery);
196         }
197         if (depthQuery != null) {
198             if (doesFieldExists) {
199                 stringBuilder.append("&");
200             } else {
201                 stringBuilder.append("?");
202             }
203             stringBuilder.append("depth=").append(depthQuery);
204         }
205     }
206
207     private HttpHeaders prepareHeader(final String acceptParam) {
208         final var httpHeaders = new HttpHeaders();
209         if (acceptParam != null && !acceptParam.isEmpty()) {
210             httpHeaders.set(HttpHeaders.ACCEPT, acceptParam);
211         }
212         return httpHeaders;
213     }
214 }