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";
56 private static final String OPTIONS_QUERY_KEY = "options";
60 * Constructor for {@code DmiOperations}. This method also manipulates url properties.
62 * @param dmiRestClient {@code DmiRestClient}
64 public DmiOperations(final DmiRestClient dmiRestClient) {
65 this.dmiRestClient = dmiRestClient;
69 * Get resources from DMI.
71 * @param dmiServiceName dmi service name
72 * @param cmHandle cmHandle
73 * @param resourceName name of the resource(s)
74 * @return {@code ResponseEntity} response entity
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);
85 * Get resources from DMI for modules.
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
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());
102 * This method fetches the resource data from operational data store for given cm handle
103 * identifier on given resource using dmi client.
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
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);
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.
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
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);
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.
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
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());
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();
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();
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;
204 private void appendOptionsQuery(final StringBuilder stringBuilder,
205 final String optionsParamInQuery) {
206 if (optionsParamInQuery != null) {
207 stringBuilder.append("&").append(OPTIONS_QUERY_KEY).append("=").append(optionsParamInQuery);
211 private HttpHeaders prepareHeader(final String acceptParam) {
212 final var httpHeaders = new HttpHeaders();
213 httpHeaders.set(HttpHeaders.ACCEPT, acceptParam);