X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=cps-ncmp-rest%2Fsrc%2Fmain%2Fjava%2Forg%2Fonap%2Fcps%2Fncmp%2Frest%2Fcontroller%2FNetworkCmProxyController.java;h=b5c8d14a9cfa446d7e4e764214c685cd9209fc45;hb=697caa85dd35d5996d604935987e43b61b5811c2;hp=b35b245aaba356d9a70fdd5f68806626fcc65553;hpb=c328551bdfd069343cc4c4e0249516d07938c78a;p=cps.git diff --git a/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyController.java b/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyController.java index b35b245aa..b5c8d14a9 100755 --- a/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyController.java +++ b/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyController.java @@ -1,14 +1,16 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2021 Pantheon.tech - * Modifications (C) 2021 Nordix Foundation + * Modifications Copyright (C) 2021-2022 Nordix Foundation * Modification Copyright (C) 2021 highstreet technologies GmbH + * Modifications (C) 2021 Bell Canada * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -21,164 +23,245 @@ package org.onap.cps.ncmp.rest.controller; +import static org.onap.cps.ncmp.api.impl.operations.DmiRequestBody.OperationEnum.CREATE; +import static org.onap.cps.ncmp.api.impl.operations.DmiRequestBody.OperationEnum.DELETE; +import static org.onap.cps.ncmp.api.impl.operations.DmiRequestBody.OperationEnum.PATCH; +import static org.onap.cps.ncmp.api.impl.operations.DmiRequestBody.OperationEnum.UPDATE; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; +import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; import javax.validation.Valid; -import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.modelmapper.ModelMapper; import org.onap.cps.ncmp.api.NetworkCmProxyDataService; -import org.onap.cps.ncmp.api.models.DmiPluginRegistration; +import org.onap.cps.ncmp.api.models.NcmpServiceCmHandle; import org.onap.cps.ncmp.rest.api.NetworkCmProxyApi; -import org.onap.cps.ncmp.rest.model.RestDmiPluginRegistration; -import org.onap.cps.spi.FetchDescendantsOption; -import org.onap.cps.spi.model.DataNode; -import org.onap.cps.utils.DataMapUtils; +import org.onap.cps.ncmp.rest.model.CmHandleProperties; +import org.onap.cps.ncmp.rest.model.CmHandleProperty; +import org.onap.cps.ncmp.rest.model.CmHandlePublicProperties; +import org.onap.cps.ncmp.rest.model.CmHandles; +import org.onap.cps.ncmp.rest.model.ConditionProperties; +import org.onap.cps.ncmp.rest.model.Conditions; +import org.onap.cps.ncmp.rest.model.ModuleNameAsJsonObject; +import org.onap.cps.ncmp.rest.model.ModuleNamesAsJsonArray; +import org.onap.cps.ncmp.rest.model.ModuleReference; +import org.onap.cps.ncmp.rest.model.RestOutputCmHandle; +import org.onap.cps.utils.JsonObjectMapper; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +@Slf4j @RestController @RequestMapping("${rest.api.ncmp-base-path}") +@RequiredArgsConstructor public class NetworkCmProxyController implements NetworkCmProxyApi { - private static final Gson GSON = new GsonBuilder().create(); + private static final String NO_BODY = null; + private final ModelMapper modelMapper; private final NetworkCmProxyDataService networkCmProxyDataService; - - private final ObjectMapper objectMapper; + private final JsonObjectMapper jsonObjectMapper; /** - * Constructor Injection for Dependencies. - * @param networkCmProxyDataService Data Service Interface - * @param objectMapper Object Mapper + * Get resource data from operational datastore. + * + * @param cmHandle cm handle identifier + * @param resourceIdentifier resource identifier + * @param acceptParamInHeader accept header parameter + * @param optionsParamInQuery options query parameter + * @param topicParamInQuery topic query parameter + * @return {@code ResponseEntity} response from dmi plugin */ - public NetworkCmProxyController(final NetworkCmProxyDataService networkCmProxyDataService, - final ObjectMapper objectMapper) { - this.networkCmProxyDataService = networkCmProxyDataService; - this.objectMapper = objectMapper; + @Override + public ResponseEntity getResourceDataOperationalForCmHandle(final String cmHandle, + final @NotNull @Valid String resourceIdentifier, + final String acceptParamInHeader, + final @Valid String optionsParamInQuery, + final @Valid String topicParamInQuery) { + final Object responseObject = networkCmProxyDataService.getResourceDataOperationalForCmHandle(cmHandle, + resourceIdentifier, + acceptParamInHeader, + optionsParamInQuery, + topicParamInQuery); + return ResponseEntity.ok(responseObject); } /** - * Create Node. - * @deprecated This Method is no longer used as part of NCMP. + * Get resource data from pass-through running datastore. + * + * @param cmHandle cm handle identifier + * @param resourceIdentifier resource identifier + * @param acceptParamInHeader accept header parameter + * @param optionsParamInQuery options query parameter + * @param topicParamInQuery topic query parameter + * @return {@code ResponseEntity} response from dmi plugin */ @Override - @Deprecated(forRemoval = false) - public ResponseEntity createNode(final String cmHandle, @Valid final String jsonData, - @Valid final String parentNodeXpath) { - networkCmProxyDataService.createDataNode(cmHandle, parentNodeXpath, jsonData); - return new ResponseEntity<>(HttpStatus.CREATED); + public ResponseEntity getResourceDataRunningForCmHandle(final String cmHandle, + final @NotNull @Valid String resourceIdentifier, + final String acceptParamInHeader, + final @Valid String optionsParamInQuery, + final @Valid String topicParamInQuery) { + final Object responseObject = networkCmProxyDataService.getResourceDataPassThroughRunningForCmHandle(cmHandle, + resourceIdentifier, + acceptParamInHeader, + optionsParamInQuery, + topicParamInQuery); + return ResponseEntity.ok(responseObject); } - /** - * Add List-node Child Element. - * @deprecated This Method is no longer used as part of NCMP. - */ @Override - @Deprecated(forRemoval = false) - public ResponseEntity addListNodeElements(@NotNull @Valid final String parentNodeXpath, - final String cmHandle, @Valid final String jsonData) { - networkCmProxyDataService.addListNodeElements(cmHandle, parentNodeXpath, jsonData); - return new ResponseEntity<>(HttpStatus.CREATED); + public ResponseEntity patchResourceDataRunningForCmHandle(final String resourceIdentifier, + final String cmHandle, + final Object requestBody, final String contentType) { + final Object responseObject = networkCmProxyDataService.writeResourceDataPassThroughRunningForCmHandle(cmHandle, + resourceIdentifier, PATCH, jsonObjectMapper.asJsonString(requestBody), contentType); + return ResponseEntity.ok(responseObject); } /** - * Get Node By CM Handle and X-Path. - * @deprecated This Method is no longer used as part of NCMP. + * Create resource data in datastore pass-through running for given cm-handle. + * + * @param resourceIdentifier resource identifier + * @param cmHandle cm handle identifier + * @param requestBody the request body + * @param contentType content type of body + * @return {@code ResponseEntity} response from dmi plugin */ @Override - @Deprecated(forRemoval = false) - public ResponseEntity getNodeByCmHandleAndXpath(final String cmHandle, @Valid final String xpath, - @Valid final Boolean includeDescendants) { - final FetchDescendantsOption fetchDescendantsOption = Boolean.TRUE.equals(includeDescendants) - ? FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS : FetchDescendantsOption.OMIT_DESCENDANTS; - final var dataNode = networkCmProxyDataService.getDataNode(cmHandle, xpath, fetchDescendantsOption); - return new ResponseEntity<>(DataMapUtils.toDataMap(dataNode), HttpStatus.OK); + public ResponseEntity createResourceDataRunningForCmHandle(final String resourceIdentifier, + final String cmHandle, final Object requestBody, final String contentType) { + networkCmProxyDataService.writeResourceDataPassThroughRunningForCmHandle(cmHandle, + resourceIdentifier, CREATE, jsonObjectMapper.asJsonString(requestBody), contentType); + return new ResponseEntity<>(HttpStatus.CREATED); } /** - * Update DMI Plugin Registration (used for first registration also). - * @param restDmiPluginRegistration the registration data + * Update resource data in datastore pass-through running for given cm-handle. + * + * @param resourceIdentifier resource identifier + * @param cmHandle cm handle identifier + * @param requestBody the request body + * @param contentType content type of the body + * @return response entity */ @Override - public ResponseEntity updateDmiPluginRegistration( - final @Valid RestDmiPluginRegistration restDmiPluginRegistration) { - final DmiPluginRegistration dmiPluginRegistration = - convertRestObjectToJavaApiObject(restDmiPluginRegistration); - networkCmProxyDataService.updateDmiPluginRegistration(dmiPluginRegistration); - return new ResponseEntity<>(HttpStatus.CREATED); + public ResponseEntity updateResourceDataRunningForCmHandle(final String resourceIdentifier, + final String cmHandle, + final Object requestBody, + final String contentType) { + networkCmProxyDataService.writeResourceDataPassThroughRunningForCmHandle(cmHandle, + resourceIdentifier, UPDATE, jsonObjectMapper.asJsonString(requestBody), contentType); + return new ResponseEntity<>(HttpStatus.OK); } + /** - * Query Data Nodes. - * @deprecated This Method is no longer used as part of NCMP. + * Delete resource data in datastore pass-through running for a given cm-handle. + * + * @param resourceIdentifier resource identifier + * @param cmHandle cm handle identifier + * @param contentType content type of the body + * @return response entity no content if request is successful */ @Override - @Deprecated(forRemoval = false) - public ResponseEntity queryNodesByCmHandleAndCpsPath(final String cmHandle, @Valid final String cpsPath, - @Valid final Boolean includeDescendants) { - final FetchDescendantsOption fetchDescendantsOption = Boolean.TRUE.equals(includeDescendants) - ? FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS : FetchDescendantsOption.OMIT_DESCENDANTS; - final Collection dataNodes = - networkCmProxyDataService.queryDataNodes(cmHandle, cpsPath, fetchDescendantsOption); - return new ResponseEntity<>(GSON.toJson(dataNodes), HttpStatus.OK); + public ResponseEntity deleteResourceDataRunningForCmHandle(final String cmHandle, + final String resourceIdentifier, + final String contentType) { + networkCmProxyDataService.writeResourceDataPassThroughRunningForCmHandle(cmHandle, + resourceIdentifier, DELETE, NO_BODY, contentType); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); } /** - * Replace Node With Descendants. - * @deprecated This Method is no longer used as part of NCMP. + * Execute cm handle search. + * + * @param conditions the conditions + * @return cm handles returned from search. */ @Override - @Deprecated(forRemoval = false) - public ResponseEntity replaceNode(final String cmHandle, @Valid final String jsonData, - @Valid final String parentNodeXpath) { - networkCmProxyDataService.replaceNodeTree(cmHandle, parentNodeXpath, jsonData); - return new ResponseEntity<>(HttpStatus.OK); + public ResponseEntity executeCmHandleSearch(final Conditions conditions) { + final List conditionProperties = + conditions.getConditions().stream().collect(Collectors.toList()); + final CmHandles cmHandles = new CmHandles(); + cmHandles.setCmHandles(toCmHandleProperties(processConditions(conditionProperties))); + return ResponseEntity.ok(cmHandles); } /** - * Update Node Leaves. - * @deprecated This Method is no longer used as part of NCMP. + * Search for Cm Handle and Properties by Name. + * @param cmHandleId cm-handle identifier + * @return cm handle and its properties */ @Override - @Deprecated(forRemoval = false) - public ResponseEntity updateNodeLeaves(final String cmHandle, @Valid final String jsonData, - @Valid final String parentNodeXpath) { - networkCmProxyDataService.updateNodeLeaves(cmHandle, parentNodeXpath, jsonData); - return new ResponseEntity<>(HttpStatus.OK); + public ResponseEntity retrieveCmHandleDetailsById(final String cmHandleId) { + final NcmpServiceCmHandle ncmpServiceCmHandle = networkCmProxyDataService.getNcmpServiceCmHandle(cmHandleId); + final RestOutputCmHandle restOutputCmHandle = toRestOutputCmHandle(ncmpServiceCmHandle); + return ResponseEntity.ok(restOutputCmHandle); } /** - * Get resource data for for operational datastore. + * Return module references for a cm handle. * - * @param cmHandle cm handle identifier - * @param resourceIdentifier resource identifier - * @param accept accept header parameter - * @param fields fields query parameter - * @param depth depth query parameter - * @return {@code ResponseEntity} response from dmi plugin + * @param cmHandle the cm handle + * @return module references for cm handle. Namespace will be always blank because restConf does not include this. */ - @Override - public ResponseEntity getResourceDataOperationalForCmHandle(final String cmHandle, - final String resourceIdentifier, - final String accept, - final @Valid String fields, - final @Min(1) @Valid Integer depth) { - final var responseObject = networkCmProxyDataService.getResourceDataOperationalFoCmHandle(cmHandle, - resourceIdentifier, - accept, - fields, - depth); - return ResponseEntity.ok(responseObject); + public ResponseEntity> getModuleReferencesByCmHandle(final String cmHandle) { + final List moduleReferences = + networkCmProxyDataService.getYangResourcesModuleReferences(cmHandle).stream() + .map(moduleReference -> modelMapper.map(moduleReference, ModuleReference.class)) + .collect(Collectors.toList()); + return new ResponseEntity<>(moduleReferences, HttpStatus.OK); } - private DmiPluginRegistration convertRestObjectToJavaApiObject( - final RestDmiPluginRegistration restDmiPluginRegistration) { - return objectMapper.convertValue(restDmiPluginRegistration, DmiPluginRegistration.class); + private Collection processConditions(final List conditionProperties) { + for (final ConditionProperties conditionProperty : conditionProperties) { + if (conditionProperty.getName().equals("hasAllModules")) { + return executeCmHandleSearchesForModuleNames(conditionProperty); + } else { + log.warn("Unrecognized condition name {}.", conditionProperty.getName()); + } + } + log.warn("No valid conditions found {}.", conditionProperties); + return Collections.emptyList(); } + private Collection executeCmHandleSearchesForModuleNames(final ConditionProperties conditionProperties) { + return networkCmProxyDataService + .executeCmHandleHasAllModulesSearch(getModuleNames(conditionProperties.getConditionParameters())); + } + + private Collection getModuleNames(final ModuleNamesAsJsonArray moduleNamesAsJsonArray) { + final Collection moduleNames = new ArrayList<>(moduleNamesAsJsonArray.size()); + for (final ModuleNameAsJsonObject moduleNameAsJsonObject : moduleNamesAsJsonArray) { + moduleNames.add(moduleNameAsJsonObject.getModuleName()); + } + return moduleNames; + } + + private CmHandleProperties toCmHandleProperties(final Collection cmHandleIdentifiers) { + final CmHandleProperties cmHandleProperties = new CmHandleProperties(); + for (final String cmHandleIdentifier : cmHandleIdentifiers) { + final CmHandleProperty cmHandleProperty = new CmHandleProperty(); + cmHandleProperty.setCmHandleId(cmHandleIdentifier); + cmHandleProperties.add(cmHandleProperty); + } + return cmHandleProperties; + } + + private RestOutputCmHandle toRestOutputCmHandle(final NcmpServiceCmHandle ncmpServiceCmHandle) { + final RestOutputCmHandle restOutputCmHandle = new RestOutputCmHandle(); + final CmHandlePublicProperties cmHandlePublicProperties = new CmHandlePublicProperties(); + restOutputCmHandle.setCmHandle(ncmpServiceCmHandle.getCmHandleID()); + cmHandlePublicProperties.add(ncmpServiceCmHandle.getPublicProperties()); + restOutputCmHandle.setPublicCmHandleProperties(cmHandlePublicProperties); + return restOutputCmHandle; + } }