2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2021 highstreet technologies GmbH
4 * Modifications Copyright (C) 2021 Nordix Foundation
5 * Modifications Copyright (C) 2021 Pantheon.tech
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
19 * SPDX-License-Identifier: Apache-2.0
20 * ============LICENSE_END=========================================================
23 package org.onap.cps.ncmp.api.impl;
25 import com.fasterxml.jackson.core.JsonProcessingException;
26 import com.fasterxml.jackson.databind.ObjectMapper;
27 import java.util.Collection;
28 import java.util.LinkedHashMap;
29 import java.util.LinkedList;
30 import java.util.List;
32 import lombok.extern.slf4j.Slf4j;
33 import org.onap.cps.api.CpsDataService;
34 import org.onap.cps.api.CpsQueryService;
35 import org.onap.cps.ncmp.api.NetworkCmProxyDataService;
36 import org.onap.cps.ncmp.api.impl.exception.NcmpException;
37 import org.onap.cps.ncmp.api.impl.operation.DmiOperations;
38 import org.onap.cps.ncmp.api.models.CmHandle;
39 import org.onap.cps.ncmp.api.models.DmiPluginRegistration;
40 import org.onap.cps.ncmp.api.models.GenericRequestBody;
41 import org.onap.cps.ncmp.api.models.PersistenceCmHandle;
42 import org.onap.cps.ncmp.api.models.PersistenceCmHandlesList;
43 import org.onap.cps.spi.FetchDescendantsOption;
44 import org.onap.cps.spi.exceptions.DataValidationException;
45 import org.onap.cps.spi.model.DataNode;
46 import org.springframework.http.HttpStatus;
47 import org.springframework.http.ResponseEntity;
48 import org.springframework.stereotype.Service;
49 import org.springframework.util.StringUtils;
54 public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService {
56 private static final String NF_PROXY_DATASPACE_NAME = "NFP-Operational";
58 private static final String NCMP_DATASPACE_NAME = "NCMP-Admin";
60 private static final String NCMP_DMI_REGISTRY_ANCHOR = "ncmp-dmi-registry";
62 private CpsDataService cpsDataService;
64 private ObjectMapper objectMapper;
66 private CpsQueryService cpsQueryService;
68 private DmiOperations dmiOperations;
71 * Constructor Injection for Dependencies.
72 * @param dmiOperations dmi operation
73 * @param cpsDataService Data Service Interface
74 * @param cpsQueryService Query Service Interface
75 * @param objectMapper Object Mapper
77 public NetworkCmProxyDataServiceImpl(final DmiOperations dmiOperations, final CpsDataService cpsDataService,
78 final CpsQueryService cpsQueryService, final ObjectMapper objectMapper) {
79 this.dmiOperations = dmiOperations;
80 this.cpsDataService = cpsDataService;
81 this.cpsQueryService = cpsQueryService;
82 this.objectMapper = objectMapper;
85 private String getDataspaceName() {
86 return NF_PROXY_DATASPACE_NAME;
90 public DataNode getDataNode(final String cmHandle, final String xpath,
91 final FetchDescendantsOption fetchDescendantsOption) {
92 return cpsDataService.getDataNode(getDataspaceName(), cmHandle, xpath, fetchDescendantsOption);
96 public Collection<DataNode> queryDataNodes(final String cmHandle, final String cpsPath,
97 final FetchDescendantsOption fetchDescendantsOption) {
98 return cpsQueryService.queryDataNodes(getDataspaceName(), cmHandle, cpsPath, fetchDescendantsOption);
102 public void createDataNode(final String cmHandle, final String parentNodeXpath, final String jsonData) {
103 if (!StringUtils.hasText(parentNodeXpath) || "/".equals(parentNodeXpath)) {
104 cpsDataService.saveData(getDataspaceName(), cmHandle, jsonData);
106 cpsDataService.saveData(getDataspaceName(), cmHandle, parentNodeXpath, jsonData);
111 public void addListNodeElements(final String cmHandle, final String parentNodeXpath, final String jsonData) {
112 cpsDataService.saveListNodeData(getDataspaceName(), cmHandle, parentNodeXpath, jsonData);
116 public void updateNodeLeaves(final String cmHandle, final String parentNodeXpath, final String jsonData) {
117 cpsDataService.updateNodeLeaves(getDataspaceName(), cmHandle, parentNodeXpath, jsonData);
121 public void replaceNodeTree(final String cmHandle, final String parentNodeXpath, final String jsonData) {
122 cpsDataService.replaceNodeTree(getDataspaceName(), cmHandle, parentNodeXpath, jsonData);
126 public void updateDmiPluginRegistration(final DmiPluginRegistration dmiPluginRegistration) {
127 if (dmiPluginRegistration.getCreatedCmHandles() != null) {
128 parseAndCreateCmHandlesInDmiRegistration(dmiPluginRegistration);
130 if (dmiPluginRegistration.getUpdatedCmHandles() != null) {
131 parseAndUpdateCmHandlesInDmiRegistration(dmiPluginRegistration);
135 private void parseAndCreateCmHandlesInDmiRegistration(final DmiPluginRegistration dmiPluginRegistration) {
137 final List<PersistenceCmHandle> createdPersistenceCmHandles =
139 for (final CmHandle cmHandle: dmiPluginRegistration.getCreatedCmHandles()) {
140 createdPersistenceCmHandles.add(toPersistenceCmHandle(dmiPluginRegistration, cmHandle));
142 final PersistenceCmHandlesList persistenceCmHandlesList = new PersistenceCmHandlesList();
143 persistenceCmHandlesList.setCmHandles(createdPersistenceCmHandles);
144 final String cmHandleJsonData = objectMapper.writeValueAsString(persistenceCmHandlesList);
145 cpsDataService.saveListNodeData(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR, "/dmi-registry",
147 } catch (final JsonProcessingException e) {
148 log.error("Parsing error occurred while converting Object to JSON for Dmi Registry.");
149 throw new DataValidationException(
150 "Parsing error occurred while processing DMI Plugin Registration" + dmiPluginRegistration, e
155 private void parseAndUpdateCmHandlesInDmiRegistration(final DmiPluginRegistration dmiPluginRegistration) {
157 final List<PersistenceCmHandle> updatedPersistenceCmHandles =
159 for (final CmHandle cmHandle: dmiPluginRegistration.getUpdatedCmHandles()) {
160 updatedPersistenceCmHandles.add(toPersistenceCmHandle(dmiPluginRegistration, cmHandle));
162 final PersistenceCmHandlesList persistenceCmHandlesList = new PersistenceCmHandlesList();
163 persistenceCmHandlesList.setCmHandles(updatedPersistenceCmHandles);
164 final String cmHandlesJsonData = objectMapper.writeValueAsString(persistenceCmHandlesList);
165 cpsDataService.updateNodeLeavesAndExistingDescendantLeaves(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR,
166 "/dmi-registry", cmHandlesJsonData);
167 } catch (final JsonProcessingException e) {
168 log.error("Parsing error occurred while converting Object to JSON Dmi Registry.");
169 throw new DataValidationException(
170 "Parsing error occurred while processing DMI Plugin Registration" + dmiPluginRegistration, e
176 public Object getResourceDataOperationalFoCmHandle(final String cmHandle,
177 final String resourceIdentifier,
178 final String acceptParam,
179 final String fieldsQueryParam,
180 final Integer depthQueryParam) {
182 final DataNode dataNode = fetchDataNodeFromDmiRegistryForCmHandle(cmHandle);
183 final String dmiServiceName = String.valueOf(dataNode.getLeaves().get("dmi-service-name"));
184 final Collection<DataNode> additionalPropsList = dataNode.getChildDataNodes();
185 final String jsonBody = prepareOperationBody(GenericRequestBody.OperationEnum.READ, additionalPropsList);
186 final ResponseEntity<Object> response = dmiOperations.getResouceDataFromDmi(dmiServiceName,
193 return handleResponse(response);
196 private DataNode fetchDataNodeFromDmiRegistryForCmHandle(final String cmHandle) {
197 final String xpathForDmiRegistryToFetchCmHandle = "/dmi-registry/cm-handles[@id='" + cmHandle + "']";
198 final var dataNode = cpsDataService.getDataNode(NCMP_DATASPACE_NAME,
199 NCMP_DMI_REGISTRY_ANCHOR,
200 xpathForDmiRegistryToFetchCmHandle,
201 FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS);
205 private String prepareOperationBody(final GenericRequestBody.OperationEnum operation,
206 final Collection<DataNode> additionalPropertyList) {
207 final GenericRequestBody requestBody = new GenericRequestBody();
208 final Map<String, String> additionalPropertyMap = getAdditionalPropertiesMap(additionalPropertyList);
209 requestBody.setOperation(GenericRequestBody.OperationEnum.READ);
210 requestBody.setCmHandleProperties(additionalPropertyMap);
212 final String requestJson = objectMapper.writeValueAsString(requestBody);
214 } catch (final JsonProcessingException je) {
215 log.error("Parsing error occurred while converting Object to JSON.");
216 throw new NcmpException("Parsing error occurred while converting given object to JSON.",
221 private Map<String, String> getAdditionalPropertiesMap(final Collection<DataNode> additionalPropertyList) {
222 if (additionalPropertyList == null || additionalPropertyList.size() == 0) {
225 final Map<String, String> additionalPropertyMap = new LinkedHashMap<>();
226 for (final DataNode node: additionalPropertyList) {
227 additionalPropertyMap.put(String.valueOf(node.getLeaves().get("name")),
228 String.valueOf(node.getLeaves().get("value")));
230 return additionalPropertyMap;
233 private Object handleResponse(final ResponseEntity<Object> responseEntity) {
234 if (responseEntity.getStatusCode() == HttpStatus.OK) {
235 return responseEntity.getBody();
237 throw new NcmpException("Not able to get resource data.",
238 "DMI status code: " + responseEntity.getStatusCodeValue()
239 + ", DMI response body: " + responseEntity.getBody());
243 private PersistenceCmHandle toPersistenceCmHandle(final DmiPluginRegistration dmiPluginRegistration,
244 final CmHandle cmHandle) {
245 final PersistenceCmHandle persistenceCmHandle = new PersistenceCmHandle();
246 persistenceCmHandle.setDmiServiceName(dmiPluginRegistration.getDmiPlugin());
247 persistenceCmHandle.setId(cmHandle.getCmHandleID());
248 persistenceCmHandle.setAdditionalProperties(cmHandle.getCmHandleProperties());
249 return persistenceCmHandle;