1 package org.opendaylight.controller.sal.connect.netconf;
3 import static org.junit.Assert.assertEquals;
4 import static org.junit.Assert.assertNotNull;
5 import static org.junit.Assert.assertTrue;
7 import java.io.InputStream;
8 import java.util.Collections;
11 import org.junit.BeforeClass;
12 import org.junit.Test;
13 import org.opendaylight.controller.netconf.api.NetconfMessage;
14 import org.opendaylight.controller.netconf.util.xml.XmlUtil;
15 import org.opendaylight.controller.sal.connect.netconf.schema.mapping.NetconfMessageTransformer;
16 import org.opendaylight.controller.sal.connect.netconf.util.NetconfMessageTransformUtil;
17 import org.opendaylight.yangtools.yang.common.QName;
18 import org.opendaylight.yangtools.yang.common.RpcResult;
19 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
20 import org.opendaylight.yangtools.yang.data.api.Node;
21 import org.opendaylight.yangtools.yang.data.impl.ImmutableCompositeNode;
22 import org.opendaylight.yangtools.yang.data.impl.util.CompositeNodeBuilder;
23 import org.opendaylight.yangtools.yang.model.api.Module;
24 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
25 import org.opendaylight.yangtools.yang.model.parser.api.YangContextParser;
26 import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl;
27 import org.w3c.dom.Document;
31 * Test case for reported bug 1355
33 * @author Lukas Sedlak
35 * https://bugs.opendaylight.org/show_bug.cgi?id=1355</a>
37 public class NetconfToRpcRequestTest {
39 private final static String TEST_MODEL_NAMESPACE = "urn:opendaylight:params:xml:ns:yang:controller:md:sal:rpc-test";
40 private final static String REVISION = "2014-07-14";
41 private final static QName INPUT_QNAME = QName.create(TEST_MODEL_NAMESPACE, REVISION, "input");
42 private final static QName STREAM_NAME = QName.create(TEST_MODEL_NAMESPACE, REVISION, "stream-name");
43 private final static QName SUBSCRIBE_RPC_NAME = QName.create(TEST_MODEL_NAMESPACE, REVISION, "subscribe");
45 private final static String CONFIG_TEST_NAMESPACE = "urn:opendaylight:params:xml:ns:yang:controller:md:sal:test:rpc:config:defs";
46 private final static String CONFIG_TEST_REVISION = "2014-07-21";
47 private final static QName EDIT_CONFIG_QNAME = QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "edit-config");
48 private final static QName GET_QNAME = QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "get");
49 private final static QName GET_CONFIG_QNAME = QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "get-config");
51 static SchemaContext notifCtx;
52 static SchemaContext cfgCtx;
53 static NetconfMessageTransformer messageTransformer;
55 @SuppressWarnings("deprecation")
57 public static void setup() throws Exception {
58 List<InputStream> modelsToParse = Collections
59 .singletonList(NetconfToRpcRequestTest.class.getResourceAsStream("/schemas/rpc-notification-subscription.yang"));
60 YangContextParser parser = new YangParserImpl();
61 final Set<Module> notifModules = parser.parseYangModelsFromStreams(modelsToParse);
62 assertTrue(!notifModules.isEmpty());
64 notifCtx = parser.resolveSchemaContext(notifModules);
65 assertNotNull(notifCtx);
67 modelsToParse = Collections
68 .singletonList(NetconfToRpcRequestTest.class.getResourceAsStream("/schemas/config-test-rpc.yang"));
69 parser = new YangParserImpl();
70 final Set<Module> configModules = parser.parseYangModelsFromStreams(modelsToParse);
71 cfgCtx = parser.resolveSchemaContext(configModules);
72 assertNotNull(cfgCtx);
74 messageTransformer = new NetconfMessageTransformer();
78 public void testIsDataEditOperation() throws Exception {
79 messageTransformer.onGlobalContextUpdated(cfgCtx);
81 final CompositeNodeBuilder<ImmutableCompositeNode> rootBuilder = ImmutableCompositeNode.builder();
82 rootBuilder.setQName(EDIT_CONFIG_QNAME);
84 final CompositeNodeBuilder<ImmutableCompositeNode> inputBuilder = ImmutableCompositeNode.builder();
85 inputBuilder.setQName(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "input"));
87 final CompositeNodeBuilder<ImmutableCompositeNode> targetBuilder = ImmutableCompositeNode.builder();
88 targetBuilder.setQName(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "target"));
89 targetBuilder.addLeaf(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "running"), null);
91 final CompositeNodeBuilder<ImmutableCompositeNode> configBuilder = ImmutableCompositeNode.builder();
92 configBuilder.setQName(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "config"));
94 final CompositeNodeBuilder<ImmutableCompositeNode> anyxmlTopBuilder = ImmutableCompositeNode.builder();
95 anyxmlTopBuilder.setQName(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "top"));
97 final CompositeNodeBuilder<ImmutableCompositeNode> anyxmlInterfBuilder = ImmutableCompositeNode.builder();
98 anyxmlInterfBuilder.setQName(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "interface"));
100 anyxmlInterfBuilder.addLeaf(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "name"), "Ethernet0/0");
101 anyxmlInterfBuilder.addLeaf(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "mtu"), "1500");
103 anyxmlTopBuilder.add(anyxmlInterfBuilder.toInstance());
104 configBuilder.add(anyxmlTopBuilder.toInstance());
106 inputBuilder.add(targetBuilder.toInstance());
107 inputBuilder.add(configBuilder.toInstance());
109 rootBuilder.add(inputBuilder.toInstance());
110 final ImmutableCompositeNode root = rootBuilder.toInstance();
112 final NetconfMessage message = messageTransformer.toRpcRequest(EDIT_CONFIG_QNAME, root);
113 assertNotNull(message);
115 final Document xmlDoc = message.getDocument();
116 org.w3c.dom.Node rpcChild = xmlDoc.getFirstChild();
117 assertEquals(rpcChild.getLocalName(), "rpc");
119 final org.w3c.dom.Node editConfigNode = rpcChild.getFirstChild();
120 assertEquals(editConfigNode.getLocalName(), "edit-config");
122 final org.w3c.dom.Node targetNode = editConfigNode.getFirstChild();
123 assertEquals(targetNode.getLocalName(), "target");
125 final org.w3c.dom.Node runningNode = targetNode.getFirstChild();
126 assertEquals(runningNode.getLocalName(), "running");
128 final org.w3c.dom.Node configNode = targetNode.getNextSibling();
129 assertEquals(configNode.getLocalName(), "config");
131 final org.w3c.dom.Node topNode = configNode.getFirstChild();
132 assertEquals(topNode.getLocalName(), "top");
134 final org.w3c.dom.Node interfaceNode = topNode.getFirstChild();
135 assertEquals(interfaceNode.getLocalName(), "interface");
137 final org.w3c.dom.Node nameNode = interfaceNode.getFirstChild();
138 assertEquals(nameNode.getLocalName(), "name");
140 final org.w3c.dom.Node mtuNode = nameNode.getNextSibling();
141 assertEquals(mtuNode.getLocalName(), "mtu");
145 public void testIsGetOperation() throws Exception {
146 messageTransformer.onGlobalContextUpdated(cfgCtx);
148 final CompositeNodeBuilder<ImmutableCompositeNode> rootBuilder = ImmutableCompositeNode.builder();
149 rootBuilder.setQName(GET_QNAME);
151 final CompositeNodeBuilder<ImmutableCompositeNode> inputBuilder = ImmutableCompositeNode.builder();
152 inputBuilder.setQName(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "input"));
154 rootBuilder.add(inputBuilder.toInstance());
155 final ImmutableCompositeNode root = rootBuilder.toInstance();
157 final NetconfMessage message = messageTransformer.toRpcRequest(GET_QNAME, root);
158 assertNotNull(message);
160 final Document xmlDoc = message.getDocument();
161 final org.w3c.dom.Node rpcChild = xmlDoc.getFirstChild();
162 assertEquals(rpcChild.getLocalName(), "rpc");
164 final org.w3c.dom.Node get = rpcChild.getFirstChild();
165 assertEquals(get.getLocalName(), "get");
169 public void testIsGetConfigOperation() throws Exception {
170 messageTransformer.onGlobalContextUpdated(cfgCtx);
172 final CompositeNodeBuilder<ImmutableCompositeNode> rootBuilder = ImmutableCompositeNode.builder();
173 rootBuilder.setQName(GET_CONFIG_QNAME);
175 final CompositeNodeBuilder<ImmutableCompositeNode> inputBuilder = ImmutableCompositeNode.builder();
176 inputBuilder.setQName(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "input"));
178 final CompositeNodeBuilder<ImmutableCompositeNode> sourceBuilder = ImmutableCompositeNode.builder();
179 sourceBuilder.setQName(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "source"));
180 sourceBuilder.addLeaf(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "running"), null);
182 final CompositeNodeBuilder<ImmutableCompositeNode> anyxmlFilterBuilder = ImmutableCompositeNode.builder();
183 anyxmlFilterBuilder.setQName(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "filter"));
185 final CompositeNodeBuilder<ImmutableCompositeNode> anyxmlTopBuilder = ImmutableCompositeNode.builder();
186 anyxmlTopBuilder.setQName(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "top"));
187 anyxmlTopBuilder.addLeaf(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "users"), null);
189 anyxmlFilterBuilder.add(anyxmlTopBuilder.toInstance());
191 inputBuilder.add(sourceBuilder.toInstance());
192 inputBuilder.add(anyxmlFilterBuilder.toInstance());
193 rootBuilder.add(inputBuilder.toInstance());
194 final ImmutableCompositeNode root = rootBuilder.toInstance();
196 final NetconfMessage message = messageTransformer.toRpcRequest(GET_CONFIG_QNAME, root);
197 assertNotNull(message);
199 final Document xmlDoc = message.getDocument();
200 final org.w3c.dom.Node rpcChild = xmlDoc.getFirstChild();
201 assertEquals(rpcChild.getLocalName(), "rpc");
203 final org.w3c.dom.Node getConfig = rpcChild.getFirstChild();
204 assertEquals(getConfig.getLocalName(), "get-config");
206 final org.w3c.dom.Node sourceNode = getConfig.getFirstChild();
207 assertEquals(sourceNode.getLocalName(), "source");
209 final org.w3c.dom.Node runningNode = sourceNode.getFirstChild();
210 assertEquals(runningNode.getLocalName(), "running");
212 final org.w3c.dom.Node filterNode = sourceNode.getNextSibling();
213 assertEquals(filterNode.getLocalName(), "filter");
215 final org.w3c.dom.Node topNode = filterNode.getFirstChild();
216 assertEquals(topNode.getLocalName(), "top");
218 final org.w3c.dom.Node usersNode = topNode.getFirstChild();
219 assertEquals(usersNode.getLocalName(), "users");
223 public void testUserDefinedRpcCall() throws Exception {
224 messageTransformer.onGlobalContextUpdated(notifCtx);
226 final CompositeNodeBuilder<ImmutableCompositeNode> rootBuilder = ImmutableCompositeNode.builder();
227 rootBuilder.setQName(SUBSCRIBE_RPC_NAME);
229 final CompositeNodeBuilder<ImmutableCompositeNode> inputBuilder = ImmutableCompositeNode.builder();
230 inputBuilder.setQName(INPUT_QNAME);
231 inputBuilder.addLeaf(STREAM_NAME, "NETCONF");
233 rootBuilder.add(inputBuilder.toInstance());
234 final ImmutableCompositeNode root = rootBuilder.toInstance();
236 final CompositeNode flattenedNode = NetconfMessageTransformUtil.flattenInput(root);
237 assertNotNull(flattenedNode);
238 assertEquals(1, flattenedNode.size());
240 final List<CompositeNode> inputNode = flattenedNode.getCompositesByName(INPUT_QNAME);
241 assertNotNull(inputNode);
242 assertTrue(inputNode.isEmpty());
244 final NetconfMessage message = messageTransformer.toRpcRequest(SUBSCRIBE_RPC_NAME, root);
245 assertNotNull(message);
247 final Document xmlDoc = message.getDocument();
248 final org.w3c.dom.Node rpcChild = xmlDoc.getFirstChild();
249 assertEquals(rpcChild.getLocalName(), "rpc");
251 final org.w3c.dom.Node subscribeName = rpcChild.getFirstChild();
252 assertEquals(subscribeName.getLocalName(), "subscribe");
254 final org.w3c.dom.Node streamName = subscribeName.getFirstChild();
255 assertEquals(streamName.getLocalName(), "stream-name");
260 public void testRpcResponse() throws Exception {
261 final NetconfMessage response = new NetconfMessage(XmlUtil.readXmlToDocument(
262 "<rpc-reply xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"m-5\">\n" +
263 "<data xmlns=\"urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring\">" +
268 final RpcResult<CompositeNode> compositeNodeRpcResult = messageTransformer.toRpcResult(response, SUBSCRIBE_RPC_NAME);
269 final Node<?> dataNode = compositeNodeRpcResult.getResult().getValue().get(0);
270 assertEquals("module schema", dataNode.getValue());