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