Update operation passthrough running - Service Layer
[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.onap.cps.ncmp.api.impl.client.DmiRestClient;
26 import org.springframework.http.HttpHeaders;
27 import org.springframework.http.ResponseEntity;
28 import org.springframework.stereotype.Component;
29
30 @Component
31 public class DmiOperations {
32     @Getter
33     public enum DataStoreEnum {
34         PASSTHROUGH_OPERATIONAL("ncmp-datastore:passthrough-operational"),
35         PASSTHROUGH_RUNNING("ncmp-datastore:passthrough-running");
36         private String value;
37
38         DataStoreEnum(final String value) {
39             this.value = value;
40         }
41
42         @Override
43         @JsonValue
44         public String toString() {
45             return value;
46         }
47     }
48
49     private DmiRestClient dmiRestClient;
50     private static final String DMI_API_PATH = "/dmi";
51     private static final String DMI_CM_HANDLE_PATH = "/v1/ch/{cmHandle}";
52     private static final String DMI_CM_HANDLE_DATASTORE_PATH = DMI_CM_HANDLE_PATH + "/data/ds";
53     private static final String URL_SEPARATOR = "/";
54     private static final String RESOURCE_IDENTIFIER = "resourceIdentifier";
55     private static final String OPTIONS_QUERY_KEY = "options";
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 optionsParamInQuery options query
108      * @param acceptParamInHeader accept parameter
109      * @param jsonBody    json body for put operation
110      * @return {@code ResponseEntity} response entity
111      */
112     public ResponseEntity<Object> getResourceDataOperationalFromDmi(final String dmiServiceName,
113                                                                     final String cmHandle,
114                                                                     final String resourceId,
115                                                                     final String optionsParamInQuery,
116                                                                     final String acceptParamInHeader,
117                                                                     final String jsonBody) {
118         final var dmiResourceDataUrl = getDmiDatastoreUrl(dmiServiceName, cmHandle, resourceId,
119             optionsParamInQuery, DataStoreEnum.PASSTHROUGH_OPERATIONAL);
120         final var httpHeaders = prepareHeader(acceptParamInHeader);
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 optionsParamInQuery fields query
132      * @param acceptParamInHeader accept parameter
133      * @param jsonBody    json body for put operation
134      * @return {@code ResponseEntity} response entity
135      */
136     public ResponseEntity<Object> getResourceDataPassThroughRunningFromDmi(final String dmiServiceName,
137                                                                            final String cmHandle,
138                                                                            final String resourceId,
139                                                                            final String optionsParamInQuery,
140                                                                            final String acceptParamInHeader,
141                                                                            final String jsonBody) {
142         final var dmiResourceDataUrl = getDmiDatastoreUrl(dmiServiceName, cmHandle, resourceId,
143             optionsParamInQuery, DataStoreEnum.PASSTHROUGH_RUNNING);
144         final var httpHeaders = prepareHeader(acceptParamInHeader);
145         return dmiRestClient.putOperationWithJsonData(dmiResourceDataUrl, jsonBody, httpHeaders);
146     }
147
148     /**
149      * This method creates the resource data from pass-through running data store for given cm handle
150      * identifier on given resource using dmi client.
151      *
152      * @param dmiServiceName dmi service name
153      * @param cmHandle    network resource identifier
154      * @param resourceId  resource identifier
155      * @param jsonBody    json body for put operation
156      * @return {@code ResponseEntity} response entity
157      */
158     public ResponseEntity<String> createResourceDataPassThroughRunningFromDmi(final String dmiServiceName,
159                                                                             final String cmHandle,
160                                                                             final String resourceId,
161                                                                             final String jsonBody) {
162         final var stringBuilder = getStringBuilderForPassThroughUrl(dmiServiceName,
163             cmHandle, resourceId, DataStoreEnum.PASSTHROUGH_RUNNING);
164         return dmiRestClient.postOperationWithJsonData(stringBuilder.toString(), jsonBody, new HttpHeaders());
165     }
166
167     private String getDmiResourceUrl(final String dmiServiceName,
168                                      final String cmHandle,
169                                      final String resourceName) {
170         final var stringBuilder = new StringBuilder(dmiServiceName);
171         stringBuilder.append(DMI_API_PATH);
172         stringBuilder.append(DMI_CM_HANDLE_PATH.replace("{cmHandle}", cmHandle));
173         stringBuilder.append(URL_SEPARATOR + resourceName);
174         return stringBuilder.toString();
175     }
176
177     /**
178      * This method updates the resource data from pass-through running data store for the cm handle identifier on given
179      * resource using dmi client.
180      *
181      * @param dmiServiceName dmi service name
182      * @param cmHandle    network resource identifier
183      * @param resourceId  resource identifier
184      * @param jsonBody    json body for put operation
185      * @return {@code ResponseEntity} response entity
186      */
187     public ResponseEntity<String> updateResourceDataPassThroughRunningFromDmi(final String dmiServiceName,
188         final String cmHandle, final String resourceId, final String jsonBody) {
189         final StringBuilder stringBuilder =
190             getStringBuilderForPassThroughUrl(dmiServiceName, cmHandle, resourceId, DataStoreEnum.PASSTHROUGH_RUNNING);
191         return dmiRestClient.postOperationWithJsonData(stringBuilder.toString(), jsonBody, new HttpHeaders());
192     }
193
194     private String getDmiDatastoreUrl(final String dmiServiceName,
195                                       final String cmHandle,
196                                       final String resourceId,
197                                       final String optionsParamInQuery,
198                                       final DataStoreEnum dataStoreEnum) {
199         final var stringBuilder = getStringBuilderForPassThroughUrl(dmiServiceName,
200             cmHandle, resourceId, dataStoreEnum);
201         appendOptionsQuery(stringBuilder, optionsParamInQuery);
202         return stringBuilder.toString();
203     }
204
205     private StringBuilder getStringBuilderForPassThroughUrl(final String dmiServiceName,
206                                                             final String cmHandle,
207                                                             final String resourceId,
208                                                             final DataStoreEnum dataStoreEnum) {
209         final var stringBuilder = new StringBuilder(dmiServiceName);
210         stringBuilder.append(DMI_API_PATH);
211         stringBuilder.append(DMI_CM_HANDLE_DATASTORE_PATH.replace("{cmHandle}", cmHandle));
212         stringBuilder.append(URL_SEPARATOR + dataStoreEnum.getValue());
213         stringBuilder.append("?" + RESOURCE_IDENTIFIER + "=" + resourceId);
214         return stringBuilder;
215     }
216
217     private void appendOptionsQuery(final StringBuilder stringBuilder,
218                                     final String optionsParamInQuery) {
219         if (optionsParamInQuery != null) {
220             stringBuilder.append("&").append(OPTIONS_QUERY_KEY).append("=").append(optionsParamInQuery);
221         }
222     }
223
224     private HttpHeaders prepareHeader(final String acceptParam) {
225         final var httpHeaders = new HttpHeaders();
226         httpHeaders.set(HttpHeaders.ACCEPT, acceptParam);
227         return httpHeaders;
228     }
229 }