1 package org.opendaylight.controller.cluster.datastore.util;
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;
25 import java.io.InputStream;
26 import java.util.ArrayList;
27 import java.util.HashSet;
28 import java.util.List;
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;
35 public class TestModel {
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");
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");
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");
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");
60 public static final QName AUGMENTED_LIST_QNAME =
61 QName.create(TEST_QNAME, "augmented-list");
63 public static final QName OUTER_LIST_QNAME = QName.create(TEST_QNAME,
65 public static final QName INNER_LIST_QNAME = QName.create(TEST_QNAME,
67 public static final QName OUTER_CHOICE_QNAME = QName.create(TEST_QNAME,
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";
80 public static final YangInstanceIdentifier TEST_PATH = YangInstanceIdentifier
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");
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";
95 // Family specific constants
96 public static final QName FAMILY_QNAME =
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,
103 public static final QName GRAND_CHILDREN_QNAME = QName.create(FAMILY_QNAME,
105 public static final QName CHILD_NUMBER_QNAME = QName.create(FAMILY_QNAME,
107 public static final QName CHILD_NAME_QNAME = QName.create(FAMILY_QNAME,
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,
115 public static final YangInstanceIdentifier FAMILY_PATH = YangInstanceIdentifier
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();
122 private static final Integer FIRST_CHILD_ID = 1;
123 private static final Integer SECOND_CHILD_ID = 2;
125 private static final String FIRST_CHILD_NAME = "first child";
126 private static final String SECOND_CHILD_NAME = "second child";
128 private static final Integer FIRST_GRAND_CHILD_ID = 1;
129 private static final Integer SECOND_GRAND_CHILD_ID = 2;
131 private static final String FIRST_GRAND_CHILD_NAME = "first grand child";
132 private static final String SECOND_GRAND_CHILD_NAME = "second grand child";
135 private static final YangInstanceIdentifier CHILDREN_1_PATH = YangInstanceIdentifier
136 .builder(CHILDREN_PATH)
137 .nodeWithKey(CHILDREN_QNAME, CHILD_NUMBER_QNAME, FIRST_CHILD_ID) //
139 private static final YangInstanceIdentifier CHILDREN_1_NAME_PATH =
140 YangInstanceIdentifier.builder(CHILDREN_PATH)
141 .nodeWithKey(CHILDREN_QNAME, CHILD_NAME_QNAME, FIRST_CHILD_NAME) //
144 private static final YangInstanceIdentifier CHILDREN_2_PATH = YangInstanceIdentifier
145 .builder(CHILDREN_PATH)
146 .nodeWithKey(CHILDREN_QNAME, CHILD_NUMBER_QNAME, SECOND_CHILD_ID) //
148 private static final YangInstanceIdentifier CHILDREN_2_NAME_PATH =
149 YangInstanceIdentifier.builder(CHILDREN_PATH)
150 .nodeWithKey(CHILDREN_QNAME, CHILD_NAME_QNAME, SECOND_CHILD_NAME) //
154 private static final YangInstanceIdentifier GRAND_CHILD_1_PATH =
155 YangInstanceIdentifier.builder(CHILDREN_1_PATH)
156 .node(GRAND_CHILDREN_QNAME)
158 .nodeWithKey(GRAND_CHILDREN_QNAME, GRAND_CHILD_NUMBER_QNAME,
159 FIRST_GRAND_CHILD_ID) //
162 private static final YangInstanceIdentifier GRAND_CHILD_1_NAME_PATH =
163 YangInstanceIdentifier.builder(CHILDREN_1_PATH)
164 .node(GRAND_CHILDREN_QNAME)
166 .nodeWithKey(GRAND_CHILDREN_QNAME, GRAND_CHILD_NAME_QNAME,
167 FIRST_GRAND_CHILD_NAME) //
170 private static final YangInstanceIdentifier GRAND_CHILD_2_PATH =
171 YangInstanceIdentifier.builder(CHILDREN_2_PATH)
172 .node(GRAND_CHILDREN_QNAME)
174 .nodeWithKey(GRAND_CHILDREN_QNAME, GRAND_CHILD_NUMBER_QNAME,
175 SECOND_GRAND_CHILD_ID) //
178 private static final YangInstanceIdentifier GRAND_CHILD_2_NAME_PATH =
179 YangInstanceIdentifier.builder(CHILDREN_2_PATH)
180 .node(GRAND_CHILDREN_QNAME)
182 .nodeWithKey(GRAND_CHILDREN_QNAME, GRAND_CHILD_NAME_QNAME,
183 SECOND_GRAND_CHILD_NAME) //
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) //
193 private static final YangInstanceIdentifier OUTER_LIST_2_PATH =
194 YangInstanceIdentifier.builder(OUTER_LIST_PATH)
195 .nodeWithKey(OUTER_LIST_QNAME, ID_QNAME, TWO_ID) //
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) //
203 private static final YangInstanceIdentifier TWO_TWO_VALUE_PATH =
204 YangInstanceIdentifier.builder(TWO_TWO_PATH).node(VALUE_QNAME) //
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)) //
215 public static final InputStream getDatastoreTestInputStream() {
216 return getInputStream(DATASTORE_TEST_YANG);
219 public static final InputStream getDatastoreAugInputStream() {
220 return getInputStream(DATASTORE_AUG_YANG);
223 public static final InputStream getDatastoreTestNotificationInputStream() {
224 return getInputStream(DATASTORE_TEST_NOTIFICATION_YANG);
227 private static InputStream getInputStream(final String resourceName) {
228 return TestModel.class.getResourceAsStream(resourceName);
231 public static SchemaContext createTestContext() {
232 List<InputStream> inputStreams = new ArrayList<>();
233 inputStreams.add(getDatastoreTestInputStream());
234 inputStreams.add(getDatastoreAugInputStream());
235 inputStreams.add(getDatastoreTestNotificationInputStream());
237 YangParserImpl parser = new YangParserImpl();
238 Set<Module> modules = parser.parseYangModelsFromStreams(inputStreams);
239 return parser.resolveSchemaContext(modules);
243 * Returns a test document
260 public static NormalizedNode<?, ?> createDocumentOne(
261 SchemaContext schemaContext) {
262 return ImmutableContainerNodeBuilder
265 new YangInstanceIdentifier.NodeIdentifier(schemaContext.getQName()))
266 .withChild(createTestContainer()).build();
270 public static ContainerNode createTestContainer() {
273 // Create a list of shoes
274 // This is to test leaf list entry
275 final LeafSetEntryNode<Object> nike =
276 ImmutableLeafSetEntryNodeBuilder
279 new YangInstanceIdentifier.NodeWithValue(
280 QName.create(TEST_QNAME,
282 ).withValue("nike").build();
284 final LeafSetEntryNode<Object> puma =
285 ImmutableLeafSetEntryNodeBuilder
288 new YangInstanceIdentifier.NodeWithValue(
289 QName.create(TEST_QNAME,
291 ).withValue("puma").build();
293 final LeafSetNode<Object> shoes =
294 ImmutableLeafSetNodeBuilder
297 new YangInstanceIdentifier.NodeIdentifier(
298 QName.create(TEST_QNAME,
300 ).withChild(nike).withChild(puma).build();
303 // Test a leaf-list where each entry contains an identity
304 final LeafSetEntryNode<Object> cap1 =
305 ImmutableLeafSetEntryNodeBuilder
308 new YangInstanceIdentifier.NodeWithValue(
309 QName.create(TEST_QNAME,
310 "capability"), DESC_QNAME)
311 ).withValue(DESC_QNAME).build();
313 final LeafSetNode<Object> capabilities =
314 ImmutableLeafSetNodeBuilder
317 new YangInstanceIdentifier.NodeIdentifier(
318 QName.create(TEST_QNAME,
320 ).withChild(cap1).build();
322 ContainerNode switchFeatures = ImmutableContainerNodeBuilder
324 .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(
325 SWITCH_FEATURES_QNAME))
326 .withChild(capabilities)
329 // Create a leaf list with numbers
330 final LeafSetEntryNode<Object> five =
331 ImmutableLeafSetEntryNodeBuilder
334 (new YangInstanceIdentifier.NodeWithValue(
335 QName.create(TEST_QNAME,
337 ).withValue(5).build();
338 final LeafSetEntryNode<Object> fifteen =
339 ImmutableLeafSetEntryNodeBuilder
342 (new YangInstanceIdentifier.NodeWithValue(
343 QName.create(TEST_QNAME,
345 ).withValue(15).build();
346 final LeafSetNode<Object> numbers =
347 ImmutableLeafSetNodeBuilder
350 new YangInstanceIdentifier.NodeIdentifier(
351 QName.create(TEST_QNAME,
353 ).withChild(five).withChild(fifteen).build();
356 // Create augmentations
357 MapEntryNode mapEntry = createAugmentedListEntry(1, "First Test");
360 // Create the document
361 return ImmutableContainerNodeBuilder
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))
371 //.withChild(augmentationNode)
374 .withChild(switchFeatures)
375 .withChild(mapNodeBuilder(AUGMENTED_LIST_QNAME).withChild(mapEntry).build())
377 mapNodeBuilder(OUTER_LIST_QNAME)
378 .withChild(mapEntry(OUTER_LIST_QNAME, ID_QNAME, ONE_ID))
379 .withChild(BAR_NODE).build()
384 public static MapEntryNode createAugmentedListEntry(int id, String name) {
386 Set<QName> childAugmentations = new HashSet<>();
387 childAugmentations.add(AUG_CONT_QNAME);
389 ContainerNode augCont = ImmutableContainerNodeBuilder
391 .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(AUG_CONT_QNAME))
392 .withChild(ImmutableNodes.leafNode(AUG_NAME_QNAME, name))
396 final YangInstanceIdentifier.AugmentationIdentifier augmentationIdentifier =
397 new YangInstanceIdentifier.AugmentationIdentifier(childAugmentations);
399 final AugmentationNode augmentationNode =
400 Builders.augmentationBuilder()
401 .withNodeIdentifier(augmentationIdentifier)
405 return ImmutableMapEntryNodeBuilder.create()
407 new YangInstanceIdentifier.NodeIdentifierWithPredicates(
408 AUGMENTED_LIST_QNAME, ID_QNAME, id))
409 .withChild(ImmutableNodes.leafNode(ID_QNAME, id))
410 .withChild(augmentationNode).build();
414 public static ContainerNode createFamily() {
415 final DataContainerNodeAttrBuilder<YangInstanceIdentifier.NodeIdentifier, ContainerNode>
416 familyContainerBuilder =
417 ImmutableContainerNodeBuilder.create().withNodeIdentifier(
418 new YangInstanceIdentifier.NodeIdentifier(FAMILY_QNAME));
420 final CollectionNodeBuilder<MapEntryNode, MapNode> childrenBuilder =
421 mapNodeBuilder(CHILDREN_QNAME);
423 final DataContainerNodeBuilder<YangInstanceIdentifier.NodeIdentifierWithPredicates, MapEntryNode>
425 mapEntryBuilder(CHILDREN_QNAME, CHILD_NUMBER_QNAME, FIRST_CHILD_ID);
426 final DataContainerNodeBuilder<YangInstanceIdentifier.NodeIdentifierWithPredicates, MapEntryNode>
428 mapEntryBuilder(CHILDREN_QNAME, CHILD_NUMBER_QNAME,
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);
440 firstGrandChildBuilder
442 ImmutableNodes.leafNode(GRAND_CHILD_NUMBER_QNAME,
443 FIRST_GRAND_CHILD_ID)
445 ImmutableNodes.leafNode(GRAND_CHILD_NAME_QNAME,
446 FIRST_GRAND_CHILD_NAME)
449 secondGrandChildBuilder.withChild(
451 .leafNode(GRAND_CHILD_NUMBER_QNAME, SECOND_GRAND_CHILD_ID)
454 ImmutableNodes.leafNode(GRAND_CHILD_NAME_QNAME,
455 SECOND_GRAND_CHILD_NAME)
460 ImmutableNodes.leafNode(CHILD_NUMBER_QNAME, FIRST_CHILD_ID))
462 ImmutableNodes.leafNode(CHILD_NAME_QNAME, FIRST_CHILD_NAME))
464 mapNodeBuilder(GRAND_CHILDREN_QNAME).withChild(
465 firstGrandChildBuilder.build()).build()
471 ImmutableNodes.leafNode(CHILD_NUMBER_QNAME, SECOND_CHILD_ID))
473 ImmutableNodes.leafNode(CHILD_NAME_QNAME, SECOND_CHILD_NAME))
475 mapNodeBuilder(GRAND_CHILDREN_QNAME).withChild(
476 firstGrandChildBuilder.build()).build()
479 childrenBuilder.withChild(firstChildBuilder.build());
480 childrenBuilder.withChild(secondChildBuilder.build());
482 return familyContainerBuilder.withChild(childrenBuilder.build())