7111501b5392e174d25b16d456da6493cdfe3d77
[controller.git] / opendaylight / md-sal / sal-binding-dom-it / src / test / java / org / opendaylight / controller / sal / binding / test / connect / dom / ChangeOriginatedInDomBrokerTest.java
1 package org.opendaylight.controller.sal.binding.test.connect.dom;
2
3 import static org.junit.Assert.assertEquals;
4 import static org.junit.Assert.assertNotNull;
5 import static org.junit.Assert.assertNull;
6
7
8
9
10
11
12
13
14
15
16
17 import java.util.ArrayList;
18 import java.util.Collections;
19 import java.util.List;
20 import java.util.Map;
21 import java.util.concurrent.Future;
22
23
24
25
26
27
28
29
30
31
32
33 import org.junit.Test;
34 import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
35 import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler;
36 import org.opendaylight.controller.md.sal.common.api.data.DataModification;
37 import org.opendaylight.controller.sal.binding.impl.connect.dom.CommitHandlersTransactions;
38 import org.opendaylight.controller.sal.binding.test.AbstractDataServiceTest;
39 import org.opendaylight.controller.sal.core.api.data.DataModificationTransaction;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsActionBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.Flows;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.flows.Flow;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.flows.FlowBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.flows.FlowKey;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanIdBuilder;
61 import org.opendaylight.yangtools.concepts.Registration;
62 import org.opendaylight.yangtools.yang.binding.DataObject;
63 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
64 import org.opendaylight.yangtools.yang.common.QName;
65 import org.opendaylight.yangtools.yang.common.RpcResult;
66 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
67
68 import com.google.common.collect.ImmutableMap;
69
70 public class ChangeOriginatedInDomBrokerTest extends AbstractDataServiceTest {
71
72     private static final QName NODE_ID_QNAME = QName.create(Node.QNAME, "id");
73     private static final QName FLOW_ID_QNAME = QName.create(Flow.QNAME, "id");
74     private static final QName FLOW_NODE_QNAME = QName.create(Flow.QNAME, "node");
75     private static final long FLOW_ID = 1234;
76     private static final String NODE_ID = "node:1";
77     
78     private DataModification<InstanceIdentifier<? extends DataObject>, DataObject> modificationCapture;
79
80
81     private static final NodeKey NODE_KEY = new NodeKey(new NodeId(NODE_ID));
82
83     private static final Map<QName, Object> NODE_KEY_BI = Collections.<QName, Object> singletonMap(NODE_ID_QNAME,
84             NODE_ID);
85
86     private static final InstanceIdentifier<Node> NODE_INSTANCE_ID_BA = InstanceIdentifier.builder(Nodes.class) //
87             .child(Node.class, NODE_KEY).toInstance();
88
89     private static final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier NODE_INSTANCE_ID_BI = //
90     org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.builder() //
91             .node(Nodes.QNAME) //
92             .nodeWithKey(Node.QNAME, NODE_KEY_BI) //
93             .toInstance();
94     private static final NodeRef NODE_REF = new NodeRef(NODE_INSTANCE_ID_BA);
95
96     private static final FlowKey FLOW_KEY = new FlowKey(FLOW_ID, NODE_REF);
97
98     private static final Map<QName, Object> FLOW_KEY_BI = //
99     ImmutableMap.<QName, Object> of(FLOW_ID_QNAME, FLOW_ID, FLOW_NODE_QNAME, NODE_INSTANCE_ID_BI);
100
101     private static final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier FLOW_INSTANCE_ID_BI = //
102     org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.builder() //
103             .node(Flows.QNAME) //
104             .nodeWithKey(Flow.QNAME, FLOW_KEY_BI) //
105             .toInstance();
106     
107     private static final InstanceIdentifier<Flows> FLOWS_PATH_BA = //
108             InstanceIdentifier.builder(Flows.class) //
109                     .toInstance();
110             
111     
112     private static final InstanceIdentifier<Flow> FLOW_INSTANCE_ID_BA = //
113     InstanceIdentifier.builder(Flows.class) //
114             .child(Flow.class, FLOW_KEY) //
115             .toInstance();
116     
117     @Test
118     public void simpleModifyOperation() throws Exception {
119         assertNull(biDataService.readConfigurationData(FLOW_INSTANCE_ID_BI));
120         
121         registerCommitHandler();
122         
123         CompositeNode domflow = createXmlFlow();
124         DataModificationTransaction biTransaction = biDataService.beginTransaction();
125         biTransaction.putConfigurationData(FLOW_INSTANCE_ID_BI, domflow);
126         RpcResult<TransactionStatus> biResult = biTransaction.commit().get();
127         assertEquals(TransactionStatus.COMMITED, biResult.getResult());
128         assertNotNull(modificationCapture);
129         Flow flow = (Flow) modificationCapture.getCreatedConfigurationData().get(FLOW_INSTANCE_ID_BA);
130         assertNotNull(flow);
131         assertNotNull(flow.getMatch());
132         assertEquals(TransactionStatus.COMMITED, biResult.getResult());
133         
134     }
135
136     
137
138     private void registerCommitHandler() {
139         DataCommitHandler<InstanceIdentifier<? extends DataObject>, DataObject> flowTestCommitHandler = new DataCommitHandler<InstanceIdentifier<? extends DataObject>, DataObject>() {
140             
141             
142             @Override
143             public org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler.DataCommitTransaction<InstanceIdentifier<? extends DataObject>, DataObject> requestCommit(
144                     DataModification<InstanceIdentifier<? extends DataObject>, DataObject> modification) {
145                 modificationCapture = modification;
146                 return CommitHandlersTransactions.allwaysSuccessfulTransaction(modification);
147             }
148             
149             
150         };
151         Registration<DataCommitHandler<InstanceIdentifier<? extends DataObject>, DataObject>> registration = baDataService.registerCommitHandler(FLOWS_PATH_BA, flowTestCommitHandler);
152         assertNotNull(registration);
153     }
154     
155     private CompositeNode createXmlFlow() {
156         
157         FlowBuilder flow = new FlowBuilder();
158         MatchBuilder match = new MatchBuilder();
159         VlanMatchBuilder vlanBuilder = new VlanMatchBuilder();
160         VlanIdBuilder vlanIdBuilder = new VlanIdBuilder();
161         VlanId vlanId = new VlanId(10);
162         vlanBuilder.setVlanId(vlanIdBuilder.setVlanId(vlanId).build());
163         match.setVlanMatch(vlanBuilder.build());
164
165         flow.setKey(FLOW_KEY);
166         flow.setMatch(match.build());
167         flow.setNode(NODE_REF);
168         InstructionsBuilder instructions = new InstructionsBuilder();
169         InstructionBuilder instruction = new InstructionBuilder();
170         instruction.setOrder(10);
171         ApplyActionsBuilder applyActions = new ApplyActionsBuilder();
172         List<Action> actionList = new ArrayList<>();
173         PopMplsActionBuilder popMplsAction = new PopMplsActionBuilder();
174         popMplsAction.setEthernetType(34);
175         actionList.add(new ActionBuilder().setAction(popMplsAction.build()).setOrder(0).build());
176
177         applyActions.setAction(actionList );
178         
179
180
181         instruction.setInstruction(applyActions.build());
182
183
184         List<Instruction> instructionList = Collections.<Instruction>singletonList(instruction.build());
185         instructions.setInstruction(instructionList );
186
187         flow.setInstructions(instructions.build());
188         
189         CompositeNode domFlow = mappingService.toDataDom(flow.build());
190         return domFlow;
191     }
192 }