import com.google.common.base.Preconditions;
import java.io.IOException;
-import java.net.URISyntaxException;
import java.util.Iterator;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import javax.xml.transform.dom.DOMResult;
-import javax.xml.transform.dom.DOMSource;
import org.eclipse.jdt.annotation.Nullable;
import org.opendaylight.netconf.api.DocumentedException;
import org.opendaylight.netconf.api.xml.XmlElement;
import org.opendaylight.netconf.api.xml.XmlUtil;
import org.opendaylight.yangtools.rfc7952.data.api.NormalizedMetadata;
import org.opendaylight.yangtools.rfc7952.data.util.NormalizedMetadataWriter;
-import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter;
import org.opendaylight.yangtools.yang.data.codec.xml.XMLStreamNormalizedNodeStreamWriter;
-import org.opendaylight.yangtools.yang.data.codec.xml.XmlCodecFactory;
-import org.opendaylight.yangtools.yang.data.codec.xml.XmlParserStream;
-import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
-import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.opendaylight.yangtools.yang.model.api.SchemaPath;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
-import org.xml.sax.SAXException;
public final class NetconfUtil {
- public static final QName NETCONF_QNAME =
- QName.create("urn:ietf:params:xml:ns:netconf:base:1.0", "2011-06-01", "netconf").intern();
- public static final QName NETCONF_DATA_QNAME = QName.create(NETCONF_QNAME, "data").intern();
- public static final XMLOutputFactory XML_FACTORY;
-
private static final Logger LOG = LoggerFactory.getLogger(NetconfUtil.class);
+ public static final XMLOutputFactory XML_FACTORY;
static {
XML_FACTORY = XMLOutputFactory.newFactory();
xmlWriter.close();
}
}
-
- public static NormalizedNodeResult transformDOMSourceToNormalizedNode(final SchemaContext schemaContext,
- final DOMSource value) throws XMLStreamException, URISyntaxException, IOException, SAXException {
- final NormalizedNodeResult resultHolder = new NormalizedNodeResult();
- final NormalizedNodeStreamWriter writer = ImmutableNormalizedNodeStreamWriter.from(resultHolder);
- final XmlCodecFactory codecs = XmlCodecFactory.create(schemaContext);
- final ContainerSchemaNode dataRead = new NodeContainerProxy(NETCONF_DATA_QNAME, schemaContext.getChildNodes());
- try (XmlParserStream xmlParserStream = XmlParserStream.create(writer, codecs, dataRead)) {
- xmlParserStream.traverse(value);
- }
- return resultHolder;
- }
}
<groupId>org.opendaylight.mdsal.model</groupId>
<artifactId>yang-ext</artifactId>
</dependency>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>netconf-util</artifactId>
- </dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
import org.opendaylight.netconf.sal.connect.netconf.listener.NetconfSessionPreferences;
import org.opendaylight.netconf.sal.connect.netconf.sal.NetconfDeviceRpc;
import org.opendaylight.netconf.sal.connect.util.RemoteDeviceId;
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;
/**
* Factory for netconf device schemas.
*/
public interface NetconfDeviceSchemasResolver {
NetconfDeviceSchemas resolve(
- NetconfDeviceRpc deviceRpc, NetconfSessionPreferences remoteSessionCapabilities, RemoteDeviceId id,
- SchemaContext schemaContext);
+ NetconfDeviceRpc deviceRpc, NetconfSessionPreferences remoteSessionCapabilities, RemoteDeviceId id);
}
*/
static NetconfDeviceRpc getRpcForInitialization(final NetconfDeviceCommunicator listener,
final boolean notificationSupport) {
- final BaseSchema baseSchema = resolveBaseSchema(notificationSupport);
+ final BaseSchema baseSchema = notificationSupport
+ ? BaseSchema.BASE_NETCONF_CTX_WITH_NOTIFICATIONS
+ : BaseSchema.BASE_NETCONF_CTX;
return new NetconfDeviceRpc(baseSchema.getSchemaContext(), listener,
new NetconfMessageTransformer(baseSchema.getSchemaContext(), false, baseSchema));
}
- private static BaseSchema resolveBaseSchema(final boolean notificationSupport) {
- return notificationSupport ? BaseSchema.BASE_NETCONF_CTX_WITH_NOTIFICATIONS : BaseSchema.BASE_NETCONF_CTX;
- }
-
public NetconfDevice(final SchemaResourcesDTO schemaResourcesDTO, final RemoteDeviceId id,
final RemoteDeviceHandler<NetconfSessionPreferences> salFacade,
final ListeningExecutorService globalProcessingExecutor,
final NetconfDeviceRpc initRpc =
getRpcForInitialization(listener, remoteSessionCapabilities.isNotificationsSupported());
final DeviceSourcesResolver task =
- new DeviceSourcesResolver(remoteSessionCapabilities, id, stateSchemasResolver, initRpc,
- resolveBaseSchema(remoteSessionCapabilities.isNotificationsSupported()).getSchemaContext());
+ new DeviceSourcesResolver(remoteSessionCapabilities, id, stateSchemasResolver, initRpc);
final ListenableFuture<DeviceSources> sourceResolverFuture = processingExecutor.submit(task);
if (shouldListenOnSchemaChange(remoteSessionCapabilities)) {
private final NetconfSessionPreferences remoteSessionCapabilities;
private final RemoteDeviceId id;
private final NetconfDeviceSchemasResolver stateSchemasResolver;
- private final SchemaContext schemaContext;
DeviceSourcesResolver(final NetconfDeviceRpc deviceRpc,
final NetconfSessionPreferences remoteSessionCapabilities,
- final RemoteDeviceId id, final NetconfDeviceSchemasResolver stateSchemasResolver,
- final SchemaContext schemaContext) {
+ final RemoteDeviceId id, final NetconfDeviceSchemasResolver stateSchemasResolver) {
this.deviceRpc = deviceRpc;
this.remoteSessionCapabilities = remoteSessionCapabilities;
this.id = id;
this.stateSchemasResolver = stateSchemasResolver;
- this.schemaContext = schemaContext;
}
DeviceSourcesResolver(final NetconfSessionPreferences remoteSessionCapabilities, final RemoteDeviceId id,
final NetconfDeviceSchemasResolver stateSchemasResolver,
- final NetconfDeviceRpc rpcForMonitoring, final SchemaContext schemaCtx) {
- this(rpcForMonitoring, remoteSessionCapabilities, id, stateSchemasResolver, schemaCtx);
+ final NetconfDeviceRpc rpcForMonitoring) {
+ this(rpcForMonitoring, remoteSessionCapabilities, id, stateSchemasResolver);
}
@Override
public DeviceSources call() {
final NetconfDeviceSchemas availableSchemas =
- stateSchemasResolver.resolve(deviceRpc, remoteSessionCapabilities, id, schemaContext);
+ stateSchemasResolver.resolve(deviceRpc, remoteSessionCapabilities, id);
LOG.debug("{}: Schemas exposed by ietf-netconf-monitoring: {}", id,
availableSchemas.getAvailableYangSchemasQNames());
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkState;
-import static com.google.common.base.Verify.verify;
import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_DATA_NODEID;
import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_GET_NODEID;
import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_GET_PATH;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableSet;
-import java.io.IOException;
import java.net.URI;
-import java.net.URISyntaxException;
import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ExecutionException;
-import javax.xml.stream.XMLStreamException;
import org.opendaylight.mdsal.dom.api.DOMRpcResult;
import org.opendaylight.mdsal.dom.api.DOMRpcService;
import org.opendaylight.netconf.sal.connect.api.NetconfDeviceSchemas;
import org.opendaylight.netconf.sal.connect.netconf.schema.mapping.BaseSchema;
import org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil;
import org.opendaylight.netconf.sal.connect.util.RemoteDeviceId;
-import org.opendaylight.netconf.util.NetconfUtil;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.NetconfState;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.Yang;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.Schemas;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.schemas.Schema;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.api.schema.AnyXmlNode;
import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode;
import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.xml.sax.SAXException;
/**
* Holds QNames for all yang modules reported by ietf-netconf-monitoring/state/schemas.
* Issue get request to remote device and parse response to find all schemas under netconf-state/schemas.
*/
static NetconfStateSchemas create(final DOMRpcService deviceRpc,
- final NetconfSessionPreferences remoteSessionCapabilities, final RemoteDeviceId id,
- final SchemaContext schemaContext) {
+ final NetconfSessionPreferences remoteSessionCapabilities, final RemoteDeviceId id) {
if (!remoteSessionCapabilities.isMonitoringSupported()) {
// TODO - need to search for get-schema support, not just ietf-netconf-monitoring support
// issue might be a deviation to ietf-netconf-monitoring where get-schema is unsupported...
return EMPTY;
}
- final Optional<? extends NormalizedNode<?, ?>> optSchemasNode = findSchemasNode(schemasNodeResult.getResult(),
- schemaContext);
+ final Optional<? extends NormalizedNode<?, ?>> optSchemasNode = findSchemasNode(schemasNodeResult.getResult());
if (!optSchemasNode.isPresent()) {
LOG.warn("{}: Unable to detect available schemas, get to {} was empty", id, STATE_SCHEMAS_IDENTIFIER);
return EMPTY;
return new NetconfStateSchemas(availableYangSchemas);
}
- private static Optional<? extends NormalizedNode<?, ?>> findSchemasNode(final NormalizedNode<?, ?> result,
- final SchemaContext schemaContext) {
+ private static Optional<? extends NormalizedNode<?, ?>> findSchemasNode(final NormalizedNode<?, ?> result) {
if (result == null) {
return Optional.empty();
}
- final Optional<DataContainerChild<?, ?>> rpcResultOpt = ((ContainerNode)result).getChild(NETCONF_DATA_NODEID);
- if (!rpcResultOpt.isPresent()) {
+ final Optional<DataContainerChild<?, ?>> dataNode = ((DataContainerNode<?>) result)
+ .getChild(NETCONF_DATA_NODEID);
+ if (!dataNode.isPresent()) {
return Optional.empty();
}
- final DataContainerChild<?, ?> rpcResult = rpcResultOpt.get();
- verify(rpcResult instanceof AnyXmlNode, "Unexpected result %s", rpcResult);
- final NormalizedNode<?, ?> dataNode;
-
- try {
- dataNode = NetconfUtil.transformDOMSourceToNormalizedNode(schemaContext,
- ((AnyXmlNode) rpcResult).getValue()).getResult();
- } catch (XMLStreamException | URISyntaxException | IOException | SAXException e) {
- LOG.warn("Failed to transform {}", rpcResult, e);
- return Optional.empty();
- }
-
- final Optional<DataContainerChild<?, ?>> nStateNode = ((DataContainerNode<?>) dataNode).getChild(
- toId(NetconfState.QNAME));
+ final Optional<DataContainerChild<? extends YangInstanceIdentifier.PathArgument, ?>> nStateNode =
+ ((DataContainerNode<?>) dataNode.get()).getChild(toId(NetconfState.QNAME));
if (!nStateNode.isPresent()) {
return Optional.empty();
}
import org.opendaylight.netconf.sal.connect.util.RemoteDeviceId;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev160621.ModulesState;
import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;
/**
* Default implementation resolving schemas QNames from netconf-state or from modules-state.
@Override
public NetconfDeviceSchemas resolve(final NetconfDeviceRpc deviceRpc,
- final NetconfSessionPreferences remoteSessionCapabilities,
- final RemoteDeviceId id, final SchemaContext schemaContext) {
+ final NetconfSessionPreferences remoteSessionCapabilities,
+ final RemoteDeviceId id) {
if (remoteSessionCapabilities.isMonitoringSupported()) {
- return NetconfStateSchemas.create(deviceRpc, remoteSessionCapabilities, id, schemaContext);
+ return NetconfStateSchemas.create(deviceRpc, remoteSessionCapabilities, id);
}
// FIXME: I think we should prefer YANG library here
import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.CREATE_SUBSCRIPTION_RPC_QNAME;
import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.IETF_NETCONF_NOTIFICATIONS;
+import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_RPC_REPLY_NODEID;
import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.NETCONF_URI;
import static org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil.toPath;
import org.opendaylight.yangtools.yang.common.Revision;
import org.opendaylight.yangtools.yang.common.RpcError;
import org.opendaylight.yangtools.yang.common.YangConstants;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.api.schema.AnyXmlNode;
import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
@VisibleForTesting
Set<ActionDefinition> getActions() {
- final Builder<ActionDefinition> builder = ImmutableSet.builder();
+ Builder<ActionDefinition> builder = ImmutableSet.builder();
for (DataSchemaNode dataSchemaNode : schemaContext.getChildNodes()) {
if (dataSchemaNode instanceof ActionNodeContainer) {
findAction(dataSchemaNode, builder);
// If the schema context for netconf device does not contain model for base netconf operations,
// use default pre build context with just the base model
// This way operations like lock/unlock are supported even if the source for base model was not provided
- final SchemaContext ctx = needToUseBaseCtx ? baseSchema.getSchemaContext() : schemaContext;
+ SchemaContext ctx = needToUseBaseCtx ? baseSchema.getSchemaContext() : schemaContext;
NetconfMessageTransformUtil.writeNormalizedRpc((ContainerNode) payload, result, rpcInput, ctx);
} catch (final XMLStreamException | IOException | IllegalStateException e) {
throw new IllegalStateException("Unable to serialize " + rpcInput, e);
final QName rpcQName = rpc.getLastComponent();
if (NetconfMessageTransformUtil.isDataRetrievalOperation(rpcQName)) {
final Element xmlData = NetconfMessageTransformUtil.getDataSubtree(message.getDocument());
- final AnyXmlNode anyXmlNode = Builders.anyXmlBuilder()
- .withNodeIdentifier(NetconfMessageTransformUtil.NETCONF_DATA_NODEID)
- .withValue(new DOMSource(xmlData)).build();
- normalizedNode = Builders.containerBuilder().withNodeIdentifier(
- new YangInstanceIdentifier.NodeIdentifier(NetconfMessageTransformUtil.NETCONF_RPC_REPLY_QNAME))
- .withChild(anyXmlNode).build();
+ final ContainerSchemaNode schemaForDataRead =
+ NetconfMessageTransformUtil.createSchemaForDataRead(schemaContext);
+ final ContainerNode dataNode;
+
+ try {
+ final NormalizedNodeResult resultHolder = new NormalizedNodeResult();
+ final NormalizedNodeStreamWriter writer = ImmutableNormalizedNodeStreamWriter.from(resultHolder);
+ final XmlParserStream xmlParser = XmlParserStream.create(writer, schemaContext, schemaForDataRead,
+ strictParsing);
+ xmlParser.traverse(new DOMSource(xmlData));
+ dataNode = (ContainerNode) resultHolder.getResult();
+ } catch (XMLStreamException | URISyntaxException | IOException | SAXException e) {
+ throw new IllegalArgumentException(String.format("Failed to parse data response %s", xmlData), e);
+ }
+
+ normalizedNode = Builders.containerBuilder()
+ .withNodeIdentifier(NETCONF_RPC_REPLY_NODEID)
+ .withChild(dataNode).build();
} else {
Map<QName, RpcDefinition> currentMappedRpcs = mappedRpcs;
}
}
Preconditions.checkNotNull(actionDefinition, "Action does not exist: %s", action);
- final ContainerNode normalizedNode = (ContainerNode) parseResult(message, actionDefinition);
+ ContainerNode normalizedNode = (ContainerNode) parseResult(message, actionDefinition);
if (normalizedNode == null) {
return new SimpleDOMActionResult(Collections.<RpcError>emptyList());
import org.opendaylight.netconf.notifications.NetconfNotification;
import org.opendaylight.netconf.sal.connect.util.MessageCounter;
import org.opendaylight.netconf.util.NetconfUtil;
-import org.opendaylight.netconf.util.NodeContainerProxy;
import org.opendaylight.netconf.util.messages.NetconfMessageUtil;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.edit.config.input.EditContent;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.CreateSubscriptionInput;
final Element actionData = prepareActionData(rootSchemaContextNode, actionNS,
domDataTreeIdentifier.getRootIdentifier().getPathArguments().iterator(), document);
- final Element specificActionElement = document.createElement(action);
+ Element specificActionElement = document.createElement(action);
actionData.appendChild(specificActionElement);
rpcNS.appendChild(actionNS);
document.appendChild(rpcNS);
if (iterator.hasNext()) {
final PathArgument next = iterator.next();
- final DataSchemaContextNode<?> current = currentParentSchemaNode.getChild(next);
+ DataSchemaContextNode<?> current = currentParentSchemaNode.getChild(next);
Preconditions.checkArgument(current != null, "Invalid input: schema for argument %s not found", next);
if (current.isMixin()) {
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
-package org.opendaylight.netconf.util;
+package org.opendaylight.netconf.sal.connect.netconf.util;
import com.google.common.base.Preconditions;
import com.google.common.collect.Maps;
TEST_NAMESPACE + "?module=" + TEST_MODULE + "2" + "&revision=" + TEST_REVISION;
private static final NetconfDeviceSchemasResolver STATE_SCHEMAS_RESOLVER =
- (deviceRpc, remoteSessionCapabilities, id, schemaContext) -> NetconfStateSchemas.EMPTY;
+ (deviceRpc, remoteSessionCapabilities, id) -> NetconfStateSchemas.EMPTY;
@Test
public void testNetconfDeviceFlawedModelFailedResolution() throws Exception {
}
}).when(schemaFactory).createSchemaContext(anyCollectionOf(SourceIdentifier.class));
- final NetconfDeviceSchemasResolver stateSchemasResolver = (deviceRpc, remoteSessionCapabilities, id,
- schemaContext) -> {
+ final NetconfDeviceSchemasResolver stateSchemasResolver = (deviceRpc, remoteSessionCapabilities, id) -> {
final Module first = Iterables.getFirst(schema.getModules(), null);
final QName qName = QName.create(first.getQNameModule(), first.getName());
final NetconfStateSchemas.RemoteYangSchema source1 = new NetconfStateSchemas.RemoteYangSchema(qName);
}
}).when(schemaFactory).createSchemaContext(anyCollectionOf(SourceIdentifier.class));
- final NetconfDeviceSchemasResolver stateSchemasResolver = (deviceRpc, remoteSessionCapabilities, id,
- schemaContext) -> {
+ final NetconfDeviceSchemasResolver stateSchemasResolver = (deviceRpc, remoteSessionCapabilities, id) -> {
final Module first = Iterables.getFirst(schema.getModules(), null);
final QName qName = QName.create(first.getQNameModule(), first.getName());
final NetconfStateSchemas.RemoteYangSchema source1 = new NetconfStateSchemas.RemoteYangSchema(qName);
import java.util.concurrent.TimeUnit;
import org.junit.Assert;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@Mock
private DOMRpcService rpc;
- private SchemaContext schemaContext;
-
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
- schemaContext = BaseSchema.BASE_NETCONF_CTX_WITH_NOTIFICATIONS.getSchemaContext();
+ final SchemaContext schemaContext = BaseSchema.BASE_NETCONF_CTX_WITH_NOTIFICATIONS.getSchemaContext();
final DataSchemaNode schemasNode =
((ContainerSchemaNode) schemaContext
.getDataChildByName(NetconfState.QNAME)).getDataChildByName(Schemas.QNAME);
hasItem(QName.create("urn:TBD:params:xml:ns:yang:network-topology", "2013-07-12", "network-topology")));
}
- @Ignore
@Test
public void testCreate2() throws Exception {
final ContainerNode netconfState = Builders.containerBuilder()
.withChild(data)
.build();
when(rpc.invokeRpc(eq(toPath(NETCONF_GET_QNAME)), any()))
- .thenReturn(immediateFluentFuture(new DefaultDOMRpcResult(rpcReply)));
- final NetconfStateSchemas stateSchemas = NetconfStateSchemas.create(rpc, CAPS, deviceId, schemaContext);
+ .thenReturn(immediateFluentFuture(new DefaultDOMRpcResult(rpcReply)));
+ final NetconfStateSchemas stateSchemas = NetconfStateSchemas.create(rpc, CAPS, deviceId);
final Set<QName> availableYangSchemasQNames = stateSchemas.getAvailableYangSchemasQNames();
assertEquals(numberOfLegalSchemas, availableYangSchemasQNames.size());
@Test
public void testCreateMonitoringNotSupported() throws Exception {
final NetconfSessionPreferences caps = NetconfSessionPreferences.fromStrings(Collections.emptySet());
- final NetconfStateSchemas stateSchemas = NetconfStateSchemas.create(rpc, caps, deviceId, schemaContext);
+ final NetconfStateSchemas stateSchemas = NetconfStateSchemas.create(rpc, caps, deviceId);
final Set<QName> availableYangSchemasQNames = stateSchemas.getAvailableYangSchemasQNames();
Assert.assertTrue(availableYangSchemasQNames.isEmpty());
}
@Test
public void testCreateFail() throws Exception {
when(rpc.invokeRpc(eq(toPath(NETCONF_GET_QNAME)), any())).thenReturn(
- immediateFailedFluentFuture(new DOMRpcImplementationNotAvailableException("not available")));
- final NetconfStateSchemas stateSchemas = NetconfStateSchemas.create(rpc, CAPS, deviceId, schemaContext);
+ immediateFailedFluentFuture(new DOMRpcImplementationNotAvailableException("not available")));
+ final NetconfStateSchemas stateSchemas = NetconfStateSchemas.create(rpc, CAPS, deviceId);
final Set<QName> availableYangSchemasQNames = stateSchemas.getAvailableYangSchemasQNames();
Assert.assertTrue(availableYangSchemasQNames.isEmpty());
}
public void testCreateRpcError() throws Exception {
final RpcError rpcError = RpcResultBuilder.newError(RpcError.ErrorType.RPC, "fail", "fail");
when(rpc.invokeRpc(eq(toPath(NETCONF_GET_QNAME)), any()))
- .thenReturn(immediateFluentFuture(new DefaultDOMRpcResult(rpcError)));
- final NetconfStateSchemas stateSchemas = NetconfStateSchemas.create(rpc, CAPS, deviceId, schemaContext);
+ .thenReturn(immediateFluentFuture(new DefaultDOMRpcResult(rpcError)));
+ final NetconfStateSchemas stateSchemas = NetconfStateSchemas.create(rpc, CAPS, deviceId);
final Set<QName> availableYangSchemasQNames = stateSchemas.getAvailableYangSchemasQNames();
Assert.assertTrue(availableYangSchemasQNames.isEmpty());
}
try {
when(interruptedFuture.get()).thenThrow(new InterruptedException("interrupted"));
when(rpc.invokeRpc(eq(toPath(NETCONF_GET_QNAME)), any())).thenReturn(
- FluentFuture.from(interruptedFuture));
- NetconfStateSchemas.create(rpc, CAPS, deviceId, schemaContext);
+ FluentFuture.from(interruptedFuture));
+ NetconfStateSchemas.create(rpc, CAPS, deviceId);
} catch (final InterruptedException | ExecutionException e) {
LOG.info("Operation failed.", e);
}
*/
package org.opendaylight.netconf.sal.connect.netconf.sal;
-import static org.junit.Assert.assertNotNull;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.verify;
import org.opendaylight.netconf.api.xml.XmlUtil;
import org.opendaylight.netconf.sal.connect.api.RemoteDeviceCommunicator;
import org.opendaylight.netconf.sal.connect.netconf.schema.mapping.NetconfMessageTransformer;
-import org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.$YangModuleInfoImpl;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.common.RpcResult;
import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
-import org.opendaylight.yangtools.yang.data.api.schema.AnyXmlNode;
import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
-import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.opendaylight.yangtools.yang.model.api.SchemaPath;
-import org.w3c.dom.Node;
public class NetconfDeviceRpcTest {
public void testInvokeRpc() throws Exception {
NormalizedNode<?, ?> input = createNode("urn:ietf:params:xml:ns:netconf:base:1.0", "2011-06-01", "filter");
final DOMRpcResult result = rpc.invokeRpc(path, input).get();
- Assert.assertEquals(expectedReply.getResult().getIdentifier(), result.getResult().getIdentifier());
- Assert.assertEquals(resolveNode(expectedReply), resolveNode(result));
- }
-
- private Node resolveNode(final DOMRpcResult result) {
- DataContainerChild<? extends PathArgument, ?> value = ((ContainerNode) result.getResult())
- .getChild(NodeIdentifier.create(NetconfMessageTransformUtil.NETCONF_DATA_QNAME)).get();
- Node node = ((AnyXmlNode)value).getValue().getNode();
- assertNotNull(node);
- return node;
+ Assert.assertEquals(expectedReply, result);
}
@Test
import org.opendaylight.netconf.sal.connect.netconf.schema.NetconfRemoteSchemaYangSourceProvider;
import org.opendaylight.netconf.sal.connect.netconf.util.NetconfBaseOps;
import org.opendaylight.netconf.sal.connect.netconf.util.NetconfMessageTransformUtil;
-import org.opendaylight.netconf.util.NetconfUtil;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.$YangModuleInfoImpl;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.NetconfState;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.Capabilities;
import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
-import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafNodeBuilder;
import org.opendaylight.yangtools.yang.model.api.ActionDefinition;
final MapEntryNode schemaNode =
Builders.mapEntryBuilder().withNodeIdentifier(identifierWithPredicates).withValue(values).build();
- final AnyXmlNode data = (AnyXmlNode) ((ContainerNode) compositeNodeRpcResult
+ final ContainerNode data = (ContainerNode) ((ContainerNode) compositeNodeRpcResult
.getResult()).getChild(toId(NETCONF_DATA_QNAME)).get();
-
- NormalizedNodeResult nodeResult =
- NetconfUtil.transformDOMSourceToNormalizedNode(schema, data.getValue());
- ContainerNode result = (ContainerNode) nodeResult.getResult();
- final ContainerNode state = (ContainerNode) result.getChild(toId(NetconfState.QNAME)).get();
+ final ContainerNode state = (ContainerNode) data.getChild(toId(NetconfState.QNAME)).get();
final ContainerNode schemas = (ContainerNode) state.getChild(toId(Schemas.QNAME)).get();
final MapNode schemaParent = (MapNode) schemas.getChild(toId(Schema.QNAME)).get();
assertEquals(1, Iterables.size(schemaParent.getValue()));
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import org.opendaylight.netconf.util.NodeContainerProxy;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
proxy.getStatus();
}
-}
+}
\ No newline at end of file
<groupId>org.opendaylight.netconf</groupId>
<artifactId>ietf-restconf</artifactId>
</dependency>
- <dependency>
- <groupId>org.opendaylight.netconf</groupId>
- <artifactId>netconf-util</artifactId>
- </dependency>
<dependency>
<groupId>net.java.dev.stax-utils</groupId>
<artifactId>stax-utils</artifactId>
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.net.URI;
-import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
import java.util.Map.Entry;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyWriter;
import javax.ws.rs.ext.Provider;
-import javax.xml.stream.XMLStreamException;
import org.opendaylight.netconf.sal.rest.api.Draft02;
import org.opendaylight.netconf.sal.rest.api.RestconfNormalizedNodeWriter;
import org.opendaylight.netconf.sal.rest.api.RestconfService;
-import org.opendaylight.netconf.util.NetconfUtil;
import org.opendaylight.restconf.common.context.InstanceIdentifierContext;
import org.opendaylight.restconf.common.context.NormalizedNodeContext;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
-import org.opendaylight.yangtools.yang.data.api.schema.AnyXmlNode;
import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.opendaylight.yangtools.yang.model.api.SchemaNode;
import org.opendaylight.yangtools.yang.model.api.SchemaPath;
-import org.xml.sax.SAXException;
/**
* Normalized node writer for JSON.
httpHeaders.add(entry.getKey(), entry.getValue());
}
}
- NormalizedNode<?, ?> data = context.getData();
+ final NormalizedNode<?, ?> data = context.getData();
if (data == null) {
return;
}
* which is not visible in restconf
*/
nnWriter = createNormalizedNodeWriter(context,path,jsonWriter, depth);
- if (data instanceof ContainerNode) {
- writeChildren(nnWriter,(ContainerNode) data);
- } else if (data instanceof AnyXmlNode) {
- try {
- writeChildren(nnWriter,
- (ContainerNode) NetconfUtil.transformDOMSourceToNormalizedNode(
- context.getSchemaContext(), ((AnyXmlNode)data).getValue()).getResult());
- } catch (XMLStreamException | URISyntaxException | SAXException e) {
- throw new RuntimeException(e);
- }
- }
+ writeChildren(nnWriter,(ContainerNode) data);
} else if (context.getSchemaNode() instanceof RpcDefinition) {
/*
* RpcDefinition is not supported as initial codec in JSONStreamWriter,
@Override
public boolean isPresenceContainer() {
- return false;
+ throw new UnsupportedOperationException("Not supported.");
}
@Override
@Override
public YangVersion getYangVersion() {
- return YangVersion.VERSION_1_1;
+ throw new UnsupportedOperationException("Not supported operations.");
}
@Override
@Override
public Set<FeatureDefinition> getFeatures() {
- return ImmutableSet.of();
+ throw new UnsupportedOperationException("Not supported operations.");
}
@Override
public Set<NotificationDefinition> getNotifications() {
- return ImmutableSet.of();
+ throw new UnsupportedOperationException("Not supported operations.");
}
@Override
public Set<AugmentationSchemaNode> getAugmentations() {
- return ImmutableSet.of();
+ throw new UnsupportedOperationException("Not supported operations.");
}
@Override
public Set<RpcDefinition> getRpcs() {
- return ImmutableSet.of();
+ throw new UnsupportedOperationException("Not supported operations.");
}
@Override
public Set<Deviation> getDeviations() {
- return ImmutableSet.of();
+ throw new UnsupportedOperationException("Not supported operations.");
}
@Override
public Set<IdentitySchemaNode> getIdentities() {
- return ImmutableSet.of();
+ throw new UnsupportedOperationException("Not supported operations.");
}
@Override
public List<ExtensionDefinition> getExtensionSchemaNodes() {
- return ImmutableList.of();
+ throw new UnsupportedOperationException("Not supported operations.");
}
@Override
public List<UnknownSchemaNode> getUnknownSchemaNodes() {
- return ImmutableList.of();
+ throw new UnsupportedOperationException("Not supported operations.");
}
@Override
import org.opendaylight.restconf.common.validation.RestconfValidationUtils;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime;
import org.opendaylight.yang.gen.v1.urn.sal.restconf.event.subscription.rev140708.NotificationOutputTypeGrouping.NotificationOutputType;
-import org.opendaylight.yangtools.yang.common.Empty;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.common.QNameModule;
import org.opendaylight.yangtools.yang.common.Revision;
Builders.containerBuilder(fakeCont);
for (final LeafSchemaNode leaf : fakeRpcSchema) {
- containerBuilder.withChild(Builders.leafBuilder(leaf).withValue(Empty.getInstance()).build());
+ containerBuilder.withChild(Builders.leafBuilder(leaf).build());
}
final Collection<Module> fakeModules = new ArrayList<>(neededModules.size() + 1);