summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/onap/cps/ncmp/dmi
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/onap/cps/ncmp/dmi')
-rw-r--r--src/main/java/org/onap/cps/ncmp/dmi/exception/SdncException.java (renamed from src/main/java/org/onap/cps/ncmp/dmi/service/model/ModuleSchemaList.java)35
-rw-r--r--src/main/java/org/onap/cps/ncmp/dmi/service/DmiServiceImpl.java116
-rw-r--r--src/main/java/org/onap/cps/ncmp/dmi/service/model/ModuleSchema.java (renamed from src/main/java/org/onap/cps/ncmp/dmi/service/model/ModuleSchemaProperties.java)12
-rw-r--r--src/main/java/org/onap/cps/ncmp/dmi/service/model/ModuleSchemas.java36
-rw-r--r--src/main/java/org/onap/cps/ncmp/dmi/service/operation/SdncOperations.java53
5 files changed, 120 insertions, 132 deletions
diff --git a/src/main/java/org/onap/cps/ncmp/dmi/service/model/ModuleSchemaList.java b/src/main/java/org/onap/cps/ncmp/dmi/exception/SdncException.java
index a4af1761..a83485a9 100644
--- a/src/main/java/org/onap/cps/ncmp/dmi/service/model/ModuleSchemaList.java
+++ b/src/main/java/org/onap/cps/ncmp/dmi/exception/SdncException.java
@@ -1,6 +1,6 @@
/*
* ============LICENSE_START=======================================================
- * Copyright (C) 2021 Nordix Foundation
+ * Copyright (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.
@@ -18,19 +18,32 @@
* ============LICENSE_END=========================================================
*/
-package org.onap.cps.ncmp.dmi.service.model;
+package org.onap.cps.ncmp.dmi.exception;
-import java.util.List;
-import lombok.Getter;
-import lombok.Setter;
+import org.springframework.http.HttpStatus;
-/**
- * ModuleSchemaList.
+/*
+Use this exception when SDNC contract fails
*/
-@Getter
-@Setter
-public class ModuleSchemaList {
+public class SdncException extends DmiException {
+
+ private static final long serialVersionUID = -2076096996672060566L;
+
+ /**
+ * Constructor.
+ *
+ * @param message message
+ * @param httpStatus httpStatus
+ * @param responseBody responseBody
+ */
+ public SdncException(final String message, final HttpStatus httpStatus, final String responseBody) {
+ super(message, String.format("sdnc http status: %s, response body : %s ",
+ httpStatus.toString(),
+ responseBody));
+ }
- private List<ModuleSchemaProperties> schema;
+ public SdncException(final String message, final String details, final Throwable cause) {
+ super(message, details, cause);
+ }
}
diff --git a/src/main/java/org/onap/cps/ncmp/dmi/service/DmiServiceImpl.java b/src/main/java/org/onap/cps/ncmp/dmi/service/DmiServiceImpl.java
index b66e5c1b..10ae1cf8 100644
--- a/src/main/java/org/onap/cps/ncmp/dmi/service/DmiServiceImpl.java
+++ b/src/main/java/org/onap/cps/ncmp/dmi/service/DmiServiceImpl.java
@@ -1,6 +1,7 @@
/*
* ============LICENSE_START=======================================================
* Copyright (C) 2021 Nordix Foundation
+ * Modifications Copyright (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.
@@ -25,12 +26,12 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.validation.constraints.NotNull;
import lombok.extern.slf4j.Slf4j;
-import org.apache.groovy.parser.antlr4.util.StringUtils;
import org.onap.cps.ncmp.dmi.config.DmiPluginConfig.DmiPluginProperties;
import org.onap.cps.ncmp.dmi.exception.CmHandleRegistrationException;
import org.onap.cps.ncmp.dmi.exception.DmiException;
@@ -45,8 +46,7 @@ import org.onap.cps.ncmp.dmi.service.client.NcmpRestClient;
import org.onap.cps.ncmp.dmi.service.model.CmHandleOperation;
import org.onap.cps.ncmp.dmi.service.model.CreatedCmHandle;
import org.onap.cps.ncmp.dmi.service.model.ModuleReference;
-import org.onap.cps.ncmp.dmi.service.model.ModuleSchemaProperties;
-import org.onap.cps.ncmp.dmi.service.model.ModuleSchemas;
+import org.onap.cps.ncmp.dmi.service.model.ModuleSchema;
import org.onap.cps.ncmp.dmi.service.operation.SdncOperations;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
@@ -75,8 +75,8 @@ public class DmiServiceImpl implements DmiService {
* @param objectMapper objectMapper
*/
public DmiServiceImpl(final DmiPluginProperties dmiPluginProperties,
- final NcmpRestClient ncmpRestClient,
- final SdncOperations sdncOperations, final ObjectMapper objectMapper) {
+ final NcmpRestClient ncmpRestClient,
+ final SdncOperations sdncOperations, final ObjectMapper objectMapper) {
this.dmiPluginProperties = dmiPluginProperties;
this.ncmpRestClient = ncmpRestClient;
this.objectMapper = objectMapper;
@@ -85,16 +85,14 @@ public class DmiServiceImpl implements DmiService {
@Override
public ModuleSet getModulesForCmHandle(final String cmHandle) throws DmiException {
- final ResponseEntity<String> responseEntity = sdncOperations.getModulesFromNode(cmHandle);
- if (responseEntity.getStatusCode() == HttpStatus.OK) {
- final String responseBody = responseEntity.getBody();
- if (StringUtils.isEmpty(responseBody)) {
- throw new ModulesNotFoundException(cmHandle, "SDNC returned no modules for given cm-handle.");
- }
- return createModuleSchema(responseBody);
+ final Collection<ModuleSchema> moduleSchemas = sdncOperations.getModuleSchemasFromNode(cmHandle);
+ if (moduleSchemas.isEmpty()) {
+ throw new ModulesNotFoundException(cmHandle, "SDNC returned no modules for given cm-handle.");
} else {
- throw new DmiException("SDNC is not able to process request.",
- RESPONSE_CODE + responseEntity.getStatusCode() + MESSAGE + responseEntity.getBody());
+ final ModuleSet moduleSet = new ModuleSet();
+ moduleSchemas.forEach(moduleSchema ->
+ moduleSet.addSchemasItem(toModuleSetSchemas(moduleSchema)));
+ return moduleSet;
}
}
@@ -109,11 +107,11 @@ public class DmiServiceImpl implements DmiService {
} else if (responseEntity.getStatusCode() == HttpStatus.NOT_FOUND) {
log.error("SDNC did not return a module resource for the given cmHandle {}", cmHandle);
throw new ModuleResourceNotFoundException(cmHandle,
- "SDNC did not return a module resource for the given cmHandle.");
+ "SDNC did not return a module resource for the given cmHandle.");
} else {
log.error("Error occurred when getting module resources from SDNC for the given cmHandle {}", cmHandle);
throw new DmiException(cmHandle,
- RESPONSE_CODE + responseEntity.getStatusCode() + MESSAGE + responseEntity.getBody());
+ RESPONSE_CODE + responseEntity.getStatusCode() + MESSAGE + responseEntity.getBody());
}
}
return yangResources;
@@ -136,7 +134,7 @@ public class DmiServiceImpl implements DmiService {
} catch (final JsonProcessingException e) {
log.error("Parsing error occurred while converting cm-handles to JSON {}", cmHandles);
throw new DmiException("Internal Server Error.",
- "Parsing error occurred while converting given cm-handles object list to JSON ");
+ "Parsing error occurred while converting given cm-handles object list to JSON ");
}
final ResponseEntity<String> responseEntity = ncmpRestClient.registerCmHandlesWithNcmp(cmHandlesJson);
if ((responseEntity.getStatusCode() != HttpStatus.CREATED)) {
@@ -144,76 +142,54 @@ public class DmiServiceImpl implements DmiService {
}
}
- private ModuleSet createModuleSchema(final String responseBody) {
- final var moduleSchemas = convertModulesToNodeSchema(responseBody);
- final List<ModuleSetSchemas> moduleSetSchemas = new ArrayList<>();
- for (final ModuleSchemaProperties schemaProperties : moduleSchemas.getSchemas().getSchema()) {
- moduleSetSchemas.add(convertModulesToModuleSchemas(schemaProperties));
- }
- final var moduleSet = new ModuleSet();
- moduleSet.setSchemas(moduleSetSchemas);
- return moduleSet;
- }
-
- private ModuleSetSchemas convertModulesToModuleSchemas(final ModuleSchemaProperties moduleSchemaProperties) {
+ private ModuleSetSchemas toModuleSetSchemas(final ModuleSchema moduleSchema) {
final var moduleSetSchemas = new ModuleSetSchemas();
- moduleSetSchemas.setModuleName(moduleSchemaProperties.getIdentifier());
- moduleSetSchemas.setNamespace(moduleSchemaProperties.getNamespace());
- moduleSetSchemas.setRevision(moduleSchemaProperties.getVersion());
+ moduleSetSchemas.setModuleName(moduleSchema.getIdentifier());
+ moduleSetSchemas.setNamespace(moduleSchema.getNamespace());
+ moduleSetSchemas.setRevision(moduleSchema.getVersion());
return moduleSetSchemas;
}
- private ModuleSchemas convertModulesToNodeSchema(final String modulesListAsJson) {
- try {
- return objectMapper.readValue(modulesListAsJson, ModuleSchemas.class);
- } catch (final JsonProcessingException e) {
- log.error("JSON exception occurred when converting the following modules to node schema "
- + "{}", modulesListAsJson);
- throw new DmiException("Unable to process JSON.",
- "JSON exception occurred when mapping modules.", e);
- }
- }
-
@Override
public Object getResourceDataOperationalForCmHandle(final @NotNull String cmHandle,
- final @NotNull String resourceIdentifier,
- final String acceptParamInHeader,
- final String optionsParamInQuery,
- final Map<String, String> cmHandlePropertyMap) {
+ final @NotNull String resourceIdentifier,
+ final String acceptParamInHeader,
+ final String optionsParamInQuery,
+ final Map<String, String> cmHandlePropertyMap) {
// not using cmHandlePropertyMap of onap dmi impl , other dmi impl might use this.
final ResponseEntity<String> responseEntity = sdncOperations.getResouceDataForOperationalAndRunning(cmHandle,
- resourceIdentifier,
- optionsParamInQuery,
- acceptParamInHeader,
- RESTCONF_CONTENT_PASSTHROUGH_OPERATIONAL_QUERY_PARAM);
+ resourceIdentifier,
+ optionsParamInQuery,
+ acceptParamInHeader,
+ RESTCONF_CONTENT_PASSTHROUGH_OPERATIONAL_QUERY_PARAM);
return prepareAndSendResponse(responseEntity, cmHandle);
}
@Override
public Object getResourceDataPassThroughRunningForCmHandle(final @NotNull String cmHandle,
- final @NotNull String resourceIdentifier,
- final String acceptParamInHeader,
- final String optionsParamInQuery,
- final Map<String, String> cmHandlePropertyMap) {
+ final @NotNull String resourceIdentifier,
+ final String acceptParamInHeader,
+ final String optionsParamInQuery,
+ final Map<String, String> cmHandlePropertyMap) {
// not using cmHandlePropertyMap of onap dmi impl , other dmi impl might use this.
final ResponseEntity<String> responseEntity = sdncOperations.getResouceDataForOperationalAndRunning(cmHandle,
- resourceIdentifier,
- optionsParamInQuery,
- acceptParamInHeader,
- REST_CONF_CONTENT_PASSTHROUGH_RUNNING_QUERY_PARAM);
+ resourceIdentifier,
+ optionsParamInQuery,
+ acceptParamInHeader,
+ REST_CONF_CONTENT_PASSTHROUGH_RUNNING_QUERY_PARAM);
return prepareAndSendResponse(responseEntity, cmHandle);
}
@Override
public String writeResourceDataPassthroughForCmHandle(final String cmHandle, final String resourceIdentifier,
- final String dataType, final String data) {
+ final String dataType, final String data) {
final ResponseEntity<String> responseEntity =
- sdncOperations.writeResourceDataPassthroughRunning(cmHandle, resourceIdentifier, dataType, data);
+ sdncOperations.writeResourceDataPassthroughRunning(cmHandle, resourceIdentifier, dataType, data);
if (responseEntity.getStatusCode().is2xxSuccessful()) {
return responseEntity.getBody();
} else {
throw new DmiException(cmHandle,
- RESPONSE_CODE + responseEntity.getStatusCode() + MESSAGE + responseEntity.getBody());
+ RESPONSE_CODE + responseEntity.getStatusCode() + MESSAGE + responseEntity.getBody());
}
}
@@ -222,7 +198,7 @@ public class DmiServiceImpl implements DmiService {
return responseEntity.getBody();
} else {
throw new ResourceDataNotFound(cmHandle,
- RESPONSE_CODE + responseEntity.getStatusCode() + MESSAGE + responseEntity.getBody());
+ RESPONSE_CODE + responseEntity.getStatusCode() + MESSAGE + responseEntity.getBody());
}
}
@@ -236,15 +212,15 @@ public class DmiServiceImpl implements DmiService {
moduleRequest = writer.writeValueAsString(ietfNetconfModuleReferences);
} catch (final JsonProcessingException e) {
log.error("JSON exception occurred when creating the module request for the given module reference {}",
- moduleReference.getName());
+ moduleReference.getName());
throw new DmiException("Unable to process JSON.",
- "JSON exception occurred when creating the module request.", e);
+ "JSON exception occurred when creating the module request.", e);
}
return moduleRequest;
}
private YangResource toYangResource(final ModuleReference moduleReference,
- final ResponseEntity<String> response) {
+ final ResponseEntity<String> response) {
final YangResource yangResource = new YangResource();
yangResource.setModuleName(moduleReference.getName());
yangResource.setRevision(moduleReference.getRevision());
@@ -255,13 +231,13 @@ public class DmiServiceImpl implements DmiService {
private String extractYangSourceFromBody(final ResponseEntity<String> responseEntity) {
final var responseBodyAsJsonObject = new Gson().fromJson(responseEntity.getBody(), JsonObject.class);
if (responseBodyAsJsonObject.getAsJsonObject(IETF_NETCONF_MONITORING_OUTPUT) == null
- || responseBodyAsJsonObject.getAsJsonObject(IETF_NETCONF_MONITORING_OUTPUT)
- .getAsJsonPrimitive("data") == null) {
+ || responseBodyAsJsonObject.getAsJsonObject(IETF_NETCONF_MONITORING_OUTPUT)
+ .getAsJsonPrimitive("data") == null) {
log.error("Error occurred when trying to parse the response body from sdnc {}", responseEntity.getBody());
throw new ModuleResourceNotFoundException(responseEntity.getBody(),
- "Error occurred when trying to parse the response body from sdnc.");
+ "Error occurred when trying to parse the response body from sdnc.");
}
return responseBodyAsJsonObject.getAsJsonObject(IETF_NETCONF_MONITORING_OUTPUT).getAsJsonPrimitive("data")
- .toString();
+ .toString();
}
}
diff --git a/src/main/java/org/onap/cps/ncmp/dmi/service/model/ModuleSchemaProperties.java b/src/main/java/org/onap/cps/ncmp/dmi/service/model/ModuleSchema.java
index 6de7d131..c77e0e41 100644
--- a/src/main/java/org/onap/cps/ncmp/dmi/service/model/ModuleSchemaProperties.java
+++ b/src/main/java/org/onap/cps/ncmp/dmi/service/model/ModuleSchema.java
@@ -1,6 +1,7 @@
/*
* ============LICENSE_START=======================================================
* Copyright (C) 2021 Nordix Foundation
+ * Modifications Copyright (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.
@@ -21,15 +22,10 @@
package org.onap.cps.ncmp.dmi.service.model;
import java.util.List;
-import lombok.Getter;
-import lombok.Setter;
+import lombok.Data;
-/**
- * ModuleSchemaProperties.
- */
-@Getter
-@Setter
-public class ModuleSchemaProperties {
+@Data
+public class ModuleSchema {
private String identifier;
private String version;
diff --git a/src/main/java/org/onap/cps/ncmp/dmi/service/model/ModuleSchemas.java b/src/main/java/org/onap/cps/ncmp/dmi/service/model/ModuleSchemas.java
deleted file mode 100644
index a7b2430d..00000000
--- a/src/main/java/org/onap/cps/ncmp/dmi/service/model/ModuleSchemas.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * ============LICENSE_START=======================================================
- * Copyright (C) 2021 Nordix Foundation
- * ================================================================================
- * 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.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * SPDX-License-Identifier: Apache-2.0
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.cps.ncmp.dmi.service.model;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Getter;
-import lombok.Setter;
-
-/**
- * ModuleSchemas.
- */
-@Getter
-@Setter
-public class ModuleSchemas {
-
- @JsonProperty("ietf-netconf-monitoring:schemas")
- private ModuleSchemaList schemas;
-}
diff --git a/src/main/java/org/onap/cps/ncmp/dmi/service/operation/SdncOperations.java b/src/main/java/org/onap/cps/ncmp/dmi/service/operation/SdncOperations.java
index bdbc3b31..43e2a5e6 100644
--- a/src/main/java/org/onap/cps/ncmp/dmi/service/operation/SdncOperations.java
+++ b/src/main/java/org/onap/cps/ncmp/dmi/service/operation/SdncOperations.java
@@ -1,6 +1,7 @@
/*
* ============LICENSE_START=======================================================
* Copyright (C) 2021 Nordix Foundation
+ * Modifications Copyright (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.
@@ -20,13 +21,24 @@
package org.onap.cps.ncmp.dmi.service.operation;
+import com.jayway.jsonpath.Configuration;
+import com.jayway.jsonpath.JsonPath;
+import com.jayway.jsonpath.JsonPathException;
+import com.jayway.jsonpath.TypeRef;
+import com.jayway.jsonpath.spi.json.JacksonJsonProvider;
+import com.jayway.jsonpath.spi.mapper.JacksonMappingProvider;
import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import org.apache.groovy.parser.antlr4.util.StringUtils;
import org.onap.cps.ncmp.dmi.config.DmiConfiguration.SdncProperties;
+import org.onap.cps.ncmp.dmi.exception.SdncException;
import org.onap.cps.ncmp.dmi.service.client.SdncRestconfClient;
+import org.onap.cps.ncmp.dmi.service.model.ModuleSchema;
import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
@@ -41,12 +53,18 @@ public class SdncOperations {
private static final String MOUNT_URL_TEMPLATE = "/node={nodeId}/yang-ext:mount";
private static final String GET_SCHEMA_URL = "/ietf-netconf-monitoring:netconf-state/schemas";
private static final String GET_SCHEMA_SOURCES_URL = "/ietf-netconf-monitoring:get-schema";
+ private static final String PATH_TO_MODULE_SCHEMAS = "$.ietf-netconf-monitoring:schemas.schema";
private SdncProperties sdncProperties;
private SdncRestconfClient sdncRestconfClient;
private final String topologyUrlData;
private final String topologyUrlOperational;
+ private Configuration jsonPathConfiguration = Configuration.builder()
+ .mappingProvider(new JacksonMappingProvider())
+ .jsonProvider(new JacksonJsonProvider())
+ .build();
+
/**
* Constructor for {@code SdncOperations}. This method also manipulates url properties.
*
@@ -65,11 +83,20 @@ public class SdncOperations {
* This method fetches list of modules usind sdnc client.
*
* @param nodeId node id for node
- * @return returns {@code ResponseEntity} which contains list of modules
+ * @return a collection of module schemas
*/
- public ResponseEntity<String> getModulesFromNode(final String nodeId) {
+ public Collection<ModuleSchema> getModuleSchemasFromNode(final String nodeId) {
final String urlWithNodeId = prepareGetSchemaUrl(nodeId);
- return sdncRestconfClient.getOperation(urlWithNodeId);
+ final ResponseEntity<String> modulesResponseEntity = sdncRestconfClient.getOperation(urlWithNodeId);
+ if (modulesResponseEntity.getStatusCode() == HttpStatus.OK) {
+ final String modulesResponseBody = modulesResponseEntity.getBody();
+ return (StringUtils.isEmpty(modulesResponseBody)) ? Collections.emptyList()
+ : convertToModuleSchemas(modulesResponseBody);
+ } else {
+ throw new SdncException(
+ String.format("SDNC failed to get Modules Schema for node %s", nodeId),
+ modulesResponseEntity.getStatusCode(), modulesResponseEntity.getBody());
+ }
}
/**
@@ -90,10 +117,10 @@ public class SdncOperations {
/**
* This method fetches the resource data for given node identifier on given resource using sdnc client.
*
- * @param nodeId network resource identifier
- * @param resourceId resource identifier
- * @param optionsParamInQuery fields query
- * @param acceptParamInHeader accept parameter
+ * @param nodeId network resource identifier
+ * @param resourceId resource identifier
+ * @param optionsParamInQuery fields query
+ * @param acceptParamInHeader accept parameter
* @param restconfContentQueryParam restconf content query param
* @return {@code ResponseEntity} response entity
*/
@@ -194,4 +221,16 @@ public class SdncOperations {
final String topologyMountUrl = topologyUrlData + MOUNT_URL_TEMPLATE;
return topologyMountUrl.replace("{nodeId}", nodeId);
}
+
+ private List<ModuleSchema> convertToModuleSchemas(final String modulesListAsJson) {
+ try {
+ return JsonPath.using(jsonPathConfiguration).parse(modulesListAsJson).read(
+ PATH_TO_MODULE_SCHEMAS, new TypeRef<>() {
+ });
+ } catch (final JsonPathException jsonPathException) {
+ throw new SdncException("SDNC Response processing failed",
+ "SDNC response is not in the expected format.", jsonPathException);
+ }
+ }
+
} \ No newline at end of file