562c330657ecf47fb3e376f550a62058e445f588
[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     private String getDmiDatastoreUrl(final String dmiServiceName,
178                                       final String cmHandle,
179                                       final String resourceId,
180                                       final String optionsParamInQuery,
181                                       final DataStoreEnum dataStoreEnum) {
182         final var stringBuilder = getStringBuilderForPassThroughUrl(dmiServiceName,
183             cmHandle, resourceId, dataStoreEnum);
184         appendOptionsQuery(stringBuilder, optionsParamInQuery);
185         return stringBuilder.toString();
186     }
187
188     private StringBuilder getStringBuilderForPassThroughUrl(final String dmiServiceName,
189                                                             final String cmHandle,
190                                                             final String resourceId,
191                                                             final DataStoreEnum dataStoreEnum) {
192         final var stringBuilder = new StringBuilder(dmiServiceName);
193         stringBuilder.append(DMI_API_PATH);
194         stringBuilder.append(DMI_CM_HANDLE_DATASTORE_PATH.replace("{cmHandle}", cmHandle));
195         stringBuilder.append(URL_SEPARATOR + dataStoreEnum.getValue());
196         stringBuilder.append("?" + RESOURCE_IDENTIFIER + "=" + resourceId);
197         return stringBuilder;
198     }
199
200     private void appendOptionsQuery(final StringBuilder stringBuilder,
201                                     final String optionsParamInQuery) {
202         if (optionsParamInQuery != null) {
203             stringBuilder.append("&").append(OPTIONS_QUERY_KEY).append("=").append(optionsParamInQuery);
204         }
205     }
206
207     private HttpHeaders prepareHeader(final String acceptParam) {
208         final var httpHeaders = new HttpHeaders();
209         httpHeaders.set(HttpHeaders.ACCEPT, acceptParam);
210         return httpHeaders;
211     }
212 }