Code Refactoring Ncmp* to Lcm* as per new scope
[cps.git] / cps-ncmp-service / src / main / java / org / onap / cps / ncmp / api / impl / NetworkCmProxyDataServiceImpl.java
1 /*
2  *  ============LICENSE_START=======================================================
3  *  Copyright (C) 2021 highstreet technologies GmbH
4  *  Modifications Copyright (C) 2021-2022 Nordix Foundation
5  *  Modifications Copyright (C) 2021 Pantheon.tech
6  *  Modifications Copyright (C) 2021-2022 Bell Canada
7  *  ================================================================================
8  *  Licensed under the Apache License, Version 2.0 (the "License");
9  *  you may not use this file except in compliance with the License.
10  *  You may obtain a copy of the License at
11  *
12  *        http://www.apache.org/licenses/LICENSE-2.0
13  *
14  *  Unless required by applicable law or agreed to in writing, software
15  *  distributed under the License is distributed on an "AS IS" BASIS,
16  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  *  See the License for the specific language governing permissions and
18  *  limitations under the License.
19  *
20  *  SPDX-License-Identifier: Apache-2.0
21  *  ============LICENSE_END=========================================================
22  */
23
24 package org.onap.cps.ncmp.api.impl;
25
26 import static org.onap.cps.ncmp.api.impl.operations.DmiRequestBody.OperationEnum;
27 import static org.onap.cps.utils.CmHandleQueryRestParametersValidator.validateCmHandleQueryParameters;
28
29 import java.util.ArrayList;
30 import java.util.Collection;
31 import java.util.HashMap;
32 import java.util.List;
33 import java.util.Map;
34 import java.util.Set;
35 import java.util.stream.Collectors;
36 import lombok.RequiredArgsConstructor;
37 import lombok.extern.slf4j.Slf4j;
38 import org.onap.cps.ncmp.api.NetworkCmProxyCmHandlerQueryService;
39 import org.onap.cps.ncmp.api.NetworkCmProxyDataService;
40 import org.onap.cps.ncmp.api.impl.operations.DmiDataOperations;
41 import org.onap.cps.ncmp.api.impl.operations.DmiOperations;
42 import org.onap.cps.ncmp.api.impl.utils.YangDataConverter;
43 import org.onap.cps.ncmp.api.impl.yangmodels.YangModelCmHandle;
44 import org.onap.cps.ncmp.api.inventory.CmHandleState;
45 import org.onap.cps.ncmp.api.inventory.CompositeState;
46 import org.onap.cps.ncmp.api.inventory.InventoryPersistence;
47 import org.onap.cps.ncmp.api.models.CmHandleQueryApiParameters;
48 import org.onap.cps.ncmp.api.models.CmHandleRegistrationResponse;
49 import org.onap.cps.ncmp.api.models.CmHandleRegistrationResponse.RegistrationError;
50 import org.onap.cps.ncmp.api.models.DmiPluginRegistration;
51 import org.onap.cps.ncmp.api.models.DmiPluginRegistrationResponse;
52 import org.onap.cps.ncmp.api.models.NcmpServiceCmHandle;
53 import org.onap.cps.spi.exceptions.AlreadyDefinedException;
54 import org.onap.cps.spi.exceptions.DataNodeNotFoundException;
55 import org.onap.cps.spi.exceptions.DataValidationException;
56 import org.onap.cps.spi.model.CmHandleQueryServiceParameters;
57 import org.onap.cps.spi.model.ModuleDefinition;
58 import org.onap.cps.spi.model.ModuleReference;
59 import org.onap.cps.utils.CpsValidator;
60 import org.onap.cps.utils.JsonObjectMapper;
61 import org.springframework.http.ResponseEntity;
62 import org.springframework.stereotype.Service;
63
64 @Slf4j
65 @Service
66 @RequiredArgsConstructor
67 public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService {
68
69     private final JsonObjectMapper jsonObjectMapper;
70
71     private final DmiDataOperations dmiDataOperations;
72
73     private final NetworkCmProxyDataServicePropertyHandler networkCmProxyDataServicePropertyHandler;
74
75     private final InventoryPersistence inventoryPersistence;
76
77     private final NetworkCmProxyCmHandlerQueryService networkCmProxyCmHandlerQueryService;
78
79     @Override
80     public DmiPluginRegistrationResponse updateDmiRegistrationAndSyncModule(
81             final DmiPluginRegistration dmiPluginRegistration) {
82         dmiPluginRegistration.validateDmiPluginRegistration();
83         final DmiPluginRegistrationResponse dmiPluginRegistrationResponse = new DmiPluginRegistrationResponse();
84         dmiPluginRegistrationResponse.setRemovedCmHandles(
85                 parseAndRemoveCmHandlesInDmiRegistration(dmiPluginRegistration.getRemovedCmHandles()));
86         if (!dmiPluginRegistration.getCreatedCmHandles().isEmpty()) {
87             dmiPluginRegistrationResponse.setCreatedCmHandles(
88                     parseAndCreateCmHandlesInDmiRegistrationAndSyncModules(dmiPluginRegistration));
89         }
90         if (!dmiPluginRegistration.getUpdatedCmHandles().isEmpty()) {
91             dmiPluginRegistrationResponse.setUpdatedCmHandles(
92                     networkCmProxyDataServicePropertyHandler
93                             .updateCmHandleProperties(dmiPluginRegistration.getUpdatedCmHandles()));
94         }
95         return dmiPluginRegistrationResponse;
96     }
97
98     @Override
99     public Object getResourceDataOperationalForCmHandle(final String cmHandleId,
100                                                         final String resourceIdentifier,
101                                                         final String optionsParamInQuery,
102                                                         final String topicParamInQuery,
103                                                         final String requestId) {
104         final ResponseEntity<?> responseEntity = dmiDataOperations.getResourceDataFromDmi(cmHandleId,
105             resourceIdentifier,
106             optionsParamInQuery,
107             DmiOperations.DataStoreEnum.PASSTHROUGH_OPERATIONAL,
108             requestId, topicParamInQuery);
109         return responseEntity.getBody();
110     }
111
112     @Override
113     public Object getResourceDataPassThroughRunningForCmHandle(final String cmHandleId,
114                                                                final String resourceIdentifier,
115                                                                final String optionsParamInQuery,
116                                                                final String topicParamInQuery,
117                                                                final String requestId) {
118         final ResponseEntity<?> responseEntity = dmiDataOperations.getResourceDataFromDmi(cmHandleId,
119             resourceIdentifier,
120             optionsParamInQuery,
121             DmiOperations.DataStoreEnum.PASSTHROUGH_RUNNING,
122             requestId, topicParamInQuery);
123         return responseEntity.getBody();
124     }
125
126     @Override
127     public Object writeResourceDataPassThroughRunningForCmHandle(final String cmHandleId,
128                                                                  final String resourceIdentifier,
129                                                                  final OperationEnum operation,
130                                                                  final String requestData,
131                                                                  final String dataType) {
132         CpsValidator.validateNameCharacters(cmHandleId);
133         return dmiDataOperations.writeResourceDataPassThroughRunningFromDmi(cmHandleId, resourceIdentifier, operation,
134             requestData, dataType);
135     }
136
137     @Override
138     public Collection<ModuleReference> getYangResourcesModuleReferences(final String cmHandleId) {
139         CpsValidator.validateNameCharacters(cmHandleId);
140         return inventoryPersistence.getYangResourcesModuleReferences(cmHandleId);
141     }
142
143     @Override
144     public Collection<ModuleDefinition> getModuleDefinitionsByCmHandleId(final String cmHandleId) {
145         CpsValidator.validateNameCharacters(cmHandleId);
146         return inventoryPersistence.getModuleDefinitionsByCmHandleId(cmHandleId);
147     }
148
149     /**
150      * Retrieve cm handles with details for the given query parameters.
151      *
152      * @param cmHandleQueryApiParameters cm handle query parameters
153      * @return cm handles with details
154      */
155     @Override
156     public Set<NcmpServiceCmHandle> executeCmHandleSearch(final CmHandleQueryApiParameters cmHandleQueryApiParameters) {
157         final CmHandleQueryServiceParameters cmHandleQueryServiceParameters = jsonObjectMapper.convertToValueType(
158                 cmHandleQueryApiParameters, CmHandleQueryServiceParameters.class);
159
160         validateCmHandleQueryParameters(cmHandleQueryServiceParameters);
161
162         return networkCmProxyCmHandlerQueryService.queryCmHandles(cmHandleQueryServiceParameters);
163     }
164
165     /**
166      * Retrieve cm handle ids for the given query parameters.
167      *
168      * @param cmHandleQueryApiParameters cm handle query parameters
169      * @return cm handle ids
170      */
171     @Override
172     public Set<String> executeCmHandleIdSearch(final CmHandleQueryApiParameters cmHandleQueryApiParameters) {
173         final CmHandleQueryServiceParameters cmHandleQueryServiceParameters = jsonObjectMapper.convertToValueType(
174                 cmHandleQueryApiParameters, CmHandleQueryServiceParameters.class);
175
176         validateCmHandleQueryParameters(cmHandleQueryServiceParameters);
177
178         return networkCmProxyCmHandlerQueryService.queryCmHandleIds(cmHandleQueryServiceParameters);
179     }
180
181     /**
182      * Retrieve cm handle details for a given cm handle.
183      *
184      * @param cmHandleId cm handle identifier
185      * @return cm handle details
186      */
187     @Override
188     public NcmpServiceCmHandle getNcmpServiceCmHandle(final String cmHandleId) {
189         CpsValidator.validateNameCharacters(cmHandleId);
190         return YangDataConverter.convertYangModelCmHandleToNcmpServiceCmHandle(
191                 inventoryPersistence.getYangModelCmHandle(cmHandleId));
192     }
193
194     /**
195      * Get cm handle public properties for a given cm handle id.
196      *
197      * @param cmHandleId cm handle identifier
198      * @return cm handle public properties
199      */
200     @Override
201     public Map<String, String> getCmHandlePublicProperties(final String cmHandleId) {
202         CpsValidator.validateNameCharacters(cmHandleId);
203         final YangModelCmHandle yangModelCmHandle =
204             inventoryPersistence.getYangModelCmHandle(cmHandleId);
205         final List<YangModelCmHandle.Property> yangModelPublicProperties = yangModelCmHandle.getPublicProperties();
206         final Map<String, String> cmHandlePublicProperties = new HashMap<>();
207         YangDataConverter.asPropertiesMap(yangModelPublicProperties, cmHandlePublicProperties);
208         return cmHandlePublicProperties;
209     }
210
211     /**
212      * Get cm handle composite state for a given cm handle id.
213      *
214      * @param cmHandleId cm handle identifier
215      * @return cm handle state
216      */
217     @Override
218     public CompositeState getCmHandleCompositeState(final String cmHandleId) {
219         CpsValidator.validateNameCharacters(cmHandleId);
220         return inventoryPersistence.getYangModelCmHandle(cmHandleId).getCompositeState();
221     }
222
223     /**
224      * THis method registers a cm handle and initiates modules sync.
225      *
226      * @param dmiPluginRegistration dmi plugin registration information.
227      * @return cm-handle registration response for create cm-handle requests.
228      */
229     public List<CmHandleRegistrationResponse> parseAndCreateCmHandlesInDmiRegistrationAndSyncModules(
230             final DmiPluginRegistration dmiPluginRegistration) {
231         List<CmHandleRegistrationResponse> cmHandleRegistrationResponses = new ArrayList<>();
232         try {
233             cmHandleRegistrationResponses = dmiPluginRegistration.getCreatedCmHandles().stream()
234                 .map(cmHandle -> {
235                     setCompositeStateToAdvised(cmHandle);
236                     return YangModelCmHandle.toYangModelCmHandle(
237                         dmiPluginRegistration.getDmiPlugin(),
238                         dmiPluginRegistration.getDmiDataPlugin(),
239                         dmiPluginRegistration.getDmiModelPlugin(),
240                         cmHandle);
241                     }
242                 )
243                 .map(this::registerNewCmHandle)
244                 .collect(Collectors.toList());
245         } catch (final DataValidationException dataValidationException) {
246             cmHandleRegistrationResponses.add(CmHandleRegistrationResponse.createFailureResponse(dmiPluginRegistration
247                             .getCreatedCmHandles().stream()
248                             .map(NcmpServiceCmHandle::getCmHandleId).findFirst().orElse(null),
249                     RegistrationError.CM_HANDLE_INVALID_ID));
250         }
251         return cmHandleRegistrationResponses;
252     }
253
254     private void setCompositeStateToAdvised(final NcmpServiceCmHandle ncmpServiceCmHandle) {
255         final CompositeState compositeState = new CompositeState();
256         compositeState.setCmHandleState(CmHandleState.ADVISED);
257         compositeState.setLastUpdateTimeNow();
258         ncmpServiceCmHandle.setCompositeState(compositeState);
259     }
260
261     protected List<CmHandleRegistrationResponse> parseAndRemoveCmHandlesInDmiRegistration(
262             final List<String> tobeRemovedCmHandles) {
263         final List<CmHandleRegistrationResponse> cmHandleRegistrationResponses =
264                 new ArrayList<>(tobeRemovedCmHandles.size());
265         for (final String cmHandle : tobeRemovedCmHandles) {
266             try {
267                 CpsValidator.validateNameCharacters(cmHandle);
268                 inventoryPersistence.deleteSchemaSetWithCascade(cmHandle);
269                 inventoryPersistence.deleteListOrListElement("/dmi-registry/cm-handles[@id='" + cmHandle + "']");
270                 cmHandleRegistrationResponses.add(CmHandleRegistrationResponse.createSuccessResponse(cmHandle));
271             } catch (final DataNodeNotFoundException dataNodeNotFoundException) {
272                 log.error("Unable to find dataNode for cmHandleId : {} , caused by : {}",
273                         cmHandle, dataNodeNotFoundException.getMessage());
274                 cmHandleRegistrationResponses.add(CmHandleRegistrationResponse
275                         .createFailureResponse(cmHandle, RegistrationError.CM_HANDLE_DOES_NOT_EXIST));
276             } catch (final DataValidationException dataValidationException) {
277                 log.error("Unable to de-register cm-handle id: {}, caused by: {}",
278                         cmHandle, dataValidationException.getMessage());
279                 cmHandleRegistrationResponses.add(CmHandleRegistrationResponse
280                         .createFailureResponse(cmHandle, RegistrationError.CM_HANDLE_INVALID_ID));
281             } catch (final Exception exception) {
282                 log.error("Unable to de-register cm-handle id : {} , caused by : {}",
283                         cmHandle, exception.getMessage());
284                 cmHandleRegistrationResponses.add(
285                         CmHandleRegistrationResponse.createFailureResponse(cmHandle, exception));
286             }
287         }
288         return cmHandleRegistrationResponses;
289     }
290
291     private CmHandleRegistrationResponse registerNewCmHandle(final YangModelCmHandle yangModelCmHandle) {
292         try {
293             inventoryPersistence.saveCmHandle(yangModelCmHandle);
294             return CmHandleRegistrationResponse.createSuccessResponse(yangModelCmHandle.getId());
295         } catch (final AlreadyDefinedException alreadyDefinedException) {
296             return CmHandleRegistrationResponse.createFailureResponse(
297                     yangModelCmHandle.getId(), RegistrationError.CM_HANDLE_ALREADY_EXIST);
298         } catch (final Exception exception) {
299             return CmHandleRegistrationResponse.createFailureResponse(yangModelCmHandle.getId(), exception);
300         }
301     }
302 }