Merge "SwitchMgrNB: URL does not allow nodeconnectorId with forward slash"
[controller.git] / opendaylight / md-sal / sal-binding-dom-it / src / test / java / org / opendaylight / controller / sal / binding / test / bugfix / DOMCodecBug03Test.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 static org.junit.Assert.assertEquals;
10 import static org.junit.Assert.assertFalse;
11 import static org.junit.Assert.assertNotNull;
12 import static org.junit.Assert.assertNull;
13
14 import java.util.Collections;
15 import java.util.List;
16 import java.util.Map;
17
18 import org.junit.Test;
19 import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
20 import org.opendaylight.controller.md.sal.common.api.data.DataChangeEvent;
21 import org.opendaylight.controller.sal.binding.api.data.DataChangeListener;
22 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
23 import org.opendaylight.controller.sal.binding.test.AbstractDataServiceTest;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.flow.node.SupportedActions;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.flow.node.SupportedActionsBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.flow.node.supported.actions.ActionType;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.flow.node.supported.actions.ActionTypeBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.SupportType;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
40 import org.opendaylight.yangtools.yang.binding.DataObject;
41 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
42 import org.opendaylight.yangtools.yang.common.QName;
43 import org.opendaylight.yangtools.yang.common.RpcResult;
44 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
45
46 public class DOMCodecBug03Test extends AbstractDataServiceTest implements DataChangeListener {
47
48     private static final QName NODE_ID_QNAME = QName.create(Node.QNAME, "id");
49     private static final String NODE_ID = "openflow:1";
50
51     private static final NodeKey NODE_KEY = new NodeKey(new NodeId(NODE_ID));
52
53     private static final Map<QName, Object> NODE_KEY_BI = Collections.<QName, Object> singletonMap(NODE_ID_QNAME,
54             NODE_ID);
55
56     private static final InstanceIdentifier<Nodes> NODES_INSTANCE_ID_BA = InstanceIdentifier.builder(Nodes.class) //
57             .toInstance();
58
59
60     private static final InstanceIdentifier<Node> NODE_INSTANCE_ID_BA = InstanceIdentifier//
61             .builder(NODES_INSTANCE_ID_BA) //
62             .child(Node.class, NODE_KEY).toInstance();
63
64
65     private static final InstanceIdentifier<SupportedActions> SUPPORTED_ACTIONS_INSTANCE_ID_BA = InstanceIdentifier//
66             .builder(NODES_INSTANCE_ID_BA) //
67             .child(Node.class, NODE_KEY) //
68             .augmentation(FlowCapableNode.class) //
69             .child(SupportedActions.class)
70             .toInstance();
71
72
73     private static final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier NODE_INSTANCE_ID_BI = //
74     org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.builder() //
75             .node(Nodes.QNAME) //
76             .nodeWithKey(Node.QNAME, NODE_KEY_BI) //
77             .toInstance();
78     private static final QName SUPPORTED_ACTIONS_QNAME = QName.create(FlowCapableNode.QNAME, SupportedActions.QNAME.getLocalName());
79
80
81     private static final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier SUPPORTED_ACTIONS_INSTANCE_ID_BI = //
82             org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.builder() //
83                     .node(Nodes.QNAME) //
84                     .nodeWithKey(Node.QNAME, NODE_KEY_BI) //
85                     .node(SUPPORTED_ACTIONS_QNAME) //
86                     .toInstance();
87
88     private DataChangeEvent<InstanceIdentifier<?>, DataObject> receivedChangeEvent;
89
90
91
92     /**
93      * Test for Bug 148
94      *
95      * @throws Exception
96      */
97     @Test
98     public void testAugmentSerialization() throws Exception {
99
100
101         baDataService.registerDataChangeListener(NODES_INSTANCE_ID_BA, this);
102
103         NodeBuilder nodeBuilder = new NodeBuilder();
104         nodeBuilder.setId(new NodeId(NODE_ID));
105         nodeBuilder.setKey(NODE_KEY);
106         DataModificationTransaction transaction = baDataService.beginTransaction();
107
108
109         FlowCapableNodeBuilder fnub = new FlowCapableNodeBuilder();
110         fnub.setHardware("Hardware Foo");
111         fnub.setManufacturer("Manufacturer Foo");
112         fnub.setSerialNumber("Serial Foo");
113         fnub.setDescription("Description Foo");
114         fnub.setSoftware("JUnit emulated");
115         FlowCapableNode fnu = fnub.build();
116         nodeBuilder.addAugmentation(FlowCapableNode.class, fnu);
117         Node original = nodeBuilder.build();
118         transaction.putOperationalData(NODE_INSTANCE_ID_BA, original);
119
120         RpcResult<TransactionStatus> result = transaction.commit().get();
121         assertEquals(TransactionStatus.COMMITED, result.getResult());
122
123         assertNotNull(receivedChangeEvent);
124
125         verifyNodes((Nodes) receivedChangeEvent.getUpdatedOperationalSubtree(),original);
126         assertBindingIndependentVersion(NODE_INSTANCE_ID_BI);
127         Nodes nodes = checkForNodes();
128         verifyNodes(nodes,original);
129
130         testAddingNodeConnector();
131         testNodeRemove();
132
133     }
134
135     @Test
136     public void testAugmentNestedSerialization() throws Exception {
137         DataModificationTransaction transaction = baDataService.beginTransaction();
138
139         SupportedActionsBuilder actions = new SupportedActionsBuilder();
140         ActionTypeBuilder action = new ActionTypeBuilder();
141         action.setAction("foo-action");
142         action.setSupportState(SupportType.Native);
143         List<ActionType> actionTypes = Collections.singletonList(action.build());
144         actions.setActionType(actionTypes );
145
146         transaction.putOperationalData(SUPPORTED_ACTIONS_INSTANCE_ID_BA, actions.build());
147         RpcResult<TransactionStatus> putResult = transaction.commit().get();
148         assertNotNull(putResult);
149         assertEquals(TransactionStatus.COMMITED, putResult.getResult());
150         SupportedActions readedTable = (SupportedActions) baDataService.readOperationalData(SUPPORTED_ACTIONS_INSTANCE_ID_BA);
151         assertNotNull(readedTable);
152
153         CompositeNode biSupportedActions = biDataService.readOperationalData(SUPPORTED_ACTIONS_INSTANCE_ID_BI);
154         assertNotNull(biSupportedActions);
155
156     }
157
158     private void testAddingNodeConnector() throws Exception {
159
160         NodeConnectorId ncId = new NodeConnectorId("openflow:1:bar");
161         NodeConnectorKey nodeKey = new NodeConnectorKey(ncId );
162         InstanceIdentifier<NodeConnector> ncInstanceId = InstanceIdentifier.builder(NODE_INSTANCE_ID_BA).child(NodeConnector.class, nodeKey).toInstance();
163         NodeConnectorBuilder ncBuilder = new NodeConnectorBuilder();
164         ncBuilder.setId(ncId);
165         ncBuilder.setKey(nodeKey);
166         NodeConnector connector = ncBuilder.build();
167         DataModificationTransaction transaction = baDataService.beginTransaction();
168         transaction.putOperationalData(ncInstanceId, connector);
169         RpcResult<TransactionStatus> result = transaction.commit().get();
170         assertEquals(TransactionStatus.COMMITED, result.getResult());
171         Node node = (Node) baDataService.readOperationalData(NODE_INSTANCE_ID_BA);
172         assertNotNull(node);
173         assertNotNull(node.getNodeConnector());
174         assertFalse(node.getNodeConnector().isEmpty());
175         NodeConnector readedNc = node.getNodeConnector().get(0);
176         assertNotNull(readedNc);
177     }
178
179     private void testNodeRemove() throws Exception {
180         DataModificationTransaction transaction = baDataService.beginTransaction();
181         transaction.removeOperationalData(NODE_INSTANCE_ID_BA);
182         RpcResult<TransactionStatus> result = transaction.commit().get();
183         assertEquals(TransactionStatus.COMMITED, result.getResult());
184
185         Node node = (Node) baDataService.readOperationalData(NODE_INSTANCE_ID_BA);
186         assertNull(node);
187     }
188
189     private void verifyNodes(Nodes nodes,Node original) {
190         assertNotNull(nodes);
191         assertNotNull(nodes.getNode());
192         assertEquals(1, nodes.getNode().size());
193         Node readedNode = nodes.getNode().get(0);
194         assertEquals(original.getId(), readedNode.getId());
195         assertEquals(original.getKey(), readedNode.getKey());
196
197         FlowCapableNode fnu = original.getAugmentation(FlowCapableNode.class);
198         FlowCapableNode readedAugment = readedNode.getAugmentation(FlowCapableNode.class);
199         assertNotNull(fnu);
200         assertEquals(fnu.getDescription(), readedAugment.getDescription());
201         assertEquals(fnu.getSerialNumber(), readedAugment.getSerialNumber());
202
203     }
204
205     private void assertBindingIndependentVersion(
206             org.opendaylight.yangtools.yang.data.api.InstanceIdentifier nodeId) {
207         CompositeNode node = biDataService.readOperationalData(nodeId);
208         assertNotNull(node);
209     }
210
211     private Nodes checkForNodes() {
212         return (Nodes) baDataService.readOperationalData(NODES_INSTANCE_ID_BA);
213     }
214
215     @Override
216     public void onDataChanged(DataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
217         receivedChangeEvent = change;
218     }
219
220 }