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
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 * SPDX-License-Identifier: Apache-2.0
18 * ============LICENSE_END=========================================================
21 package org.onap.cps.ncmp.api.impl.operation;
23 import com.fasterxml.jackson.annotation.JsonValue;
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;
32 public class DmiOperations {
34 public enum DataStoreEnum {
35 PASSTHROUGH_OPERATIONAL("ncmp-datastore:passthrough-operational"),
36 PASSTHROUGH_RUNNING("ncmp-datastore:passthrough-running");
39 DataStoreEnum(final String value) {
45 public String toString() {
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";
59 * Constructor for {@code DmiOperations}. This method also manipulates url properties.
61 * @param dmiRestClient {@code DmiRestClient}
63 public DmiOperations(final DmiRestClient dmiRestClient) {
64 this.dmiRestClient = dmiRestClient;
68 * Get resources from DMI.
70 * @param dmiServiceName dmi service name
71 * @param cmHandle cmHandle
72 * @param resourceName name of the resource(s)
73 * @return {@code ResponseEntity} response entity
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);
84 * Get resources from DMI for modules.
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
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());
101 * This method fetches the resource data from operational data store for given cm handle
102 * identifier on given resource using dmi client.
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
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);
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.
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
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);
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.
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
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());
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();
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();
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;
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);
215 if (depthQuery != null) {
216 stringBuilder.append("&").append("depth=").append(depthQuery);
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);