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