Changed model versions to dependencies
[controller.git] / opendaylight / md-sal / sal-binding-dom-it / src / test / java / org / opendaylight / controller / sal / binding / test / bugfix / PutAugmentationTest.java
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.controller.sal.binding.test.bugfix;
9 import java.util.Arrays;
10 import java.util.Collections;
11 import java.util.List;
12 import java.util.Map;
13
14 import org.junit.Test;
15 import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
16 import org.opendaylight.controller.md.sal.common.api.data.DataChangeEvent;
17 import org.opendaylight.controller.sal.binding.test.AbstractDataServiceTest;
18 import org.opendaylight.controller.sal.binding.api.data.DataChangeListener;
19 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnectorBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.flow.node.SupportedActions;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.flow.node.SupportedActionsBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.flow.node.supported.actions.ActionType;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.flow.node.supported.actions.ActionTypeBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.SupportType;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeaturesBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeaturesKey;
40 import org.opendaylight.yangtools.yang.binding.DataObject;
41 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
42 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
43 import org.opendaylight.yangtools.yang.common.QName;
44 import org.opendaylight.yangtools.yang.common.RpcResult;
45 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
46
47 import static org.junit.Assert.*;
48
49 public class PutAugmentationTest extends AbstractDataServiceTest implements DataChangeListener {
50
51     private static final QName NODE_ID_QNAME = QName.create(Node.QNAME, "id");
52     private static final String NODE_ID = "openflow:1";
53
54     private static final NodeKey NODE_KEY = new NodeKey(new NodeId(NODE_ID));
55
56     private static final Map<QName, Object> NODE_KEY_BI = Collections.<QName, Object> singletonMap(NODE_ID_QNAME,
57             NODE_ID);
58
59     private static final InstanceIdentifier<Nodes> NODES_INSTANCE_ID_BA = InstanceIdentifier.builder(Nodes.class) //
60             .toInstance();
61
62
63     private static final InstanceIdentifier<Node> NODE_INSTANCE_ID_BA = InstanceIdentifier//
64             .builder(NODES_INSTANCE_ID_BA) //
65             .child(Node.class, NODE_KEY).toInstance();
66     
67     
68     private static final InstanceIdentifier<SupportedActions> SUPPORTED_ACTIONS_INSTANCE_ID_BA = InstanceIdentifier//
69             .builder(NODES_INSTANCE_ID_BA) //
70             .child(Node.class, NODE_KEY) //
71             .augmentation(FlowCapableNode.class) //
72             .child(SupportedActions.class)
73             .toInstance();
74     
75
76     private static final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier NODE_INSTANCE_ID_BI = //
77     org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.builder() //
78             .node(Nodes.QNAME) //
79             .nodeWithKey(Node.QNAME, NODE_KEY_BI) //
80             .toInstance();
81     private static final QName SUPPORTED_ACTIONS_QNAME = QName.create(FlowCapableNode.QNAME, SupportedActions.QNAME.getLocalName());
82
83     
84     private static final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier SUPPORTED_ACTIONS_INSTANCE_ID_BI = //
85             org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.builder() //
86                     .node(Nodes.QNAME) //
87                     .nodeWithKey(Node.QNAME, NODE_KEY_BI) //
88                     .node(SUPPORTED_ACTIONS_QNAME) //
89                     .toInstance();
90     
91     private DataChangeEvent<InstanceIdentifier<?>, DataObject> receivedChangeEvent;
92
93     
94     
95     /**
96      * Test for Bug 148
97      * 
98      * @throws Exception
99      */
100     @Test
101     public void putNodeAndAugmentation() throws Exception {
102
103         baDataService.registerDataChangeListener(NODES_INSTANCE_ID_BA, this);
104         
105         NodeBuilder nodeBuilder = new NodeBuilder();
106         nodeBuilder.setId(new NodeId(NODE_ID));
107         nodeBuilder.setKey(NODE_KEY);
108         DataModificationTransaction baseTransaction = baDataService.beginTransaction();
109         baseTransaction.putOperationalData(NODE_INSTANCE_ID_BA, nodeBuilder.build());
110         RpcResult<TransactionStatus> result = baseTransaction.commit().get();
111         assertEquals(TransactionStatus.COMMITED, result.getResult());
112         assertNotNull(receivedChangeEvent);
113         Node node = (Node) baDataService.readOperationalData(NODE_INSTANCE_ID_BA);
114         assertNotNull(node);
115         assertEquals(NODE_KEY, node.getKey());
116         
117         FlowCapableNodeBuilder fnub = new FlowCapableNodeBuilder();
118         fnub.setHardware("Hardware Foo");
119         fnub.setManufacturer("Manufacturer Foo");
120         fnub.setSerialNumber("Serial Foo");
121         fnub.setDescription("Description Foo");
122         fnub.setSoftware("JUnit emulated");
123         FlowCapableNode fnu = fnub.build();
124         InstanceIdentifier<FlowCapableNode> augmentIdentifier = InstanceIdentifier.builder(NODE_INSTANCE_ID_BA).augmentation(FlowCapableNode.class).toInstance();
125         DataModificationTransaction augmentedTransaction = baDataService.beginTransaction();
126         augmentedTransaction.putOperationalData(augmentIdentifier, fnu);
127         
128         result = augmentedTransaction.commit().get();
129         assertEquals(TransactionStatus.COMMITED, result.getResult());
130         
131         
132         Node augmentedNode = (Node) baDataService.readOperationalData(NODE_INSTANCE_ID_BA);
133         assertNotNull(node);
134         assertEquals(NODE_KEY, augmentedNode.getKey());
135         System.out.println("Before assertion");
136         assertNotNull(augmentedNode.getAugmentation(FlowCapableNode.class));
137         FlowCapableNode readedAugmentation = augmentedNode.getAugmentation(FlowCapableNode.class);
138         assertEquals(fnu.getDescription(), readedAugmentation.getDescription());
139         assertBindingIndependentVersion(NODE_INSTANCE_ID_BI);
140         testNodeRemove();
141     }
142     
143     @Test
144     public void putNodeWithAugmentation() throws Exception {
145         
146         NodeBuilder nodeBuilder = new NodeBuilder();
147         nodeBuilder.setId(new NodeId(NODE_ID));
148         nodeBuilder.setKey(NODE_KEY);
149         FlowCapableNodeBuilder fnub = new FlowCapableNodeBuilder();
150         fnub.setHardware("Hardware Foo");
151         fnub.setManufacturer("Manufacturer Foo");
152         fnub.setSerialNumber("Serial Foo");
153         fnub.setDescription("Description Foo");
154         fnub.setSoftware("JUnit emulated");
155         FlowCapableNode fnu = fnub.build();
156         
157         nodeBuilder.addAugmentation(FlowCapableNode.class, fnu);
158         DataModificationTransaction baseTransaction = baDataService.beginTransaction();
159         baseTransaction.putOperationalData(NODE_INSTANCE_ID_BA, nodeBuilder.build());
160         RpcResult<TransactionStatus> result = baseTransaction.commit().get();
161         assertEquals(TransactionStatus.COMMITED, result.getResult());
162         
163         FlowCapableNode readedAugmentation = (FlowCapableNode) baDataService.readOperationalData(InstanceIdentifier.builder(NODE_INSTANCE_ID_BA).augmentation(FlowCapableNode.class).toInstance());
164         assertNotNull(readedAugmentation);
165         assertEquals(fnu.getHardware(), readedAugmentation.getHardware());
166         
167         testPutNodeConnectorWithAugmentation();
168         testNodeRemove();
169     }
170
171     
172     private void testPutNodeConnectorWithAugmentation() throws Exception {
173         NodeConnectorKey ncKey = new NodeConnectorKey(new NodeConnectorId("test:0:0"));
174         InstanceIdentifier<NodeConnector> ncPath = InstanceIdentifier.builder(NODE_INSTANCE_ID_BA)
175         .child(NodeConnector.class, ncKey).toInstance();
176         InstanceIdentifier<FlowCapableNodeConnector> ncAugmentPath = InstanceIdentifier.builder(ncPath)
177         .augmentation(FlowCapableNodeConnector.class).toInstance();
178         
179         NodeConnectorBuilder nc = new NodeConnectorBuilder();
180         nc.setKey(ncKey);
181         
182         FlowCapableNodeConnectorBuilder fncb = new FlowCapableNodeConnectorBuilder();
183         fncb.setName("Baz");
184         nc.addAugmentation(FlowCapableNodeConnector.class, fncb.build());
185         
186         DataModificationTransaction baseTransaction = baDataService.beginTransaction();
187         baseTransaction.putOperationalData(ncPath, nc.build());
188         RpcResult<TransactionStatus> result = baseTransaction.commit().get();
189         assertEquals(TransactionStatus.COMMITED, result.getResult());
190         
191         FlowCapableNodeConnector readedAugmentation = (FlowCapableNodeConnector) baDataService.readOperationalData(ncAugmentPath);
192         assertNotNull(readedAugmentation);
193         assertEquals(fncb.getName(), readedAugmentation.getName());
194     }
195
196     private void testNodeRemove() throws Exception {
197         DataModificationTransaction transaction = baDataService.beginTransaction();
198         transaction.removeOperationalData(NODE_INSTANCE_ID_BA);
199         RpcResult<TransactionStatus> result = transaction.commit().get();
200         assertEquals(TransactionStatus.COMMITED, result.getResult());
201         
202         Node node = (Node) baDataService.readOperationalData(NODE_INSTANCE_ID_BA);
203         assertNull(node);
204     }
205
206     private void verifyNodes(Nodes nodes,Node original) {
207         assertNotNull(nodes);
208         assertNotNull(nodes.getNode());
209         assertEquals(1, nodes.getNode().size());
210         Node readedNode = nodes.getNode().get(0);
211         assertEquals(original.getId(), readedNode.getId());
212         assertEquals(original.getKey(), readedNode.getKey());
213         
214         FlowCapableNode fnu = original.getAugmentation(FlowCapableNode.class);
215         FlowCapableNode readedAugment = readedNode.getAugmentation(FlowCapableNode.class);
216         assertNotNull(fnu);
217         assertEquals(fnu.getDescription(), readedAugment.getDescription());
218         assertEquals(fnu.getSerialNumber(), readedAugment.getSerialNumber());
219         
220     }
221
222     private void assertBindingIndependentVersion(
223             org.opendaylight.yangtools.yang.data.api.InstanceIdentifier nodeId) {
224         CompositeNode node = biDataService.readOperationalData(nodeId);
225         assertNotNull(node);
226     }
227
228     private Nodes checkForNodes() {
229         return (Nodes) baDataService.readOperationalData(NODES_INSTANCE_ID_BA);
230     }
231     
232     @Override
233     public void onDataChanged(DataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
234         receivedChangeEvent = change;
235     }
236
237 }