8a287a92ba138f3834cb8a6a4498fdb5d649b2bf
[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 java.math.BigInteger;
11 import java.util.ArrayList;
12 import java.util.concurrent.ExecutionException;
13 import java.util.concurrent.Future;
14
15 import org.apache.commons.lang.ArrayUtils;
16 import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
17 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
18 import org.opendaylight.controller.sal.binding.api.data.DataBrokerService;
19 import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCaseBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableKey;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionKey;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInput;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInputBuilder;
54 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
55 import org.opendaylight.yangtools.yang.common.RpcResult;
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         DataBrokerService dataBrokerService = pc.<DataBrokerService>getSALService(DataBrokerService.class);
102         DataModificationTransaction modif = dataBrokerService.beginTransaction();
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.putConfigurationData(path, flowBuilder.build());
112         Future<RpcResult<TransactionStatus>> commitFuture = modif.commit();
113
114         try {
115             RpcResult<TransactionStatus> resutl = commitFuture.get();
116             TransactionStatus status = resutl.getResult();
117             return "Status of Flow Data Loaded Transaction: " + status;
118
119         } catch (InterruptedException e) {
120             e.printStackTrace();
121             return e.getClass().getName();
122         } catch (ExecutionException e) {
123             e.printStackTrace();
124             return e.getClass().getName();
125         }
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 }