Merge "Bug 1029: Remove dead code: samples/clustersession"
[controller.git] / opendaylight / md-sal / sal-netconf-connector / src / test / java / org / opendaylight / controller / sal / connect / netconf / NetconfToRpcRequestTest.java
1 package org.opendaylight.controller.sal.connect.netconf;
2
3 import static org.junit.Assert.assertEquals;
4 import static org.junit.Assert.assertNotNull;
5 import static org.junit.Assert.assertTrue;
6
7 import java.io.InputStream;
8 import java.util.Collections;
9 import java.util.List;
10 import java.util.Set;
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;
28
29
30 /**
31  * Test case for reported bug 1355
32  *
33  * @author Lukas Sedlak
34  * @see <a
35  *      https://bugs.opendaylight.org/show_bug.cgi?id=1355</a>
36  */
37 public class NetconfToRpcRequestTest {
38
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");
44
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");
50
51     static SchemaContext notifCtx;
52     static SchemaContext cfgCtx;
53     static NetconfMessageTransformer messageTransformer;
54
55     @SuppressWarnings("deprecation")
56     @BeforeClass
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());
63
64         notifCtx = parser.resolveSchemaContext(notifModules);
65         assertNotNull(notifCtx);
66
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);
73
74         messageTransformer = new NetconfMessageTransformer();
75     }
76
77     @Test
78     public void testIsDataEditOperation() throws Exception {
79         messageTransformer.onGlobalContextUpdated(cfgCtx);
80
81         final CompositeNodeBuilder<ImmutableCompositeNode> rootBuilder = ImmutableCompositeNode.builder();
82         rootBuilder.setQName(EDIT_CONFIG_QNAME);
83
84         final CompositeNodeBuilder<ImmutableCompositeNode> inputBuilder = ImmutableCompositeNode.builder();
85         inputBuilder.setQName(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "input"));
86
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);
90
91         final CompositeNodeBuilder<ImmutableCompositeNode> configBuilder = ImmutableCompositeNode.builder();
92         configBuilder.setQName(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "config"));
93
94         final CompositeNodeBuilder<ImmutableCompositeNode> anyxmlTopBuilder = ImmutableCompositeNode.builder();
95         anyxmlTopBuilder.setQName(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "top"));
96
97         final CompositeNodeBuilder<ImmutableCompositeNode> anyxmlInterfBuilder = ImmutableCompositeNode.builder();
98         anyxmlInterfBuilder.setQName(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "interface"));
99
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");
102
103         anyxmlTopBuilder.add(anyxmlInterfBuilder.toInstance());
104         configBuilder.add(anyxmlTopBuilder.toInstance());
105
106         inputBuilder.add(targetBuilder.toInstance());
107         inputBuilder.add(configBuilder.toInstance());
108
109         rootBuilder.add(inputBuilder.toInstance());
110         final ImmutableCompositeNode root = rootBuilder.toInstance();
111
112         final NetconfMessage message = messageTransformer.toRpcRequest(EDIT_CONFIG_QNAME, root);
113         assertNotNull(message);
114
115         final Document xmlDoc = message.getDocument();
116         org.w3c.dom.Node rpcChild = xmlDoc.getFirstChild();
117         assertEquals(rpcChild.getLocalName(), "rpc");
118
119         final org.w3c.dom.Node editConfigNode = rpcChild.getFirstChild();
120         assertEquals(editConfigNode.getLocalName(), "edit-config");
121
122         final org.w3c.dom.Node targetNode = editConfigNode.getFirstChild();
123         assertEquals(targetNode.getLocalName(), "target");
124
125         final org.w3c.dom.Node runningNode = targetNode.getFirstChild();
126         assertEquals(runningNode.getLocalName(), "running");
127
128         final org.w3c.dom.Node configNode = targetNode.getNextSibling();
129         assertEquals(configNode.getLocalName(), "config");
130
131         final org.w3c.dom.Node topNode = configNode.getFirstChild();
132         assertEquals(topNode.getLocalName(), "top");
133
134         final org.w3c.dom.Node interfaceNode = topNode.getFirstChild();
135         assertEquals(interfaceNode.getLocalName(), "interface");
136
137         final org.w3c.dom.Node nameNode = interfaceNode.getFirstChild();
138         assertEquals(nameNode.getLocalName(), "name");
139
140         final org.w3c.dom.Node mtuNode = nameNode.getNextSibling();
141         assertEquals(mtuNode.getLocalName(), "mtu");
142     }
143
144     @Test
145     public void testIsGetOperation() throws Exception {
146         messageTransformer.onGlobalContextUpdated(cfgCtx);
147
148         final CompositeNodeBuilder<ImmutableCompositeNode> rootBuilder = ImmutableCompositeNode.builder();
149         rootBuilder.setQName(GET_QNAME);
150
151         final CompositeNodeBuilder<ImmutableCompositeNode> inputBuilder = ImmutableCompositeNode.builder();
152         inputBuilder.setQName(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "input"));
153
154         rootBuilder.add(inputBuilder.toInstance());
155         final ImmutableCompositeNode root = rootBuilder.toInstance();
156
157         final NetconfMessage message = messageTransformer.toRpcRequest(GET_QNAME, root);
158         assertNotNull(message);
159
160         final Document xmlDoc = message.getDocument();
161         final org.w3c.dom.Node rpcChild = xmlDoc.getFirstChild();
162         assertEquals(rpcChild.getLocalName(), "rpc");
163
164         final org.w3c.dom.Node get = rpcChild.getFirstChild();
165         assertEquals(get.getLocalName(), "get");
166     }
167
168     @Test
169     public void testIsGetConfigOperation() throws Exception {
170         messageTransformer.onGlobalContextUpdated(cfgCtx);
171
172         final CompositeNodeBuilder<ImmutableCompositeNode> rootBuilder = ImmutableCompositeNode.builder();
173         rootBuilder.setQName(GET_CONFIG_QNAME);
174
175         final CompositeNodeBuilder<ImmutableCompositeNode> inputBuilder = ImmutableCompositeNode.builder();
176         inputBuilder.setQName(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "input"));
177
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);
181
182         final CompositeNodeBuilder<ImmutableCompositeNode> anyxmlFilterBuilder = ImmutableCompositeNode.builder();
183         anyxmlFilterBuilder.setQName(QName.create(CONFIG_TEST_NAMESPACE, CONFIG_TEST_REVISION, "filter"));
184
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);
188
189         anyxmlFilterBuilder.add(anyxmlTopBuilder.toInstance());
190
191         inputBuilder.add(sourceBuilder.toInstance());
192         inputBuilder.add(anyxmlFilterBuilder.toInstance());
193         rootBuilder.add(inputBuilder.toInstance());
194         final ImmutableCompositeNode root = rootBuilder.toInstance();
195
196         final NetconfMessage message = messageTransformer.toRpcRequest(GET_CONFIG_QNAME, root);
197         assertNotNull(message);
198
199         final Document xmlDoc = message.getDocument();
200         final org.w3c.dom.Node rpcChild = xmlDoc.getFirstChild();
201         assertEquals(rpcChild.getLocalName(), "rpc");
202
203         final org.w3c.dom.Node getConfig = rpcChild.getFirstChild();
204         assertEquals(getConfig.getLocalName(), "get-config");
205
206         final org.w3c.dom.Node sourceNode = getConfig.getFirstChild();
207         assertEquals(sourceNode.getLocalName(), "source");
208
209         final org.w3c.dom.Node runningNode = sourceNode.getFirstChild();
210         assertEquals(runningNode.getLocalName(), "running");
211
212         final org.w3c.dom.Node filterNode = sourceNode.getNextSibling();
213         assertEquals(filterNode.getLocalName(), "filter");
214
215         final org.w3c.dom.Node topNode = filterNode.getFirstChild();
216         assertEquals(topNode.getLocalName(), "top");
217
218         final org.w3c.dom.Node usersNode = topNode.getFirstChild();
219         assertEquals(usersNode.getLocalName(), "users");
220     }
221
222     @Test
223     public void testUserDefinedRpcCall() throws Exception {
224         messageTransformer.onGlobalContextUpdated(notifCtx);
225
226         final CompositeNodeBuilder<ImmutableCompositeNode> rootBuilder = ImmutableCompositeNode.builder();
227         rootBuilder.setQName(SUBSCRIBE_RPC_NAME);
228
229         final CompositeNodeBuilder<ImmutableCompositeNode> inputBuilder = ImmutableCompositeNode.builder();
230         inputBuilder.setQName(INPUT_QNAME);
231         inputBuilder.addLeaf(STREAM_NAME, "NETCONF");
232
233         rootBuilder.add(inputBuilder.toInstance());
234         final ImmutableCompositeNode root = rootBuilder.toInstance();
235
236         final CompositeNode flattenedNode = NetconfMessageTransformUtil.flattenInput(root);
237         assertNotNull(flattenedNode);
238         assertEquals(1, flattenedNode.size());
239
240         final List<CompositeNode> inputNode = flattenedNode.getCompositesByName(INPUT_QNAME);
241         assertNotNull(inputNode);
242         assertTrue(inputNode.isEmpty());
243
244         final NetconfMessage message = messageTransformer.toRpcRequest(SUBSCRIBE_RPC_NAME, root);
245         assertNotNull(message);
246
247         final Document xmlDoc = message.getDocument();
248         final org.w3c.dom.Node rpcChild = xmlDoc.getFirstChild();
249         assertEquals(rpcChild.getLocalName(), "rpc");
250
251         final org.w3c.dom.Node subscribeName = rpcChild.getFirstChild();
252         assertEquals(subscribeName.getLocalName(), "subscribe");
253
254         final org.w3c.dom.Node streamName = subscribeName.getFirstChild();
255         assertEquals(streamName.getLocalName(), "stream-name");
256
257     }
258
259     @Test
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\">" +
264                 "module schema" +
265                 "</data>\n" +
266                 "</rpc-reply>\n"
267         ));
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());
271     }
272
273 }