Bug 1458 - Migrate to next MD-SAL dataStore API
[openflowplugin.git] / drop-test / src / main / java / org / opendaylight / openflowplugin / outputtest / OutputTestUtil.java
1 /**
2  * Copyright (c) 2013 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.openflowplugin.outputtest;
9
10 import com.google.common.util.concurrent.CheckedFuture;
11 import com.google.common.util.concurrent.FutureCallback;
12 import com.google.common.util.concurrent.Futures;
13 import java.math.BigInteger;
14 import java.util.ArrayList;
15 import org.apache.commons.lang.ArrayUtils;
16 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
17 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
18 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
19 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
20 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCaseBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableKey;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionKey;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInput;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInputBuilder;
55 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
56
57 public class OutputTestUtil {
58
59     private OutputTestUtil() {
60         throw new UnsupportedOperationException("Utility class. Instantiation is not allowed.");
61     }
62
63     public static TransmitPacketInput buildTransmitInputPacket(final String nodeId, final byte[] packValue,
64                                                                final String outPort, final String inPort) {
65         ArrayList<Byte> list = new ArrayList<Byte>(40);
66         byte[] msg = new String("sendOutputMsg_TEST").getBytes();
67
68         int index = 0;
69         for (byte b : msg) {
70             list.add(b);
71             index = index < 7 ? index + 1 : 0;
72         }
73
74         while (index < 8) {
75             list.add((byte) 0);
76             index++;
77         }
78         NodeRef ref = createNodeRef(nodeId);
79         NodeConnectorRef nEgressConfRef = new NodeConnectorRef(createNodeConnRef(nodeId, outPort));
80
81         NodeConnectorRef nIngressConRef = new NodeConnectorRef(createNodeConnRef(nodeId, inPort));
82
83         TransmitPacketInputBuilder tPackBuilder = new TransmitPacketInputBuilder();
84
85         final ArrayList<Byte> _converted_list = list;
86         byte[] _primitive = ArrayUtils.toPrimitive(_converted_list.toArray(new Byte[0]));
87         tPackBuilder.setPayload(_primitive);
88
89         tPackBuilder.setNode(ref);
90         // TODO VD P2 missing cookies in Test
91         tPackBuilder.setConnectionCookie(null);
92         tPackBuilder.setEgress(nEgressConfRef);
93         tPackBuilder.setIngress(nIngressConRef);
94         return tPackBuilder.build();
95     }
96
97     public static String makePingFlowForNode(final String nodeId, final ProviderContext pc) {
98         NodeBuilder nodeBuilder = createNodeBuilder(nodeId);
99         FlowBuilder flowBuilder = createFlowBuilder(1235, null, "ping");
100
101         DataBroker dataBroker = pc.<DataBroker>getSALService(DataBroker.class);
102         ReadWriteTransaction modif = dataBroker.newReadWriteTransaction();
103
104         InstanceIdentifier<Flow> path = InstanceIdentifier.<Nodes>builder(Nodes.class)
105                 .<Node, NodeKey>child(Node.class, nodeBuilder.getKey())
106                 .<FlowCapableNode>augmentation(FlowCapableNode.class)
107                 .<Table, TableKey>child(Table.class, new TableKey(flowBuilder.getTableId()))
108                 .<Flow, FlowKey>child(Flow.class, flowBuilder.getKey())
109                 .build();
110
111         modif.put(LogicalDatastoreType.CONFIGURATION, path, flowBuilder.build());
112         CheckedFuture<Void, TransactionCommitFailedException> commitFuture = modif.submit();
113         final StringBuffer aggregator = new StringBuffer();
114         Futures.addCallback(commitFuture, new FutureCallback<Void>() {
115             @Override
116             public void onSuccess(Void aVoid) {
117                 aggregator.append("Status of Flow Data Loaded Transaction: succes ");
118             }
119
120             @Override
121             public void onFailure(Throwable throwable) {
122                 aggregator.append(throwable.getClass().getName());
123             }
124         });
125         return aggregator.toString();
126     }
127
128     public static NodeRef createNodeRef(final String nodeId) {
129         NodeKey key = new NodeKey(new NodeId(nodeId));
130         InstanceIdentifier<Node> path = InstanceIdentifier.<Nodes>builder(Nodes.class)
131                 .<Node, NodeKey>child(Node.class, key)
132                 .toInstance();
133         return new NodeRef(path);
134     }
135
136     public static NodeConnectorRef createNodeConnRef(final String nodeId, final String port) {
137         StringBuilder sBuild = new StringBuilder(nodeId).append(':').append(port);
138         NodeConnectorId _nodeConnectorId = new NodeConnectorId(sBuild.toString());
139
140         NodeConnectorKey nConKey = new NodeConnectorKey(new NodeConnectorId(sBuild.toString()));
141
142         InstanceIdentifier<NodeConnector> path = InstanceIdentifier.<Nodes>builder(Nodes.class)
143                 .<Node, NodeKey>child(Node.class, new NodeKey(new NodeId(nodeId)))
144                 .<NodeConnector, NodeConnectorKey>child(NodeConnector.class, nConKey)
145                 .toInstance();
146
147         return new NodeConnectorRef(path);
148     }
149
150     private static NodeBuilder createNodeBuilder(final String nodeId) {
151         NodeBuilder builder = new NodeBuilder();
152         builder.setId(new NodeId(nodeId));
153         builder.setKey(new NodeKey(builder.getId()));
154         return builder;
155     }
156
157     private static FlowBuilder createFlowBuilder(final long flowId, final String tableId, final String flowName) {
158
159         FlowBuilder fBuild = new FlowBuilder();
160         fBuild.setMatch(new MatchBuilder().build());
161         fBuild.setInstructions(createPingInstructionsBuilder().build());
162
163         FlowKey key = new FlowKey(new FlowId(Long.toString(flowId)));
164         fBuild.setBarrier(false);
165         // flow.setBufferId(new Long(12));
166         final BigInteger value = BigInteger.valueOf(10);
167         fBuild.setCookie(new FlowCookie(value));
168         fBuild.setCookieMask(new FlowCookie(value));
169         fBuild.setHardTimeout(0);
170         fBuild.setIdleTimeout(0);
171         fBuild.setInstallHw(false);
172         fBuild.setStrict(false);
173         fBuild.setContainerName(null);
174         fBuild.setFlags(new FlowModFlags(false, false, false, false, false));
175         fBuild.setId(new FlowId("12"));
176         fBuild.setTableId(checkTableId(tableId));
177         fBuild.setOutGroup(2L);
178         fBuild.setOutPort(value);
179
180         fBuild.setKey(key);
181         fBuild.setPriority(2);
182         fBuild.setFlowName(flowName);
183         return fBuild;
184
185     }
186
187     private static InstructionsBuilder createPingInstructionsBuilder() {
188         ArrayList<Action> aList = new ArrayList<Action>();
189         ActionBuilder aBuild = new ActionBuilder();
190
191         OutputActionBuilder output = new OutputActionBuilder();
192         output.setMaxLength(56);
193         output.setOutputNodeConnector(new Uri("CONTROLLER"));
194         aBuild.setAction(new OutputActionCaseBuilder().setOutputAction(output.build()).build());
195         aBuild.setOrder(0);
196         aBuild.setKey(new ActionKey(0));
197         aList.add(aBuild.build());
198         ApplyActionsBuilder asBuild = new ApplyActionsBuilder();
199         asBuild.setAction(aList);
200
201         InstructionBuilder iBuild = new InstructionBuilder();
202         iBuild.setInstruction(new ApplyActionsCaseBuilder().setApplyActions(asBuild.build()).build());
203         iBuild.setOrder(0);
204         iBuild.setKey(new InstructionKey(0));
205
206         ArrayList<Instruction> instr = new ArrayList<Instruction>();
207         instr.add(iBuild.build());
208         return new InstructionsBuilder().setInstruction(instr);
209     }
210
211     private static short checkTableId(final String tableId) {
212         try {
213             return Short.parseShort(tableId);
214         } catch (Exception ex) {
215             return 2;
216         }
217     }
218 }