c582584667fb85fe7adc76d81041177ca3f09454
[cps.git] / cps-ncmp-service / src / main / java / org / onap / cps / ncmp / api / impl / operations / DmiModelOperations.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.operations;
22
23 import static org.onap.cps.ncmp.api.impl.operations.RequiredDmiService.MODEL;
24
25 import com.fasterxml.jackson.databind.ObjectMapper;
26 import com.google.gson.JsonArray;
27 import com.google.gson.JsonObject;
28 import java.util.List;
29 import org.onap.cps.ncmp.api.impl.client.DmiRestClient;
30 import org.onap.cps.ncmp.api.impl.config.NcmpConfiguration;
31 import org.onap.cps.ncmp.api.models.PersistenceCmHandle;
32 import org.onap.cps.spi.model.ModuleReference;
33 import org.springframework.http.HttpHeaders;
34 import org.springframework.http.ResponseEntity;
35 import org.springframework.stereotype.Component;
36
37 @Component
38 public class DmiModelOperations extends DmiOperations {
39
40     /**
41      * Constructor for {@code DmiOperations}. This method also manipulates url properties.
42      *
43      * @param dmiRestClient {@code DmiRestClient}
44      */
45     public DmiModelOperations(final PersistenceCmHandleRetriever cmHandlePropertiesRetriever,
46                               final ObjectMapper objectMapper,
47                               final NcmpConfiguration.DmiProperties dmiProperties,
48                               final DmiRestClient dmiRestClient) {
49         super(cmHandlePropertiesRetriever, objectMapper, dmiProperties, dmiRestClient);
50     }
51
52     /**
53      * Retrieves module references.
54      *
55      * @param persistenceCmHandle the persistence cm handle
56      * @return module references
57      */
58     public ResponseEntity<String> getModuleReferences(final PersistenceCmHandle persistenceCmHandle) {
59         final DmiRequestBody dmiRequestBody = DmiRequestBody.builder()
60             .build();
61         dmiRequestBody.asCmHandleProperties(persistenceCmHandle.getAdditionalProperties());
62         return getResourceFromDmiWithJsonData(persistenceCmHandle.resolveDmiServiceName(MODEL),
63             getDmiRequestBodyAsString(dmiRequestBody), persistenceCmHandle.getId(), "modules");
64     }
65
66     /**
67      * Retrieve yang resources from dmi for any modules that CPS-NCMP hasn't cached before.
68      *
69      * @param persistenceCmHandle the persistenceCmHandle
70      * @param unknownModuleReferences the unknown module references
71      * @return yang resources
72      */
73     public ResponseEntity<String>  getNewYangResourcesFromDmi(final PersistenceCmHandle persistenceCmHandle,
74                                                               final List<ModuleReference> unknownModuleReferences) {
75         final String jsonDataWithDataAndCmHandleProperties = getRequestBodyToFetchYangResources(
76             unknownModuleReferences, persistenceCmHandle.getAdditionalProperties());
77         return getResourceFromDmiWithJsonData(
78             persistenceCmHandle.resolveDmiServiceName(MODEL),
79             jsonDataWithDataAndCmHandleProperties,
80             persistenceCmHandle.getId(),
81             "moduleResources");
82     }
83
84     /**
85      * Get resources from DMI for modules.
86      *
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
92      */
93     private 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());
99     }
100
101     private static String getRequestBodyToFetchYangResources(final List<ModuleReference> unknownModuleReferences,
102         final List<PersistenceCmHandle.AdditionalProperty> cmHandleProperties) {
103         final JsonArray moduleReferencesAsJson = getModuleReferencesAsJson(unknownModuleReferences);
104         final JsonObject data = new JsonObject();
105         data.add("modules", moduleReferencesAsJson);
106         final JsonObject jsonRequestObject = new JsonObject();
107         jsonRequestObject.add("data", data);
108         jsonRequestObject.add("cmHandleProperties", toJsonObject(cmHandleProperties));
109         return jsonRequestObject.toString();
110     }
111
112     private static JsonArray getModuleReferencesAsJson(final List<ModuleReference> unknownModuleReferences) {
113         final JsonArray moduleReferences = new JsonArray();
114
115         for (final ModuleReference moduleReference : unknownModuleReferences) {
116             final JsonObject moduleReferenceAsJson = new JsonObject();
117             moduleReferenceAsJson.addProperty("name", moduleReference.getModuleName());
118             moduleReferenceAsJson.addProperty("revision", moduleReference.getRevision());
119             moduleReferences.add(moduleReferenceAsJson);
120         }
121         return moduleReferences;
122     }
123
124     private static JsonObject toJsonObject(final List<PersistenceCmHandle.AdditionalProperty> cmHandleProperties) {
125         //TODO Toine/Joe Double check format with existing test data
126         final JsonObject asJsonObject = new JsonObject();
127         for (final PersistenceCmHandle.AdditionalProperty additionalProperty : cmHandleProperties) {
128             asJsonObject.addProperty(additionalProperty.getName(), additionalProperty.getValue());
129         }
130         return asJsonObject;
131     }
132
133 }