import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
+import static org.opendaylight.controller.sal.connect.netconf.util.NetconfMessageTransformUtil.toId;
+import static org.opendaylight.controller.sal.connect.netconf.util.NetconfMessageTransformUtil.toPath;
+import com.google.common.collect.Sets;
import java.io.InputStream;
import java.util.Collections;
import java.util.List;
import java.util.Set;
-
import org.junit.BeforeClass;
import org.junit.Test;
import org.opendaylight.controller.netconf.api.NetconfMessage;
+import org.opendaylight.controller.netconf.util.xml.XmlUtil;
import org.opendaylight.controller.sal.connect.netconf.schema.mapping.NetconfMessageTransformer;
-import org.opendaylight.controller.sal.connect.netconf.util.NetconfMessageTransformUtil;
import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.data.api.CompositeNode;
-import org.opendaylight.yangtools.yang.data.impl.ImmutableCompositeNode;
-import org.opendaylight.yangtools.yang.data.impl.util.CompositeNodeBuilder;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
+import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder;
import org.opendaylight.yangtools.yang.model.api.Module;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.opendaylight.yangtools.yang.model.parser.api.YangContextParser;
private final static QName GET_QNAME = QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "get");
private final static QName GET_CONFIG_QNAME = QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "get-config");
- static SchemaContext notifCtx;
static SchemaContext cfgCtx;
static NetconfMessageTransformer messageTransformer;
final Set<Module> notifModules = parser.parseYangModelsFromStreams(modelsToParse);
assertTrue(!notifModules.isEmpty());
- notifCtx = parser.resolveSchemaContext(notifModules);
- assertNotNull(notifCtx);
-
modelsToParse = Collections
.singletonList(NetconfToRpcRequestTest.class.getResourceAsStream("/schemas/config-test-rpc.yang"));
parser = new YangParserImpl();
final Set<Module> configModules = parser.parseYangModelsFromStreams(modelsToParse);
- cfgCtx = parser.resolveSchemaContext(configModules);
+ cfgCtx = parser.resolveSchemaContext(Sets.union(configModules, notifModules));
assertNotNull(cfgCtx);
- messageTransformer = new NetconfMessageTransformer();
- }
-
- @Test
- public void testIsDataEditOperation() throws Exception {
- messageTransformer.onGlobalContextUpdated(cfgCtx);
-
- final CompositeNodeBuilder<ImmutableCompositeNode> rootBuilder = ImmutableCompositeNode.builder();
- rootBuilder.setQName(EDIT_CONFIG_QNAME);
-
- final CompositeNodeBuilder<ImmutableCompositeNode> inputBuilder = ImmutableCompositeNode.builder();
- inputBuilder.setQName(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "input"));
-
- final CompositeNodeBuilder<ImmutableCompositeNode> targetBuilder = ImmutableCompositeNode.builder();
- targetBuilder.setQName(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "target"));
- targetBuilder.addLeaf(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "running"), null);
-
- final CompositeNodeBuilder<ImmutableCompositeNode> configBuilder = ImmutableCompositeNode.builder();
- configBuilder.setQName(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "config"));
-
- final CompositeNodeBuilder<ImmutableCompositeNode> anyxmlTopBuilder = ImmutableCompositeNode.builder();
- anyxmlTopBuilder.setQName(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "top"));
-
- final CompositeNodeBuilder<ImmutableCompositeNode> anyxmlInterfBuilder = ImmutableCompositeNode.builder();
- anyxmlInterfBuilder.setQName(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "interface"));
-
- anyxmlInterfBuilder.addLeaf(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "name"), "Ethernet0/0");
- anyxmlInterfBuilder.addLeaf(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "mtu"), "1500");
-
- anyxmlTopBuilder.add(anyxmlInterfBuilder.toInstance());
- configBuilder.add(anyxmlTopBuilder.toInstance());
-
- inputBuilder.add(targetBuilder.toInstance());
- inputBuilder.add(configBuilder.toInstance());
-
- rootBuilder.add(inputBuilder.toInstance());
- final ImmutableCompositeNode root = rootBuilder.toInstance();
-
- final NetconfMessage message = messageTransformer.toRpcRequest(EDIT_CONFIG_QNAME, root);
- assertNotNull(message);
-
- final Document xmlDoc = message.getDocument();
- org.w3c.dom.Node rpcChild = xmlDoc.getFirstChild();
- assertEquals(rpcChild.getLocalName(), "rpc");
-
- final org.w3c.dom.Node editConfigNode = rpcChild.getFirstChild();
- assertEquals(editConfigNode.getLocalName(), "edit-config");
-
- final org.w3c.dom.Node targetNode = editConfigNode.getFirstChild();
- assertEquals(targetNode.getLocalName(), "target");
-
- final org.w3c.dom.Node runningNode = targetNode.getFirstChild();
- assertEquals(runningNode.getLocalName(), "running");
-
- final org.w3c.dom.Node configNode = targetNode.getNextSibling();
- assertEquals(configNode.getLocalName(), "config");
-
- final org.w3c.dom.Node topNode = configNode.getFirstChild();
- assertEquals(topNode.getLocalName(), "top");
-
- final org.w3c.dom.Node interfaceNode = topNode.getFirstChild();
- assertEquals(interfaceNode.getLocalName(), "interface");
-
- final org.w3c.dom.Node nameNode = interfaceNode.getFirstChild();
- assertEquals(nameNode.getLocalName(), "name");
-
- final org.w3c.dom.Node mtuNode = nameNode.getNextSibling();
- assertEquals(mtuNode.getLocalName(), "mtu");
- }
-
- @Test
- public void testIsGetOperation() throws Exception {
- messageTransformer.onGlobalContextUpdated(cfgCtx);
-
- final CompositeNodeBuilder<ImmutableCompositeNode> rootBuilder = ImmutableCompositeNode.builder();
- rootBuilder.setQName(GET_QNAME);
-
- final CompositeNodeBuilder<ImmutableCompositeNode> inputBuilder = ImmutableCompositeNode.builder();
- inputBuilder.setQName(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "input"));
-
- rootBuilder.add(inputBuilder.toInstance());
- final ImmutableCompositeNode root = rootBuilder.toInstance();
-
- final NetconfMessage message = messageTransformer.toRpcRequest(GET_QNAME, root);
- assertNotNull(message);
-
- final Document xmlDoc = message.getDocument();
- final org.w3c.dom.Node rpcChild = xmlDoc.getFirstChild();
- assertEquals(rpcChild.getLocalName(), "rpc");
-
- final org.w3c.dom.Node get = rpcChild.getFirstChild();
- assertEquals(get.getLocalName(), "get");
+ messageTransformer = new NetconfMessageTransformer(cfgCtx, true);
}
- @Test
- public void testIsGetConfigOperation() throws Exception {
- messageTransformer.onGlobalContextUpdated(cfgCtx);
-
- final CompositeNodeBuilder<ImmutableCompositeNode> rootBuilder = ImmutableCompositeNode.builder();
- rootBuilder.setQName(GET_CONFIG_QNAME);
-
- final CompositeNodeBuilder<ImmutableCompositeNode> inputBuilder = ImmutableCompositeNode.builder();
- inputBuilder.setQName(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "input"));
-
- final CompositeNodeBuilder<ImmutableCompositeNode> sourceBuilder = ImmutableCompositeNode.builder();
- sourceBuilder.setQName(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "source"));
- sourceBuilder.addLeaf(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "running"), null);
-
- final CompositeNodeBuilder<ImmutableCompositeNode> anyxmlFilterBuilder = ImmutableCompositeNode.builder();
- anyxmlFilterBuilder.setQName(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "filter"));
-
- final CompositeNodeBuilder<ImmutableCompositeNode> anyxmlTopBuilder = ImmutableCompositeNode.builder();
- anyxmlTopBuilder.setQName(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "top"));
- anyxmlTopBuilder.addLeaf(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "users"), null);
-
- anyxmlFilterBuilder.add(anyxmlTopBuilder.toInstance());
-
- inputBuilder.add(sourceBuilder.toInstance());
- inputBuilder.add(anyxmlFilterBuilder.toInstance());
- rootBuilder.add(inputBuilder.toInstance());
- final ImmutableCompositeNode root = rootBuilder.toInstance();
-
- final NetconfMessage message = messageTransformer.toRpcRequest(GET_CONFIG_QNAME, root);
- assertNotNull(message);
-
- final Document xmlDoc = message.getDocument();
- final org.w3c.dom.Node rpcChild = xmlDoc.getFirstChild();
- assertEquals(rpcChild.getLocalName(), "rpc");
-
- final org.w3c.dom.Node getConfig = rpcChild.getFirstChild();
- assertEquals(getConfig.getLocalName(), "get-config");
-
- final org.w3c.dom.Node sourceNode = getConfig.getFirstChild();
- assertEquals(sourceNode.getLocalName(), "source");
-
- final org.w3c.dom.Node runningNode = sourceNode.getFirstChild();
- assertEquals(runningNode.getLocalName(), "running");
-
- final org.w3c.dom.Node filterNode = sourceNode.getNextSibling();
- assertEquals(filterNode.getLocalName(), "filter");
-
- final org.w3c.dom.Node topNode = filterNode.getFirstChild();
- assertEquals(topNode.getLocalName(), "top");
-
- final org.w3c.dom.Node usersNode = topNode.getFirstChild();
- assertEquals(usersNode.getLocalName(), "users");
+ private LeafNode<Object> buildLeaf(final QName running, final Object value) {
+ return Builders.leafBuilder().withNodeIdentifier(toId(running)).withValue(value).build();
}
@Test
public void testUserDefinedRpcCall() throws Exception {
- messageTransformer.onGlobalContextUpdated(notifCtx);
-
- final CompositeNodeBuilder<ImmutableCompositeNode> rootBuilder = ImmutableCompositeNode.builder();
- rootBuilder.setQName(SUBSCRIBE_RPC_NAME);
-
- final CompositeNodeBuilder<ImmutableCompositeNode> inputBuilder = ImmutableCompositeNode.builder();
- inputBuilder.setQName(INPUT_QNAME);
- inputBuilder.addLeaf(STREAM_NAME, "NETCONF");
-
- rootBuilder.add(inputBuilder.toInstance());
- final ImmutableCompositeNode root = rootBuilder.toInstance();
+ final DataContainerNodeAttrBuilder<YangInstanceIdentifier.NodeIdentifier, ContainerNode> rootBuilder = Builders.containerBuilder();
+ rootBuilder.withNodeIdentifier(toId(SUBSCRIBE_RPC_NAME));
- final CompositeNode flattenedNode = NetconfMessageTransformUtil.flattenInput(root);
- assertNotNull(flattenedNode);
- assertEquals(1, flattenedNode.size());
+ rootBuilder.withChild(buildLeaf(STREAM_NAME, "NETCONF"));
+ final ContainerNode root = rootBuilder.build();
- final List<CompositeNode> inputNode = flattenedNode.getCompositesByName(INPUT_QNAME);
- assertNotNull(inputNode);
- assertTrue(inputNode.isEmpty());
-
- final NetconfMessage message = messageTransformer.toRpcRequest(SUBSCRIBE_RPC_NAME, root);
+ final NetconfMessage message = messageTransformer.toRpcRequest(toPath(SUBSCRIBE_RPC_NAME), root);
assertNotNull(message);
final Document xmlDoc = message.getDocument();
final org.w3c.dom.Node streamName = subscribeName.getFirstChild();
assertEquals(streamName.getLocalName(), "stream-name");
+
+ }
+
+ // The edit config defined in yang has no output
+ @Test(expected = IllegalArgumentException.class)
+ public void testRpcResponse() throws Exception {
+ final NetconfMessage response = new NetconfMessage(XmlUtil.readXmlToDocument(
+ "<rpc-reply xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"m-5\">\n" +
+ "<data xmlns=\"urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring\">" +
+ "module schema" +
+ "</data>\n" +
+ "</rpc-reply>\n"
+ ));
+
+ messageTransformer.toRpcResult(response, toPath(EDIT_CONFIG_QNAME));
}
}