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.operations;
23 import static org.onap.cps.ncmp.api.impl.operations.RequiredDmiService.MODEL;
25 import com.fasterxml.jackson.databind.ObjectMapper;
26 import com.google.gson.JsonArray;
27 import com.google.gson.JsonObject;
28 import java.util.ArrayList;
29 import java.util.HashMap;
30 import java.util.List;
32 import org.onap.cps.ncmp.api.impl.client.DmiRestClient;
33 import org.onap.cps.ncmp.api.impl.config.NcmpConfiguration;
34 import org.onap.cps.ncmp.api.models.PersistenceCmHandle;
35 import org.onap.cps.ncmp.api.models.YangResource;
36 import org.onap.cps.spi.model.ModuleReference;
37 import org.springframework.http.HttpHeaders;
38 import org.springframework.http.ResponseEntity;
39 import org.springframework.stereotype.Component;
42 public class DmiModelOperations extends DmiOperations {
45 * Constructor for {@code DmiOperations}. This method also manipulates url properties.
47 * @param dmiRestClient {@code DmiRestClient}
49 public DmiModelOperations(final PersistenceCmHandleRetriever cmHandlePropertiesRetriever,
50 final ObjectMapper objectMapper,
51 final NcmpConfiguration.DmiProperties dmiProperties,
52 final DmiRestClient dmiRestClient) {
53 super(cmHandlePropertiesRetriever, objectMapper, dmiProperties, dmiRestClient);
57 * Retrieves module references.
59 * @param persistenceCmHandle the persistence cm handle
60 * @return module references
62 public List<ModuleReference> getModuleReferences(final PersistenceCmHandle persistenceCmHandle) {
63 final DmiRequestBody dmiRequestBody = DmiRequestBody.builder()
65 dmiRequestBody.asCmHandleProperties(persistenceCmHandle.getAdditionalProperties());
66 final ResponseEntity<Object> dmiFetchModulesResponseEntity = getResourceFromDmiWithJsonData(
67 persistenceCmHandle.resolveDmiServiceName(MODEL),
68 getDmiRequestBodyAsString(dmiRequestBody), persistenceCmHandle.getId(), "modules");
69 return toModuleReferences((Map) dmiFetchModulesResponseEntity.getBody());
73 * Retrieve yang resources from dmi for any modules that CPS-NCMP hasn't cached before.
75 * @param persistenceCmHandle the persistenceCmHandle
76 * @param unknownModuleReferences the unknown module references
77 * @return yang resources as map of module name to yang(re)source
79 public Map<String, String> getNewYangResourcesFromDmi(final PersistenceCmHandle persistenceCmHandle,
80 final List<ModuleReference> unknownModuleReferences) {
81 final String jsonDataWithDataAndCmHandleProperties = getRequestBodyToFetchYangResources(
82 unknownModuleReferences, persistenceCmHandle.getAdditionalProperties());
83 final ResponseEntity<Object> responseEntity = getResourceFromDmiWithJsonData(
84 persistenceCmHandle.resolveDmiServiceName(MODEL),
85 jsonDataWithDataAndCmHandleProperties,
86 persistenceCmHandle.getId(),
88 return asModuleNameToYangResourceMap(responseEntity);
92 * Get resources from DMI for modules.
94 * @param dmiServiceName dmi service name
95 * @param jsonData module names and revisions as JSON
96 * @param cmHandle cmHandle
97 * @param resourceName name of the resource(s)
98 * @return {@code ResponseEntity} response entity
100 private ResponseEntity<Object> getResourceFromDmiWithJsonData(final String dmiServiceName,
101 final String jsonData,
102 final String cmHandle,
103 final String resourceName) {
104 final String dmiResourceDataUrl = getDmiResourceUrl(dmiServiceName, cmHandle, resourceName);
105 return dmiRestClient.postOperationWithJsonData(dmiResourceDataUrl, jsonData, new HttpHeaders());
108 private static String getRequestBodyToFetchYangResources(final List<ModuleReference> unknownModuleReferences,
109 final List<PersistenceCmHandle.AdditionalProperty> cmHandleProperties) {
110 final JsonArray moduleReferencesAsJson = getModuleReferencesAsJson(unknownModuleReferences);
111 final JsonObject data = new JsonObject();
112 data.add("modules", moduleReferencesAsJson);
113 final JsonObject jsonRequestObject = new JsonObject();
114 jsonRequestObject.add("data", data);
115 jsonRequestObject.add("cmHandleProperties", toJsonObject(cmHandleProperties));
116 return jsonRequestObject.toString();
119 private static JsonArray getModuleReferencesAsJson(final List<ModuleReference> unknownModuleReferences) {
120 final JsonArray moduleReferences = new JsonArray();
122 for (final ModuleReference moduleReference : unknownModuleReferences) {
123 final JsonObject moduleReferenceAsJson = new JsonObject();
124 moduleReferenceAsJson.addProperty("name", moduleReference.getModuleName());
125 moduleReferenceAsJson.addProperty("revision", moduleReference.getRevision());
126 moduleReferences.add(moduleReferenceAsJson);
128 return moduleReferences;
131 private static JsonObject toJsonObject(final List<PersistenceCmHandle.AdditionalProperty> cmHandleProperties) {
132 final JsonObject asJsonObject = new JsonObject();
133 for (final PersistenceCmHandle.AdditionalProperty additionalProperty : cmHandleProperties) {
134 asJsonObject.addProperty(additionalProperty.getName(), additionalProperty.getValue());
139 private List<ModuleReference> toModuleReferences(final Map dmiFetchModulesResponseAsMap) {
140 final List<ModuleReference> moduleReferences = new ArrayList<>();
142 if (dmiFetchModulesResponseAsMap != null) {
143 final List moduleReferencesAsList = (List) dmiFetchModulesResponseAsMap.get("schemas");
144 if (moduleReferencesAsList != null) {
145 moduleReferencesAsList.forEach(moduleReferenceAsMap -> {
146 final ModuleReference moduleReference =
147 objectMapper.convertValue(moduleReferenceAsMap, ModuleReference.class);
148 moduleReferences.add(moduleReference);
152 return moduleReferences;
155 private Map<String, String> asModuleNameToYangResourceMap(final ResponseEntity<Object> responseEntity) {
156 final Map<String, String> yangResourcesModuleNameToContentMap = new HashMap<>();
157 final List<Map<String, String>> yangResourcesAsList = (List) responseEntity.getBody();
159 if (yangResourcesAsList != null) {
160 yangResourcesAsList.forEach(yangResourceAsMap -> {
161 final YangResource yangResource =
162 objectMapper.convertValue(yangResourceAsMap, YangResource.class);
163 yangResourcesModuleNameToContentMap.put(yangResource.getModuleName(),
164 yangResource.getYangSource());
167 return yangResourcesModuleNameToContentMap;