bef4057aa2596b891000698a943864983bb91d51
[controller.git] / opendaylight / md-sal / sal-protocolbuffer-encoding / src / test / java / org / opendaylight / controller / cluster / datastore / util / TestModel.java
1 package org.opendaylight.controller.cluster.datastore.util;
2
3 import org.opendaylight.yangtools.yang.common.QName;
4 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
5 import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode;
6 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
7 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
8 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
9 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
10 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
11 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
12 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
13 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
14 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.CollectionNodeBuilder;
15 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder;
16 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
17 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
18 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafSetEntryNodeBuilder;
19 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafSetNodeBuilder;
20 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableMapEntryNodeBuilder;
21 import org.opendaylight.yangtools.yang.model.api.Module;
22 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
23 import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl;
24
25 import java.io.InputStream;
26 import java.util.ArrayList;
27 import java.util.HashSet;
28 import java.util.List;
29 import java.util.Set;
30
31 import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.mapEntry;
32 import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.mapEntryBuilder;
33 import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.mapNodeBuilder;
34
35 public class TestModel {
36
37     public static final QName TEST_QNAME = QName.create(
38         "urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:store:test",
39         "2014-03-13", "test");
40
41     public static final QName AUG_NAME_QNAME = QName.create(
42         "urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:store:aug",
43         "2014-03-13", "name");
44
45     public static final QName AUG_CONT_QNAME = QName.create(
46         "urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:store:aug",
47         "2014-03-13", "cont");
48
49
50     public static final QName DESC_QNAME = QName.create(TEST_QNAME, "desc");
51     public static final QName POINTER_QNAME =
52         QName.create(TEST_QNAME, "pointer");
53     public static final QName SOME_REF_QNAME =
54         QName.create(TEST_QNAME, "some-ref");
55     public static final QName MYIDENTITY_QNAME =
56         QName.create(TEST_QNAME, "myidentity");
57     public static final QName SWITCH_FEATURES_QNAME =
58         QName.create(TEST_QNAME, "switch-features");
59
60     public static final QName AUGMENTED_LIST_QNAME =
61         QName.create(TEST_QNAME, "augmented-list");
62
63     public static final QName OUTER_LIST_QNAME = QName.create(TEST_QNAME,
64         "outer-list");
65     public static final QName INNER_LIST_QNAME = QName.create(TEST_QNAME,
66         "inner-list");
67     public static final QName OUTER_CHOICE_QNAME = QName.create(TEST_QNAME,
68         "outer-choice");
69     public static final QName ID_QNAME = QName.create(TEST_QNAME, "id");
70     public static final QName NAME_QNAME = QName.create(TEST_QNAME, "name");
71     public static final QName VALUE_QNAME = QName.create(TEST_QNAME, "value");
72     private static final String DATASTORE_TEST_YANG =
73         "/odl-datastore-test.yang";
74     private static final String DATASTORE_AUG_YANG =
75         "/odl-datastore-augmentation.yang";
76     private static final String DATASTORE_TEST_NOTIFICATION_YANG =
77         "/odl-datastore-test-notification.yang";
78
79
80     public static final YangInstanceIdentifier TEST_PATH = YangInstanceIdentifier
81         .of(TEST_QNAME);
82     public static final YangInstanceIdentifier DESC_PATH = YangInstanceIdentifier
83         .builder(TEST_PATH).node(DESC_QNAME).build();
84     public static final YangInstanceIdentifier OUTER_LIST_PATH = YangInstanceIdentifier
85         .builder(TEST_PATH).node(OUTER_LIST_QNAME).build();
86     public static final QName TWO_QNAME = QName.create(TEST_QNAME, "two");
87     public static final QName THREE_QNAME = QName.create(TEST_QNAME, "three");
88
89     private static final Integer ONE_ID = 1;
90     private static final Integer TWO_ID = 2;
91     private static final String TWO_ONE_NAME = "one";
92     private static final String TWO_TWO_NAME = "two";
93     private static final String DESC = "Hello there";
94
95     // Family specific constants
96     public static final QName FAMILY_QNAME =
97         QName
98             .create(
99                 "urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:store:notification-test",
100                 "2014-04-17", "family");
101     public static final QName CHILDREN_QNAME = QName.create(FAMILY_QNAME,
102         "children");
103     public static final QName GRAND_CHILDREN_QNAME = QName.create(FAMILY_QNAME,
104         "grand-children");
105     public static final QName CHILD_NUMBER_QNAME = QName.create(FAMILY_QNAME,
106         "child-number");
107     public static final QName CHILD_NAME_QNAME = QName.create(FAMILY_QNAME,
108         "child-name");
109     public static final QName GRAND_CHILD_NUMBER_QNAME = QName.create(
110         FAMILY_QNAME, "grand-child-number");
111     public static final QName GRAND_CHILD_NAME_QNAME =
112         QName.create(FAMILY_QNAME,
113             "grand-child-name");
114
115     public static final YangInstanceIdentifier FAMILY_PATH = YangInstanceIdentifier
116         .of(FAMILY_QNAME);
117     public static final YangInstanceIdentifier FAMILY_DESC_PATH = YangInstanceIdentifier
118         .builder(FAMILY_PATH).node(DESC_QNAME).build();
119     public static final YangInstanceIdentifier CHILDREN_PATH = YangInstanceIdentifier
120         .builder(FAMILY_PATH).node(CHILDREN_QNAME).build();
121
122     private static final Integer FIRST_CHILD_ID = 1;
123     private static final Integer SECOND_CHILD_ID = 2;
124
125     private static final String FIRST_CHILD_NAME = "first child";
126     private static final String SECOND_CHILD_NAME = "second child";
127
128     private static final Integer FIRST_GRAND_CHILD_ID = 1;
129     private static final Integer SECOND_GRAND_CHILD_ID = 2;
130
131     private static final String FIRST_GRAND_CHILD_NAME = "first grand child";
132     private static final String SECOND_GRAND_CHILD_NAME = "second grand child";
133
134     // first child
135     private static final YangInstanceIdentifier CHILDREN_1_PATH = YangInstanceIdentifier
136         .builder(CHILDREN_PATH)
137         .nodeWithKey(CHILDREN_QNAME, CHILD_NUMBER_QNAME, FIRST_CHILD_ID) //
138         .build();
139     private static final YangInstanceIdentifier CHILDREN_1_NAME_PATH =
140         YangInstanceIdentifier.builder(CHILDREN_PATH)
141             .nodeWithKey(CHILDREN_QNAME, CHILD_NAME_QNAME, FIRST_CHILD_NAME) //
142             .build();
143
144     private static final YangInstanceIdentifier CHILDREN_2_PATH = YangInstanceIdentifier
145         .builder(CHILDREN_PATH)
146         .nodeWithKey(CHILDREN_QNAME, CHILD_NUMBER_QNAME, SECOND_CHILD_ID) //
147         .build();
148     private static final YangInstanceIdentifier CHILDREN_2_NAME_PATH =
149         YangInstanceIdentifier.builder(CHILDREN_PATH)
150             .nodeWithKey(CHILDREN_QNAME, CHILD_NAME_QNAME, SECOND_CHILD_NAME) //
151             .build();
152
153
154     private static final YangInstanceIdentifier GRAND_CHILD_1_PATH =
155         YangInstanceIdentifier.builder(CHILDREN_1_PATH)
156             .node(GRAND_CHILDREN_QNAME)
157                 //
158             .nodeWithKey(GRAND_CHILDREN_QNAME, GRAND_CHILD_NUMBER_QNAME,
159                 FIRST_GRAND_CHILD_ID) //
160             .build();
161
162     private static final YangInstanceIdentifier GRAND_CHILD_1_NAME_PATH =
163         YangInstanceIdentifier.builder(CHILDREN_1_PATH)
164             .node(GRAND_CHILDREN_QNAME)
165                 //
166             .nodeWithKey(GRAND_CHILDREN_QNAME, GRAND_CHILD_NAME_QNAME,
167                 FIRST_GRAND_CHILD_NAME) //
168             .build();
169
170     private static final YangInstanceIdentifier GRAND_CHILD_2_PATH =
171         YangInstanceIdentifier.builder(CHILDREN_2_PATH)
172             .node(GRAND_CHILDREN_QNAME)
173                 //
174             .nodeWithKey(GRAND_CHILDREN_QNAME, GRAND_CHILD_NUMBER_QNAME,
175                 SECOND_GRAND_CHILD_ID) //
176             .build();
177
178     private static final YangInstanceIdentifier GRAND_CHILD_2_NAME_PATH =
179         YangInstanceIdentifier.builder(CHILDREN_2_PATH)
180             .node(GRAND_CHILDREN_QNAME)
181                 //
182             .nodeWithKey(GRAND_CHILDREN_QNAME, GRAND_CHILD_NAME_QNAME,
183                 SECOND_GRAND_CHILD_NAME) //
184             .build();
185
186     private static final YangInstanceIdentifier DESC_PATH_ID = YangInstanceIdentifier
187         .builder(DESC_PATH).build();
188     private static final YangInstanceIdentifier OUTER_LIST_1_PATH =
189         YangInstanceIdentifier.builder(OUTER_LIST_PATH)
190             .nodeWithKey(OUTER_LIST_QNAME, ID_QNAME, ONE_ID) //
191             .build();
192
193     private static final YangInstanceIdentifier OUTER_LIST_2_PATH =
194         YangInstanceIdentifier.builder(OUTER_LIST_PATH)
195             .nodeWithKey(OUTER_LIST_QNAME, ID_QNAME, TWO_ID) //
196             .build();
197
198     private static final YangInstanceIdentifier TWO_TWO_PATH = YangInstanceIdentifier
199         .builder(OUTER_LIST_2_PATH).node(INNER_LIST_QNAME) //
200         .nodeWithKey(INNER_LIST_QNAME, NAME_QNAME, TWO_TWO_NAME) //
201         .build();
202
203     private static final YangInstanceIdentifier TWO_TWO_VALUE_PATH =
204         YangInstanceIdentifier.builder(TWO_TWO_PATH).node(VALUE_QNAME) //
205             .build();
206
207     private static final MapEntryNode BAR_NODE = mapEntryBuilder(
208         OUTER_LIST_QNAME, ID_QNAME, TWO_ID) //
209         .withChild(mapNodeBuilder(INNER_LIST_QNAME) //
210             .withChild(mapEntry(INNER_LIST_QNAME, NAME_QNAME, TWO_ONE_NAME)) //
211             .withChild(mapEntry(INNER_LIST_QNAME, NAME_QNAME, TWO_TWO_NAME)) //
212             .build()) //
213         .build();
214
215     public static final InputStream getDatastoreTestInputStream() {
216         return getInputStream(DATASTORE_TEST_YANG);
217     }
218
219     public static final InputStream getDatastoreAugInputStream() {
220         return getInputStream(DATASTORE_AUG_YANG);
221     }
222
223     public static final InputStream getDatastoreTestNotificationInputStream() {
224         return getInputStream(DATASTORE_TEST_NOTIFICATION_YANG);
225     }
226
227     private static InputStream getInputStream(final String resourceName) {
228         return TestModel.class.getResourceAsStream(resourceName);
229     }
230
231     public static SchemaContext createTestContext() {
232         List<InputStream> inputStreams = new ArrayList<>();
233         inputStreams.add(getDatastoreTestInputStream());
234         inputStreams.add(getDatastoreAugInputStream());
235         inputStreams.add(getDatastoreTestNotificationInputStream());
236
237         YangParserImpl parser = new YangParserImpl();
238         Set<Module> modules = parser.parseYangModelsFromStreams(inputStreams);
239         return parser.resolveSchemaContext(modules);
240     }
241
242     /**
243      * Returns a test document
244      * <p/>
245      * <pre>
246      * test
247      *     outer-list
248      *          id 1
249      *     outer-list
250      *          id 2
251      *          inner-list
252      *                  name "one"
253      *          inner-list
254      *                  name "two"
255      *
256      * </pre>
257      *
258      * @return
259      */
260     public static NormalizedNode<?, ?> createDocumentOne(
261         SchemaContext schemaContext) {
262         return ImmutableContainerNodeBuilder
263             .create()
264             .withNodeIdentifier(
265                 new YangInstanceIdentifier.NodeIdentifier(schemaContext.getQName()))
266             .withChild(createTestContainer()).build();
267
268     }
269
270     public static ContainerNode createTestContainer() {
271
272
273         // Create a list of shoes
274         // This is to test leaf list entry
275         final LeafSetEntryNode<Object> nike =
276             ImmutableLeafSetEntryNodeBuilder
277                 .create()
278                 .withNodeIdentifier(
279                     new YangInstanceIdentifier.NodeWithValue(
280                         QName.create(TEST_QNAME,
281                             "shoe"), "nike")
282                 ).withValue("nike").build();
283
284         final LeafSetEntryNode<Object> puma =
285             ImmutableLeafSetEntryNodeBuilder
286                 .create()
287                 .withNodeIdentifier(
288                     new YangInstanceIdentifier.NodeWithValue(
289                         QName.create(TEST_QNAME,
290                             "shoe"), "puma")
291                 ).withValue("puma").build();
292
293         final LeafSetNode<Object> shoes =
294             ImmutableLeafSetNodeBuilder
295                 .create()
296                 .withNodeIdentifier(
297                     new YangInstanceIdentifier.NodeIdentifier(
298                         QName.create(TEST_QNAME,
299                             "shoe"))
300                 ).withChild(nike).withChild(puma).build();
301
302
303         // Test a leaf-list where each entry contains an identity
304         final LeafSetEntryNode<Object> cap1 =
305             ImmutableLeafSetEntryNodeBuilder
306                 .create()
307                 .withNodeIdentifier(
308                     new YangInstanceIdentifier.NodeWithValue(
309                         QName.create(TEST_QNAME,
310                             "capability"), DESC_QNAME)
311                 ).withValue(DESC_QNAME).build();
312
313         final LeafSetNode<Object> capabilities =
314             ImmutableLeafSetNodeBuilder
315                 .create()
316                 .withNodeIdentifier(
317                     new YangInstanceIdentifier.NodeIdentifier(
318                         QName.create(TEST_QNAME,
319                             "capability"))
320                 ).withChild(cap1).build();
321
322         ContainerNode switchFeatures = ImmutableContainerNodeBuilder
323             .create()
324             .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(
325                 SWITCH_FEATURES_QNAME))
326             .withChild(capabilities)
327             .build();
328
329         // Create a leaf list with numbers
330         final LeafSetEntryNode<Object> five =
331             ImmutableLeafSetEntryNodeBuilder
332                 .create()
333                 .withNodeIdentifier(
334                     (new YangInstanceIdentifier.NodeWithValue(
335                         QName.create(TEST_QNAME,
336                             "number"), 5))
337                 ).withValue(5).build();
338         final LeafSetEntryNode<Object> fifteen =
339             ImmutableLeafSetEntryNodeBuilder
340                 .create()
341                 .withNodeIdentifier(
342                     (new YangInstanceIdentifier.NodeWithValue(
343                         QName.create(TEST_QNAME,
344                             "number"), 15))
345                 ).withValue(15).build();
346         final LeafSetNode<Object> numbers =
347             ImmutableLeafSetNodeBuilder
348                 .create()
349                 .withNodeIdentifier(
350                     new YangInstanceIdentifier.NodeIdentifier(
351                         QName.create(TEST_QNAME,
352                             "number"))
353                 ).withChild(five).withChild(fifteen).build();
354
355
356         // Create augmentations
357         MapEntryNode mapEntry = createAugmentedListEntry(1, "First Test");
358
359
360         // Create the document
361         return ImmutableContainerNodeBuilder
362             .create()
363             .withNodeIdentifier(
364                 new YangInstanceIdentifier.NodeIdentifier(TEST_QNAME))
365             .withChild(ImmutableNodes.leafNode(DESC_QNAME, DESC))
366             .withChild(ImmutableNodes.leafNode(POINTER_QNAME, "pointer"))
367             .withChild(ImmutableNodes.leafNode(SOME_REF_QNAME,
368                 YangInstanceIdentifier.builder().build()))
369             .withChild(ImmutableNodes.leafNode(MYIDENTITY_QNAME, DESC_QNAME))
370
371                 //.withChild(augmentationNode)
372             .withChild(shoes)
373             .withChild(numbers)
374             .withChild(switchFeatures)
375             .withChild(mapNodeBuilder(AUGMENTED_LIST_QNAME).withChild(mapEntry).build())
376             .withChild(
377                 mapNodeBuilder(OUTER_LIST_QNAME)
378                     .withChild(mapEntry(OUTER_LIST_QNAME, ID_QNAME, ONE_ID))
379                     .withChild(BAR_NODE).build()
380             ).build();
381
382     }
383
384     public static MapEntryNode createAugmentedListEntry(int id, String name) {
385
386         Set<QName> childAugmentations = new HashSet<>();
387         childAugmentations.add(AUG_CONT_QNAME);
388
389         ContainerNode augCont = ImmutableContainerNodeBuilder
390             .create()
391             .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(AUG_CONT_QNAME))
392             .withChild(ImmutableNodes.leafNode(AUG_NAME_QNAME, name))
393             .build();
394
395
396         final YangInstanceIdentifier.AugmentationIdentifier augmentationIdentifier =
397             new YangInstanceIdentifier.AugmentationIdentifier(childAugmentations);
398
399         final AugmentationNode augmentationNode =
400             Builders.augmentationBuilder()
401                 .withNodeIdentifier(augmentationIdentifier)
402                 .withChild(augCont)
403                 .build();
404
405         return ImmutableMapEntryNodeBuilder.create()
406             .withNodeIdentifier(
407                 new YangInstanceIdentifier.NodeIdentifierWithPredicates(
408                     AUGMENTED_LIST_QNAME, ID_QNAME, id))
409             .withChild(ImmutableNodes.leafNode(ID_QNAME, id))
410             .withChild(augmentationNode).build();
411     }
412
413
414     public static ContainerNode createFamily() {
415         final DataContainerNodeAttrBuilder<YangInstanceIdentifier.NodeIdentifier, ContainerNode>
416             familyContainerBuilder =
417             ImmutableContainerNodeBuilder.create().withNodeIdentifier(
418                 new YangInstanceIdentifier.NodeIdentifier(FAMILY_QNAME));
419
420         final CollectionNodeBuilder<MapEntryNode, MapNode> childrenBuilder =
421             mapNodeBuilder(CHILDREN_QNAME);
422
423         final DataContainerNodeBuilder<YangInstanceIdentifier.NodeIdentifierWithPredicates, MapEntryNode>
424             firstChildBuilder =
425             mapEntryBuilder(CHILDREN_QNAME, CHILD_NUMBER_QNAME, FIRST_CHILD_ID);
426         final DataContainerNodeBuilder<YangInstanceIdentifier.NodeIdentifierWithPredicates, MapEntryNode>
427             secondChildBuilder =
428             mapEntryBuilder(CHILDREN_QNAME, CHILD_NUMBER_QNAME,
429                 SECOND_CHILD_ID);
430
431         final DataContainerNodeBuilder<YangInstanceIdentifier.NodeIdentifierWithPredicates, MapEntryNode>
432             firstGrandChildBuilder =
433             mapEntryBuilder(GRAND_CHILDREN_QNAME, GRAND_CHILD_NUMBER_QNAME,
434                 FIRST_GRAND_CHILD_ID);
435         final DataContainerNodeBuilder<YangInstanceIdentifier.NodeIdentifierWithPredicates, MapEntryNode>
436             secondGrandChildBuilder =
437             mapEntryBuilder(GRAND_CHILDREN_QNAME, GRAND_CHILD_NUMBER_QNAME,
438                 SECOND_GRAND_CHILD_ID);
439
440         firstGrandChildBuilder
441             .withChild(
442                 ImmutableNodes.leafNode(GRAND_CHILD_NUMBER_QNAME,
443                     FIRST_GRAND_CHILD_ID)
444             ).withChild(
445             ImmutableNodes.leafNode(GRAND_CHILD_NAME_QNAME,
446                 FIRST_GRAND_CHILD_NAME)
447         );
448
449         secondGrandChildBuilder.withChild(
450             ImmutableNodes
451                 .leafNode(GRAND_CHILD_NUMBER_QNAME, SECOND_GRAND_CHILD_ID)
452         )
453             .withChild(
454                 ImmutableNodes.leafNode(GRAND_CHILD_NAME_QNAME,
455                     SECOND_GRAND_CHILD_NAME)
456             );
457
458         firstChildBuilder
459             .withChild(
460                 ImmutableNodes.leafNode(CHILD_NUMBER_QNAME, FIRST_CHILD_ID))
461             .withChild(
462                 ImmutableNodes.leafNode(CHILD_NAME_QNAME, FIRST_CHILD_NAME))
463             .withChild(
464                 mapNodeBuilder(GRAND_CHILDREN_QNAME).withChild(
465                     firstGrandChildBuilder.build()).build()
466             );
467
468
469         secondChildBuilder
470             .withChild(
471                 ImmutableNodes.leafNode(CHILD_NUMBER_QNAME, SECOND_CHILD_ID))
472             .withChild(
473                 ImmutableNodes.leafNode(CHILD_NAME_QNAME, SECOND_CHILD_NAME))
474             .withChild(
475                 mapNodeBuilder(GRAND_CHILDREN_QNAME).withChild(
476                     firstGrandChildBuilder.build()).build()
477             );
478
479         childrenBuilder.withChild(firstChildBuilder.build());
480         childrenBuilder.withChild(secondChildBuilder.build());
481
482         return familyContainerBuilder.withChild(childrenBuilder.build())
483             .build();
484     }
485
486 }