X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=netconf-server%2Fsrc%2Fmain%2Fjava%2Forg%2Fcommscope%2Ftr069adapter%2Fnetconf%2Frpc%2FSoftwareDownloadOperation.java;fp=netconf-server%2Fsrc%2Fmain%2Fjava%2Forg%2Fcommscope%2Ftr069adapter%2Fnetconf%2Frpc%2FSoftwareDownloadOperation.java;h=a480ea4d3fa022a3ebe9d43101e1d135f727cb7e;hb=76744e810f35c84ecbd1d9998e361052466e9483;hp=f5b1454b3ac7a5b833659eea3e3640eaa7674cf3;hpb=ce4e2d38e3d42725f61c39dd172325d2def4bc44;p=oam%2Ftr069-adapter.git diff --git a/netconf-server/src/main/java/org/commscope/tr069adapter/netconf/rpc/SoftwareDownloadOperation.java b/netconf-server/src/main/java/org/commscope/tr069adapter/netconf/rpc/SoftwareDownloadOperation.java index f5b1454..a480ea4 100644 --- a/netconf-server/src/main/java/org/commscope/tr069adapter/netconf/rpc/SoftwareDownloadOperation.java +++ b/netconf-server/src/main/java/org/commscope/tr069adapter/netconf/rpc/SoftwareDownloadOperation.java @@ -1,164 +1,167 @@ -/* - * ============LICENSE_START======================================================================== - * ONAP : tr-069-adapter - * ================================================================================================= - * Copyright (C) 2020 CommScope Inc Intellectual Property. - * ================================================================================================= - * This tr-069-adapter software file is distributed by CommScope Inc 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 - * - * This file 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. - * ===============LICENSE_END======================================================================= - */ - -package org.commscope.tr069adapter.netconf.rpc; - -import java.io.StringReader; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; - -import org.commscope.tr069adapter.mapper.model.ErrorCodeDetails; -import org.commscope.tr069adapter.mapper.model.NetConfResponse; -import org.commscope.tr069adapter.netconf.boot.NetConfServiceBooter; -import org.commscope.tr069adapter.netconf.config.NetConfServerProperties; -import org.opendaylight.netconf.api.DocumentedException; -import org.opendaylight.netconf.api.DocumentedException.ErrorSeverity; -import org.opendaylight.netconf.api.DocumentedException.ErrorTag; -import org.opendaylight.netconf.api.DocumentedException.ErrorType; -import org.opendaylight.netconf.api.xml.XmlElement; -import org.opendaylight.netconf.api.xml.XmlNetconfConstants; -import org.opendaylight.netconf.mapping.api.HandlingPriority; -import org.opendaylight.netconf.mapping.api.NetconfOperation; -import org.opendaylight.netconf.mapping.api.NetconfOperationChainedExecution; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.w3c.dom.Document; -import org.xml.sax.InputSource; - -public class SoftwareDownloadOperation implements NetconfOperation { - private static final Logger logger = LoggerFactory.getLogger(SoftwareDownloadOperation.class); - public static final String SOFT_MGMT_NAMESPACE = "urn:o-ran:software-management:1.0"; - - private String deviceID; - private String swVersion; - private String hwVersion; - - public SoftwareDownloadOperation(String deviceID, String swVersion, String hwVersion) { - this.deviceID = deviceID; - this.swVersion = swVersion; - this.hwVersion = hwVersion; - } - - @Override - public HandlingPriority canHandle(final Document message) throws DocumentedException { - OperationNameAndNamespace operationNameAndNamespace = null; - operationNameAndNamespace = new OperationNameAndNamespace(message); - return canHandle(operationNameAndNamespace.getOperationName(), - operationNameAndNamespace.getNamespace()); - } - - @Override - public Document handle(Document requestMessage, - NetconfOperationChainedExecution subsequentOperation) throws DocumentedException { - - logger.debug("soft-ware download rpc is received in netconfserver"); - - final XmlElement requestElement = XmlElement.fromDomDocument(requestMessage); - final String msgId = requestElement.getAttribute(XmlNetconfConstants.MESSAGE_ID); - - String requestXml = XmlUtility.convertDocumentToString(requestElement); - logger.debug("soft-ware download rpc requestXml=" + requestXml); - - NetConfServerProperties config = - NetConfServiceBooter.getApplicationContext().getBean(NetConfServerProperties.class); - - final String baseUrl = config.getMapperPath() + "/softwareDowload"; - NetConfResponse restResponse = - XmlUtility.invokeMapperCall(baseUrl, requestXml, deviceID, swVersion, hwVersion); - - Document document = null; - - ErrorCodeDetails errorCode = restResponse.getErrorCode(); - if (errorCode != null && errorCode.getFaultCode() != null - && !errorCode.getFaultCode().equalsIgnoreCase("0")) { - logger.error("Error recevied : " + errorCode); - throw new DocumentedException(errorCode.getErrorMessage(), - ErrorType.from(errorCode.getErrorType()), ErrorTag.from(errorCode.getErrorTag()), - ErrorSeverity.from(errorCode.getErrorSeverity())); - } else if (restResponse != null && restResponse.getNetconfResponseXml() != null) { - logger.debug("soft-ware download rpc response received from mapper " - + restResponse.getNetconfResponseXml()); - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - DocumentBuilder builder; - try { - builder = factory.newDocumentBuilder(); - document = - builder.parse(new InputSource(new StringReader(restResponse.getNetconfResponseXml()))); - document.getDocumentElement().setAttribute("xmlns:ns1", getOperationNamespace()); - document.getDocumentElement().setAttribute("xmlns", - XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0); - document.getDocumentElement().setAttribute(XmlNetconfConstants.MESSAGE_ID, msgId); - } catch (Exception e) { - logger.error("while contruscting the response; ", e.toString()); - } - } - - return document; - } - - protected HandlingPriority canHandle(final String operationName, - final String operationNamespace) { - return operationName.equals("software-download") - && operationNamespace.equals(SOFT_MGMT_NAMESPACE) - ? HandlingPriority.HANDLE_WITH_DEFAULT_PRIORITY.increasePriority(1100) - : HandlingPriority.CANNOT_HANDLE; - } - - public static final class OperationNameAndNamespace { - private final String operationName; - private final String namespace; - - private final XmlElement operationElement; - - public OperationNameAndNamespace(final Document message) throws DocumentedException { - XmlElement requestElement = null; - requestElement = getRequestElementWithCheck(message); - operationElement = requestElement.getOnlyChildElement(); - operationName = operationElement.getName(); - namespace = operationElement.getNamespace(); - } - - public String getOperationName() { - return operationName; - } - - public String getNamespace() { - return namespace; - } - - public XmlElement getOperationElement() { - return operationElement; - } - - } - - protected static XmlElement getRequestElementWithCheck(final Document message) - throws DocumentedException { - return XmlElement.fromDomElementWithExpected(message.getDocumentElement(), - XmlNetconfConstants.RPC_KEY, XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0); - } - - protected String getOperationNamespace() { - return "urn:o-ran:software-management:1.0"; - } - - protected String getOperationName() { - return "software-download"; - } -} +/* + * ============LICENSE_START======================================================================== + * ONAP : tr-069-adapter + * ================================================================================================= + * Copyright (C) 2020 CommScope Inc Intellectual Property. + * ================================================================================================= + * This tr-069-adapter software file is distributed by CommScope Inc 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 + * + * This file 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. + * ===============LICENSE_END======================================================================= + */ + +package org.commscope.tr069adapter.netconf.rpc; + +import java.io.StringReader; + +import javax.xml.XMLConstants; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.commscope.tr069adapter.mapper.model.ErrorCodeDetails; +import org.commscope.tr069adapter.mapper.model.NetConfResponse; +import org.commscope.tr069adapter.netconf.boot.NetConfServiceBooter; +import org.commscope.tr069adapter.netconf.config.NetConfServerProperties; +import org.opendaylight.netconf.api.DocumentedException; +import org.opendaylight.netconf.api.DocumentedException.ErrorSeverity; +import org.opendaylight.netconf.api.DocumentedException.ErrorTag; +import org.opendaylight.netconf.api.DocumentedException.ErrorType; +import org.opendaylight.netconf.api.xml.XmlElement; +import org.opendaylight.netconf.api.xml.XmlNetconfConstants; +import org.opendaylight.netconf.mapping.api.HandlingPriority; +import org.opendaylight.netconf.mapping.api.NetconfOperation; +import org.opendaylight.netconf.mapping.api.NetconfOperationChainedExecution; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.w3c.dom.Document; +import org.xml.sax.InputSource; + +public class SoftwareDownloadOperation implements NetconfOperation { + private static final Logger logger = LoggerFactory.getLogger(SoftwareDownloadOperation.class); + public static final String SOFT_MGMT_NAMESPACE = "urn:o-ran:software-management:1.0"; + public static final String OP_NAME = "software-download"; + + private String deviceID; + private String swVersion; + private String hwVersion; + + public SoftwareDownloadOperation(String deviceID, String swVersion, String hwVersion) { + this.deviceID = deviceID; + this.swVersion = swVersion; + this.hwVersion = hwVersion; + } + + @Override + public HandlingPriority canHandle(final Document message) throws DocumentedException { + OperationNameAndNamespace operationNameAndNamespace = null; + operationNameAndNamespace = new OperationNameAndNamespace(message); + return canHandle(operationNameAndNamespace.getOperationName(), + operationNameAndNamespace.getNamespace()); + } + + @Override + public Document handle(Document requestMessage, + NetconfOperationChainedExecution subsequentOperation) throws DocumentedException { + + logger.debug("soft-ware download rpc is received in netconfserver"); + + final XmlElement requestElement = XmlElement.fromDomDocument(requestMessage); + final String msgId = requestElement.getAttribute(XmlNetconfConstants.MESSAGE_ID); + + String requestXml = XmlUtility.convertDocumentToString(requestElement); + logger.debug("soft-ware download rpc requestXml= {}", requestXml); + + NetConfServerProperties config = + NetConfServiceBooter.getApplicationContext().getBean(NetConfServerProperties.class); + + final String baseUrl = config.getMapperPath() + "/softwareDowload"; + NetConfResponse restResponse = + XmlUtility.invokeMapperCall(baseUrl, requestXml, deviceID, swVersion, hwVersion); + + Document document = null; + + ErrorCodeDetails errorCode = restResponse.getErrorCode(); + if (errorCode != null && errorCode.getFaultCode() != null + && !errorCode.getFaultCode().equalsIgnoreCase("0")) { + logger.error("Error recevied : {}", errorCode); + throw new DocumentedException(errorCode.getErrorMessage(), + ErrorType.from(errorCode.getErrorType()), ErrorTag.from(errorCode.getErrorTag()), + ErrorSeverity.from(errorCode.getErrorSeverity())); + } else if (restResponse.getNetconfResponseXml() != null) { + logger.debug("soft-ware download rpc response received from mapper {}", + restResponse.getNetconfResponseXml()); + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); + factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); + DocumentBuilder builder; + try { + builder = factory.newDocumentBuilder(); + document = + builder.parse(new InputSource(new StringReader(restResponse.getNetconfResponseXml()))); + document.getDocumentElement().setAttribute("xmlns:ns1", getOperationNamespace()); + document.getDocumentElement().setAttribute("xmlns", + XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0); + document.getDocumentElement().setAttribute(XmlNetconfConstants.MESSAGE_ID, msgId); + } catch (Exception e) { + logger.error("while contruscting the response; {} ", e.toString()); + } + } + + return document; + } + + protected HandlingPriority canHandle(final String operationName, + final String operationNamespace) { + return operationName.equals(OP_NAME) && operationNamespace.equals(SOFT_MGMT_NAMESPACE) + ? HandlingPriority.HANDLE_WITH_DEFAULT_PRIORITY.increasePriority(1100) + : HandlingPriority.CANNOT_HANDLE; + } + + public static final class OperationNameAndNamespace { + private final String operationName; + private final String namespace; + + private final XmlElement operationElement; + + public OperationNameAndNamespace(final Document message) throws DocumentedException { + XmlElement requestElement = null; + requestElement = getRequestElementWithCheck(message); + operationElement = requestElement.getOnlyChildElement(); + operationName = operationElement.getName(); + namespace = operationElement.getNamespace(); + } + + public String getOperationName() { + return operationName; + } + + public String getNamespace() { + return namespace; + } + + public XmlElement getOperationElement() { + return operationElement; + } + + } + + protected static XmlElement getRequestElementWithCheck(final Document message) + throws DocumentedException { + return XmlElement.fromDomElementWithExpected(message.getDocumentElement(), + XmlNetconfConstants.RPC_KEY, XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0); + } + + protected String getOperationNamespace() { + return SOFT_MGMT_NAMESPACE; + } + + protected String getOperationName() { + return OP_NAME; + } +}