1 package org.opendaylight.controller.sal.binding.test.bugfix;
2 import java.util.Arrays;
3 import java.util.Collections;
8 import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
9 import org.opendaylight.controller.md.sal.common.api.data.DataChangeEvent;
10 import org.opendaylight.controller.sal.binding.test.AbstractDataServiceTest;
11 import org.opendaylight.controller.sal.binding.api.data.DataChangeListener;
12 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeBuilder;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnectorBuilder;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.flow.node.SupportedActions;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.flow.node.SupportedActionsBuilder;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.flow.node.supported.actions.ActionType;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.flow.node.supported.actions.ActionTypeBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.SupportType;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeaturesBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeaturesKey;
33 import org.opendaylight.yangtools.yang.binding.DataObject;
34 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
35 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
36 import org.opendaylight.yangtools.yang.common.QName;
37 import org.opendaylight.yangtools.yang.common.RpcResult;
38 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
40 import static org.junit.Assert.*;
42 public class PutAugmentationTest extends AbstractDataServiceTest implements DataChangeListener {
44 private static final QName NODE_ID_QNAME = QName.create(Node.QNAME, "id");
45 private static final String NODE_ID = "openflow:1";
47 private static final NodeKey NODE_KEY = new NodeKey(new NodeId(NODE_ID));
49 private static final Map<QName, Object> NODE_KEY_BI = Collections.<QName, Object> singletonMap(NODE_ID_QNAME,
52 private static final InstanceIdentifier<Nodes> NODES_INSTANCE_ID_BA = InstanceIdentifier.builder(Nodes.class) //
56 private static final InstanceIdentifier<Node> NODE_INSTANCE_ID_BA = InstanceIdentifier//
57 .builder(NODES_INSTANCE_ID_BA) //
58 .child(Node.class, NODE_KEY).toInstance();
61 private static final InstanceIdentifier<SupportedActions> SUPPORTED_ACTIONS_INSTANCE_ID_BA = InstanceIdentifier//
62 .builder(NODES_INSTANCE_ID_BA) //
63 .child(Node.class, NODE_KEY) //
64 .augmentation(FlowCapableNode.class) //
65 .child(SupportedActions.class)
69 private static final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier NODE_INSTANCE_ID_BI = //
70 org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.builder() //
72 .nodeWithKey(Node.QNAME, NODE_KEY_BI) //
74 private static final QName SUPPORTED_ACTIONS_QNAME = QName.create(FlowCapableNode.QNAME, SupportedActions.QNAME.getLocalName());
77 private static final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier SUPPORTED_ACTIONS_INSTANCE_ID_BI = //
78 org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.builder() //
80 .nodeWithKey(Node.QNAME, NODE_KEY_BI) //
81 .node(SUPPORTED_ACTIONS_QNAME) //
84 private DataChangeEvent<InstanceIdentifier<?>, DataObject> receivedChangeEvent;
94 public void putNodeAndAugmentation() throws Exception {
96 baDataService.registerDataChangeListener(NODES_INSTANCE_ID_BA, this);
98 NodeBuilder nodeBuilder = new NodeBuilder();
99 nodeBuilder.setId(new NodeId(NODE_ID));
100 nodeBuilder.setKey(NODE_KEY);
101 DataModificationTransaction baseTransaction = baDataService.beginTransaction();
102 baseTransaction.putOperationalData(NODE_INSTANCE_ID_BA, nodeBuilder.build());
103 RpcResult<TransactionStatus> result = baseTransaction.commit().get();
104 assertEquals(TransactionStatus.COMMITED, result.getResult());
105 assertNotNull(receivedChangeEvent);
106 Node node = (Node) baDataService.readOperationalData(NODE_INSTANCE_ID_BA);
108 assertEquals(NODE_KEY, node.getKey());
110 FlowCapableNodeBuilder fnub = new FlowCapableNodeBuilder();
111 fnub.setHardware("Hardware Foo");
112 fnub.setManufacturer("Manufacturer Foo");
113 fnub.setSerialNumber("Serial Foo");
114 fnub.setDescription("Description Foo");
115 fnub.setSoftware("JUnit emulated");
116 FlowCapableNode fnu = fnub.build();
117 InstanceIdentifier<FlowCapableNode> augmentIdentifier = InstanceIdentifier.builder(NODE_INSTANCE_ID_BA).augmentation(FlowCapableNode.class).toInstance();
118 DataModificationTransaction augmentedTransaction = baDataService.beginTransaction();
119 augmentedTransaction.putOperationalData(augmentIdentifier, fnu);
121 result = augmentedTransaction.commit().get();
122 assertEquals(TransactionStatus.COMMITED, result.getResult());
125 Node augmentedNode = (Node) baDataService.readOperationalData(NODE_INSTANCE_ID_BA);
127 assertEquals(NODE_KEY, augmentedNode.getKey());
128 System.out.println("Before assertion");
129 assertNotNull(augmentedNode.getAugmentation(FlowCapableNode.class));
130 FlowCapableNode readedAugmentation = augmentedNode.getAugmentation(FlowCapableNode.class);
131 assertEquals(fnu.getDescription(), readedAugmentation.getDescription());
132 assertBindingIndependentVersion(NODE_INSTANCE_ID_BI);
137 public void putNodeWithAugmentation() throws Exception {
139 NodeBuilder nodeBuilder = new NodeBuilder();
140 nodeBuilder.setId(new NodeId(NODE_ID));
141 nodeBuilder.setKey(NODE_KEY);
142 FlowCapableNodeBuilder fnub = new FlowCapableNodeBuilder();
143 fnub.setHardware("Hardware Foo");
144 fnub.setManufacturer("Manufacturer Foo");
145 fnub.setSerialNumber("Serial Foo");
146 fnub.setDescription("Description Foo");
147 fnub.setSoftware("JUnit emulated");
148 FlowCapableNode fnu = fnub.build();
150 nodeBuilder.addAugmentation(FlowCapableNode.class, fnu);
151 DataModificationTransaction baseTransaction = baDataService.beginTransaction();
152 baseTransaction.putOperationalData(NODE_INSTANCE_ID_BA, nodeBuilder.build());
153 RpcResult<TransactionStatus> result = baseTransaction.commit().get();
154 assertEquals(TransactionStatus.COMMITED, result.getResult());
156 FlowCapableNode readedAugmentation = (FlowCapableNode) baDataService.readOperationalData(InstanceIdentifier.builder(NODE_INSTANCE_ID_BA).augmentation(FlowCapableNode.class).toInstance());
157 assertNotNull(readedAugmentation);
158 assertEquals(fnu.getHardware(), readedAugmentation.getHardware());
160 testPutNodeConnectorWithAugmentation();
165 private void testPutNodeConnectorWithAugmentation() throws Exception {
166 NodeConnectorKey ncKey = new NodeConnectorKey(new NodeConnectorId("test:0:0"));
167 InstanceIdentifier<NodeConnector> ncPath = InstanceIdentifier.builder(NODE_INSTANCE_ID_BA)
168 .child(NodeConnector.class, ncKey).toInstance();
169 InstanceIdentifier<FlowCapableNodeConnector> ncAugmentPath = InstanceIdentifier.builder(ncPath)
170 .augmentation(FlowCapableNodeConnector.class).toInstance();
172 NodeConnectorBuilder nc = new NodeConnectorBuilder();
175 FlowCapableNodeConnectorBuilder fncb = new FlowCapableNodeConnectorBuilder();
177 nc.addAugmentation(FlowCapableNodeConnector.class, fncb.build());
179 DataModificationTransaction baseTransaction = baDataService.beginTransaction();
180 baseTransaction.putOperationalData(ncPath, nc.build());
181 RpcResult<TransactionStatus> result = baseTransaction.commit().get();
182 assertEquals(TransactionStatus.COMMITED, result.getResult());
184 FlowCapableNodeConnector readedAugmentation = (FlowCapableNodeConnector) baDataService.readOperationalData(ncAugmentPath);
185 assertNotNull(readedAugmentation);
186 assertEquals(fncb.getName(), readedAugmentation.getName());
189 private void testNodeRemove() throws Exception {
190 DataModificationTransaction transaction = baDataService.beginTransaction();
191 transaction.removeOperationalData(NODE_INSTANCE_ID_BA);
192 RpcResult<TransactionStatus> result = transaction.commit().get();
193 assertEquals(TransactionStatus.COMMITED, result.getResult());
195 Node node = (Node) baDataService.readOperationalData(NODE_INSTANCE_ID_BA);
199 private void verifyNodes(Nodes nodes,Node original) {
200 assertNotNull(nodes);
201 assertNotNull(nodes.getNode());
202 assertEquals(1, nodes.getNode().size());
203 Node readedNode = nodes.getNode().get(0);
204 assertEquals(original.getId(), readedNode.getId());
205 assertEquals(original.getKey(), readedNode.getKey());
207 FlowCapableNode fnu = original.getAugmentation(FlowCapableNode.class);
208 FlowCapableNode readedAugment = readedNode.getAugmentation(FlowCapableNode.class);
210 assertEquals(fnu.getDescription(), readedAugment.getDescription());
211 assertEquals(fnu.getSerialNumber(), readedAugment.getSerialNumber());
215 private void assertBindingIndependentVersion(
216 org.opendaylight.yangtools.yang.data.api.InstanceIdentifier nodeId) {
217 CompositeNode node = biDataService.readOperationalData(nodeId);
221 private Nodes checkForNodes() {
222 return (Nodes) baDataService.readOperationalData(NODES_INSTANCE_ID_BA);
226 public void onDataChanged(DataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
227 receivedChangeEvent = change;