Merge "Update context-instance xpath format according to latest changes in config...
[controller.git] / opendaylight / md-sal / sal-binding-broker / 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         
120         registerCommitHandler();
121         
122         CompositeNode domflow = createXmlFlow();
123         DataModificationTransaction biTransaction = biDataService.beginTransaction();
124         biTransaction.putConfigurationData(FLOW_INSTANCE_ID_BI, domflow);
125         RpcResult<TransactionStatus> biResult = biTransaction.commit().get();
126         
127         assertNotNull(modificationCapture);
128         Flow flow = (Flow) modificationCapture.getCreatedConfigurationData().get(FLOW_INSTANCE_ID_BA);
129         assertNotNull(flow);
130         assertNotNull(flow.getMatch());
131         assertEquals(TransactionStatus.COMMITED, biResult.getResult());
132         
133     }
134
135     
136
137     private void registerCommitHandler() {
138         DataCommitHandler<InstanceIdentifier<? extends DataObject>, DataObject> flowTestCommitHandler = new DataCommitHandler<InstanceIdentifier<? extends DataObject>, DataObject>() {
139             
140             
141             @Override
142             public org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler.DataCommitTransaction<InstanceIdentifier<? extends DataObject>, DataObject> requestCommit(
143                     DataModification<InstanceIdentifier<? extends DataObject>, DataObject> modification) {
144                 modificationCapture = modification;
145                 return CommitHandlersTransactions.allwaysSuccessfulTransaction(modification);
146             }
147             
148             
149         };
150         Registration<DataCommitHandler<InstanceIdentifier<? extends DataObject>, DataObject>> registration = baDataService.registerCommitHandler(FLOWS_PATH_BA, flowTestCommitHandler);
151         assertNotNull(registration);
152     }
153     
154     private CompositeNode createXmlFlow() {
155         
156         FlowBuilder flow = new FlowBuilder();
157         MatchBuilder match = new MatchBuilder();
158         VlanMatchBuilder vlanBuilder = new VlanMatchBuilder();
159         VlanIdBuilder vlanIdBuilder = new VlanIdBuilder();
160         VlanId vlanId = new VlanId(10);
161         vlanBuilder.setVlanId(vlanIdBuilder.setVlanId(vlanId).build());
162         match.setVlanMatch(vlanBuilder.build());
163
164         flow.setKey(FLOW_KEY);
165         flow.setMatch(match.build());
166         flow.setNode(NODE_REF);
167         InstructionsBuilder instructions = new InstructionsBuilder();
168         InstructionBuilder instruction = new InstructionBuilder();
169         ApplyActionsBuilder applyActions = new ApplyActionsBuilder();
170         List<Action> actionList = new ArrayList<>();
171         PopMplsActionBuilder popMplsAction = new PopMplsActionBuilder();
172         popMplsAction.setEthernetType(34);
173         actionList.add(new ActionBuilder().setAction(popMplsAction.build()).build());
174
175         applyActions.setAction(actionList );
176         
177
178
179         instruction.setInstruction(applyActions.build());
180
181
182         List<Instruction> instructionList = Collections.<Instruction>singletonList(instruction.build());
183         instructions.setInstruction(instructionList );
184
185         flow.setInstructions(instructions.build());
186         
187         CompositeNode domFlow = mappingService.toDataDom(flow.build());
188         return domFlow;
189     }
190 }