1 package org.opendaylight.controller.sal.binding.test.connect.dom;
3 import static org.junit.Assert.assertEquals;
4 import static org.junit.Assert.assertNotNull;
5 import static org.junit.Assert.assertNull;
17 import java.util.ArrayList;
18 import java.util.Collections;
19 import java.util.List;
21 import java.util.concurrent.Future;
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;
68 import com.google.common.collect.ImmutableMap;
70 public class ChangeOriginatedInDomBrokerTest extends AbstractDataServiceTest {
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";
78 private DataModification<InstanceIdentifier<? extends DataObject>, DataObject> modificationCapture;
81 private static final NodeKey NODE_KEY = new NodeKey(new NodeId(NODE_ID));
83 private static final Map<QName, Object> NODE_KEY_BI = Collections.<QName, Object> singletonMap(NODE_ID_QNAME,
86 private static final InstanceIdentifier<Node> NODE_INSTANCE_ID_BA = InstanceIdentifier.builder(Nodes.class) //
87 .child(Node.class, NODE_KEY).toInstance();
89 private static final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier NODE_INSTANCE_ID_BI = //
90 org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.builder() //
92 .nodeWithKey(Node.QNAME, NODE_KEY_BI) //
94 private static final NodeRef NODE_REF = new NodeRef(NODE_INSTANCE_ID_BA);
96 private static final FlowKey FLOW_KEY = new FlowKey(FLOW_ID, NODE_REF);
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);
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) //
107 private static final InstanceIdentifier<Flows> FLOWS_PATH_BA = //
108 InstanceIdentifier.builder(Flows.class) //
112 private static final InstanceIdentifier<Flow> FLOW_INSTANCE_ID_BA = //
113 InstanceIdentifier.builder(Flows.class) //
114 .child(Flow.class, FLOW_KEY) //
118 public void simpleModifyOperation() throws Exception {
120 registerCommitHandler();
122 CompositeNode domflow = createXmlFlow();
123 DataModificationTransaction biTransaction = biDataService.beginTransaction();
124 biTransaction.putConfigurationData(FLOW_INSTANCE_ID_BI, domflow);
125 RpcResult<TransactionStatus> biResult = biTransaction.commit().get();
127 assertNotNull(modificationCapture);
128 Flow flow = (Flow) modificationCapture.getCreatedConfigurationData().get(FLOW_INSTANCE_ID_BA);
130 assertNotNull(flow.getMatch());
131 assertEquals(TransactionStatus.COMMITED, biResult.getResult());
137 private void registerCommitHandler() {
138 DataCommitHandler<InstanceIdentifier<? extends DataObject>, DataObject> flowTestCommitHandler = new DataCommitHandler<InstanceIdentifier<? extends DataObject>, DataObject>() {
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);
150 Registration<DataCommitHandler<InstanceIdentifier<? extends DataObject>, DataObject>> registration = baDataService.registerCommitHandler(FLOWS_PATH_BA, flowTestCommitHandler);
151 assertNotNull(registration);
154 private CompositeNode createXmlFlow() {
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());
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 instruction.setOrder(10);
170 ApplyActionsBuilder applyActions = new ApplyActionsBuilder();
171 List<Action> actionList = new ArrayList<>();
172 PopMplsActionBuilder popMplsAction = new PopMplsActionBuilder();
173 popMplsAction.setEthernetType(34);
174 actionList.add(new ActionBuilder().setAction(popMplsAction.build()).setOrder(0).build());
176 applyActions.setAction(actionList );
180 instruction.setInstruction(applyActions.build());
183 List<Instruction> instructionList = Collections.<Instruction>singletonList(instruction.build());
184 instructions.setInstruction(instructionList );
186 flow.setInstructions(instructions.build());
188 CompositeNode domFlow = mappingService.toDataDom(flow.build());