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

©2013 OpenDaylight, A Linux Foundation Collaborative Project. All Rights Reserved.
OpenDaylight is a registered trademark of The OpenDaylight Project, Inc.
Linux Foundation and OpenDaylight are registered trademarks of the Linux Foundation.
Linux is a registered trademark of Linus Torvalds.