public static Element createTextElement(final Document document, final String qName, final String content, final Optional<String> namespaceURI) { Element typeElement = createElement(document, qName, namespaceURI); typeElement.appendChild(document.createTextNode(content)); return typeElement; }
@Override protected Element handleWithNoSubsequentOperations(final Document document, final XmlElement operationElement) throws DocumentedException { boolean commitStatus = transactionProvider.commitTransaction(); LOG.trace("Commit completed successfully {}", commitStatus); return XmlUtil.createElement(document, XmlNetconfConstants.OK, Optional.<String>absent()); }
@Override protected Element handleWithNoSubsequentOperations(final Document document, final XmlElement operationElement) throws DocumentedException { try { transactionProvider.abortTransaction(); } catch (IllegalStateException e) { LOG.warn("Abort failed ", e); final Map<String, String> errorInfo = new HashMap<>(); errorInfo .put(ErrorTag.operation_failed.name(), "Operation failed. Use 'get-config' or 'edit-config' before triggering 'discard-changes' operation"); throw new DocumentedException(e.getMessage(), e, ErrorType.application, ErrorTag.operation_failed, ErrorSeverity.error, errorInfo); } return XmlUtil.createElement(document, XmlNetconfConstants.OK, Optional.<String>absent()); }
@Override protected Element handleWithNoSubsequentOperations(final Document document, final XmlElement operationElement) throws DocumentedException { final Datastore targetDatastore = Lock.extractTargetParameter(operationElement); if (targetDatastore == Datastore.candidate) { LOG.debug("Unlocking candidate datastore on session: {}", getNetconfSessionIdForReporting()); return XmlUtil.createElement(document, XmlNetconfConstants.OK, Optional.<String>absent()); } throw new DocumentedException("Unable to unlock " + targetDatastore + " datastore", DocumentedException.ErrorType.application, DocumentedException.ErrorTag.operation_not_supported, DocumentedException.ErrorSeverity.error); }
@Override protected Element handleWithNoSubsequentOperations(final Document document, final XmlElement operationElement) throws DocumentedException { final Datastore targetDatastore = extractTargetParameter(operationElement); if (targetDatastore == Datastore.candidate) { LOG.debug("Locking candidate datastore on session: {}", getNetconfSessionIdForReporting()); return XmlUtil.createElement(document, XmlNetconfConstants.OK, Optional.<String>absent()); } throw new DocumentedException("Unable to lock " + targetDatastore + " datastore", DocumentedException.ErrorType.application, DocumentedException.ErrorTag.operation_not_supported, DocumentedException.ErrorSeverity.error); }
@Override protected Element handleWithNoSubsequentOperations(final Document document, final XmlElement operationElement) throws DocumentedException { final Datastore targetDatastore = extractTargetParameter(operationElement); if(targetDatastore == Datastore.candidate) { // Since candidate datastore instances are allocated per session and not accessible anywhere else, no need to lock LOG.debug("Locking {} datastore on session: {}", targetDatastore, getNetconfSessionIdForReporting()); // TODO should this fail if we are already locked ? return XmlUtil.createElement(document, XmlNetconfConstants.OK, Optional.<String>absent()); } // Not supported running lock throw new DocumentedException("Unable to lock " + Datastore.running + " datastore", DocumentedException.ErrorType.application, DocumentedException.ErrorTag.operation_not_supported, DocumentedException.ErrorSeverity.error); }
@Override protected Element handleWithNoSubsequentOperations(final Document document, final XmlElement operationElement) throws DocumentedException { final Datastore targetDatastore = Lock.extractTargetParameter(operationElement); if(targetDatastore == Datastore.candidate) { // Since candidate datastore instances are allocated per session and not accessible anywhere else, no need to lock LOG.debug("Unlocking {} datastore on session: {}", targetDatastore, getNetconfSessionIdForReporting()); // TODO this should fail if we are not locked return XmlUtil.createElement(document, XmlNetconfConstants.OK, Optional.<String>absent()); } // Not supported running lock throw new DocumentedException("Unable to unlock " + Datastore.running + " datastore", DocumentedException.ErrorType.application, DocumentedException.ErrorTag.operation_not_supported, DocumentedException.ErrorSeverity.error); }
@Override protected Element handleWithNoSubsequentOperations(Document document, XmlElement xml) throws DocumentedException { checkXml(xml); CommitStatus status; try { status = getConfigSubsystemFacade().commitTransaction(); LOG.trace("Datastore {} committed successfully: {}", Datastore.candidate, status); } catch (ConflictingVersionException | ValidationException e) { throw DocumentedException.wrap(e); } LOG.trace("Datastore {} committed successfully: {}", Datastore.candidate, status); return XmlUtil.createElement(document, XmlNetconfConstants.OK, Optional.<String>absent()); }
@Override protected Element handleWithNoSubsequentOperations(Document document, XmlElement operationElement) throws DocumentedException { final Optional<YangInstanceIdentifier> dataRootOptional = getDataRootFromFilter(operationElement); if (!dataRootOptional.isPresent()) { return XmlUtil.createElement(document, XmlNetconfConstants.DATA_KEY, Optional.<String>absent()); } final YangInstanceIdentifier dataRoot = dataRootOptional.get(); DOMDataReadWriteTransaction rwTx = getTransaction(Datastore.running); try { final Optional<NormalizedNode<?, ?>> normalizedNodeOptional = rwTx.read(LogicalDatastoreType.OPERATIONAL, dataRoot).checkedGet(); transactionProvider.abortRunningTransaction(rwTx); if (!normalizedNodeOptional.isPresent()) { return XmlUtil.createElement(document, XmlNetconfConstants.DATA_KEY, Optional.<String>absent()); } return serializeNodeWithParentStructure(document, dataRoot, normalizedNodeOptional.get()); } catch (ReadFailedException e) { LOG.warn("Unable to read data: {}", dataRoot, e); throw new IllegalStateException("Unable to read data " + dataRoot, e); } }
@Override public Document handle(final Document requestMessage, final NetconfOperationChainedExecution subsequentOperation) throws DocumentedException { XmlElement requestElement = getRequestElementWithCheck(requestMessage); Document document = XmlUtil.newDocument(); XmlElement operationElement = requestElement.getOnlyChildElement(); Map<String, Attr> attributes = requestElement.getAttributes(); Element response = handle(document, operationElement, subsequentOperation); Element rpcReply = XmlUtil.createElement(document, XmlMappingConstants.RPC_REPLY_KEY, Optional.of(XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0)); if(XmlElement.fromDomElement(response).hasNamespace()) { rpcReply.appendChild(response); } else { Element responseNS = XmlUtil.createElement(document, response.getNodeName(), Optional.of(XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0)); NodeList list = response.getChildNodes(); while(list.getLength()!=0) { responseNS.appendChild(list.item(0)); } rpcReply.appendChild(responseNS); } for (Attr attribute : attributes.values()) { rpcReply.setAttributeNode((Attr) document.importNode(attribute, true)); } document.appendChild(rpcReply); return document; }
@VisibleForTesting Element getResponseInternal(final Document document, final ConfigExecution configExecution) throws DocumentedException { try { getConfigSubsystemFacade().executeConfigExecution(configExecution); } catch (ValidationException e) { LOG.warn("Test phase for {} failed", EditConfigXmlParser.EDIT_CONFIG, e); final Map<String, String> errorInfo = new HashMap<>(); errorInfo.put(ErrorTag.operation_failed.name(), e.getMessage()); throw new DocumentedException("Test phase: " + e.getMessage(), e, ErrorType.application, ErrorTag.operation_failed, ErrorSeverity.error, errorInfo); } LOG.trace("Operation {} successful", EditConfigXmlParser.EDIT_CONFIG); return XmlUtil.createElement(document, XmlNetconfConstants.OK, Optional.<String>absent()); }
@Override protected Element handleWithNoSubsequentOperations(Document document, XmlElement xml) throws DocumentedException { fromXml(xml); try { getConfigSubsystemFacade().abortConfiguration(); } catch (final RuntimeException e) { LOG.warn("Abort failed: ", e); final Map<String, String> errorInfo = new HashMap<>(); errorInfo .put(ErrorTag.operation_failed.name(), "Abort failed."); throw new DocumentedException(e.getMessage(), e, ErrorType.application, ErrorTag.operation_failed, ErrorSeverity.error, errorInfo); } LOG.trace("Changes discarded successfully from datastore {}", Datastore.candidate); return XmlUtil.createElement(document, XmlNetconfConstants.OK, Optional.<String>absent()); } }
@Override protected Element handleWithNoSubsequentOperations(Document document, XmlElement xml) throws DocumentedException { checkXml(xml); try { getConfigSubsystemFacade().validateConfiguration(); } catch (ValidationException e) { LOG.warn("Validation failed", e); throw DocumentedException.wrap(e); } catch (IllegalStateException e) { LOG.warn("Validation failed", e); final Map<String, String> errorInfo = new HashMap<>(); errorInfo .put(ErrorTag.operation_failed.name(), "Datastore is not present. Use 'get-config' or 'edit-config' before triggering 'operations' operation"); throw new DocumentedException(e.getMessage(), e, ErrorType.application, ErrorTag.operation_failed, ErrorSeverity.error, errorInfo); } LOG.trace("Datastore {} validated successfully", Datastore.candidate); return XmlUtil.createElement(document, XmlNetconfConstants.OK, Optional.<String>absent()); } }
@Override public Document handle(final Document requestMessage, final NetconfOperationChainedExecution subsequentOperation) throws DocumentedException { final XmlElement requestElement = getRequestElementWithCheck(requestMessage); final Document document = XmlUtil.newDocument(); final XmlElement operationElement = requestElement.getOnlyChildElement(); final Map<String, Attr> attributes = requestElement.getAttributes(); final Element response = handle(document, operationElement, subsequentOperation); final Element rpcReply = XmlUtil.createElement(document, XmlMappingConstants.RPC_REPLY_KEY, Optional.of(XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0)); if(XmlElement.fromDomElement(response).hasNamespace()) { rpcReply.appendChild(response); } else { final NodeList list = response.getChildNodes(); if (list.getLength() == 0) { rpcReply.appendChild(response); } else { while (list.getLength() != 0) { rpcReply.appendChild(list.item(0)); } } } for (Attr attribute : attributes.values()) { rpcReply.setAttributeNode((Attr) document.importNode(attribute, true)); } document.appendChild(rpcReply); return document; }
return XmlUtil.createElement(document, XmlNetconfConstants.DATA_KEY, Optional.<String>absent()); return XmlUtil.createElement(document, XmlNetconfConstants.DATA_KEY, Optional.<String>absent());
private AnyXmlNode encapsulate(final DOMNotification body) { // FIXME: Introduce something like YangModeledAnyXmlNode in Yangtools final Document doc = XmlUtil.newDocument(); final Optional<String> namespace = Optional.of(PAYLOAD_ARG.getNodeType().getNamespace().toString()); final Element element = XmlUtil.createElement(doc, "payload", namespace); final DOMResult result = new DOMResult(element); final SchemaContext context = mount.getSchemaContext(); final SchemaPath schemaPath = body.getType(); try { NetconfUtil.writeNormalizedNode(body.getBody(), result, schemaPath, context); return Builders.anyXmlBuilder().withNodeIdentifier(PAYLOAD_ARG).withValue(new DOMSource(element)).build(); } catch (IOException | XMLStreamException e) { LOG.error("Unable to encapsulate notification.", e); throw Throwables.propagate(e); } }
Element dataElement = XmlUtil.createElement(document, XmlMappingConstants.DATA_KEY, Optional.<String>absent()); Element modulesElement = XmlUtil.createElement(document, XmlMappingConstants.MODULES_KEY, Optional.of(XmlMappingConstants.URN_OPENDAYLIGHT_PARAMS_XML_NS_YANG_CONTROLLER_CONFIG)); dataElement.appendChild(modulesElement);
@Override protected Element handleWithNoSubsequentOperations(final Document document, final XmlElement operationElement) throws DocumentedException { final Datastore targetDatastore = extractTargetParameter(operationElement); if (targetDatastore == Datastore.running) { throw new DocumentedException("edit-config on running datastore is not supported", ErrorType.protocol, ErrorTag.operation_not_supported, ErrorSeverity.error); } final ModifyAction defaultAction = getDefaultOperation(operationElement); final XmlElement configElement = getElement(operationElement, CONFIG_KEY); for (XmlElement element : configElement.getChildElements()) { final String ns = element.getNamespace(); final DataSchemaNode schemaNode = getSchemaNodeFromNamespace(ns, element).get(); final DataTreeChangeTracker changeTracker = new DataTreeChangeTracker(defaultAction); final DomToNormalizedNodeParserFactory.BuildingStrategyProvider editOperationStrategyProvider = new EditOperationStrategyProvider(changeTracker); parseIntoNormalizedNode(schemaNode, element, editOperationStrategyProvider); executeOperations(changeTracker); } return XmlUtil.createElement(document, XmlNetconfConstants.OK, Optional.<String>absent()); }
@Override protected Element handleWithNoSubsequentOperations(Document document, XmlElement xml) throws DocumentedException { // TODO check for namespaces and unknown elements final RpcFacade.OperationExecution execution = getConfigSubsystemFacade().getRpcFacade().fromXml(xml); LOG.debug("Invoking operation {} on {} with arguments {}", execution.getOperationName(), execution.getOn(), execution.getAttributes()); final Object result = getConfigSubsystemFacade().getRpcFacade().executeOperation(execution); LOG.trace("Operation {} called successfully on {} with arguments {} with result {}", execution.getOperationName(), execution.getOn(), execution.getAttributes(), result); if (execution.isVoid()) { return XmlUtil.createElement(document, XmlNetconfConstants.OK, Optional.<String>absent()); } else { return getConfigSubsystemFacade().getRpcFacade().toXml(document, result, execution); } }
final DOMRpcResult result = rpcFuture.checkedGet(); if (result.getResult() == null) { return XmlUtil.createElement(document, XmlNetconfConstants.OK, Optional.of(XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0));