2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.openflowplugin.outputtest;
10 import com.google.common.util.concurrent.CheckedFuture;
11 import com.google.common.util.concurrent.FutureCallback;
12 import com.google.common.util.concurrent.Futures;
14 import java.math.BigInteger;
15 import java.util.ArrayList;
16 import java.util.List;
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;
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);
67 private OutputTestUtil() {
68 throw new UnsupportedOperationException("Utility class. Instantiation is not allowed.");
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();
79 index = index < 7 ? index + 1 : 0;
86 NodeRef ref = createNodeRef(nodeId);
87 NodeConnectorRef nEgressConfRef = new NodeConnectorRef(createNodeConnRef(nodeId, outPort));
89 NodeConnectorRef nIngressConRef = new NodeConnectorRef(createNodeConnRef(nodeId, inPort));
91 TransmitPacketInputBuilder tPackBuilder = new TransmitPacketInputBuilder();
93 final List<Byte> convertedList = list;
94 byte[] primitive = ArrayUtils.toPrimitive(convertedList.toArray(new Byte[0]));
95 tPackBuilder.setPayload(primitive);
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();
105 public static String makePingFlowForNode(final String nodeId, final ProviderContext pc) {
106 NodeBuilder nodeBuilder = createNodeBuilder(nodeId);
107 FlowBuilder flowBuilder = createFlowBuilder(1235, null, "ping");
109 DataBroker dataBroker = pc.<DataBroker>getSALService(DataBroker.class);
110 ReadWriteTransaction modif = dataBroker.newReadWriteTransaction();
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())
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>() {
124 public void onSuccess(Void aVoid) {
125 aggregator.append("Status of Flow Data Loaded Transaction: succes ");
129 public void onFailure(Throwable throwable) {
130 aggregator.append(throwable.getClass().getName());
133 return aggregator.toString();
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)
141 return new NodeRef(path);
144 public static NodeConnectorRef createNodeConnRef(final String nodeId, final String port) {
145 StringBuilder sBuild = new StringBuilder(nodeId).append(':').append(port);
147 NodeConnectorKey nConKey = new NodeConnectorKey(new NodeConnectorId(sBuild.toString()));
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)
154 return new NodeConnectorRef(path);
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()));
164 private static FlowBuilder createFlowBuilder(final long flowId, final String tableId, final String flowName) {
166 FlowBuilder fBuild = new FlowBuilder();
167 fBuild.setMatch(new MatchBuilder().build());
168 fBuild.setInstructions(createPingInstructionsBuilder().build());
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);
187 fBuild.setPriority(2);
188 fBuild.setFlowName(flowName);
193 private static InstructionsBuilder createPingInstructionsBuilder() {
194 List<Action> aList = new ArrayList<Action>();
195 ActionBuilder aBuild = new ActionBuilder();
197 OutputActionBuilder output = new OutputActionBuilder();
198 output.setMaxLength(56);
199 output.setOutputNodeConnector(new Uri("CONTROLLER"));
200 aBuild.setAction(new OutputActionCaseBuilder().setOutputAction(output.build()).build());
202 aBuild.setKey(new ActionKey(0));
203 aList.add(aBuild.build());
204 ApplyActionsBuilder asBuild = new ApplyActionsBuilder();
205 asBuild.setAction(aList);
207 InstructionBuilder iBuild = new InstructionBuilder();
208 iBuild.setInstruction(new ApplyActionsCaseBuilder().setApplyActions(asBuild.build()).build());
210 iBuild.setKey(new InstructionKey(0));
212 List<Instruction> instr = new ArrayList<Instruction>();
213 instr.add(iBuild.build());
214 return new InstructionsBuilder().setInstruction(instr);
217 private static short checkTableId(final String tableId) {
219 return Short.parseShort(tableId);
220 } catch (Exception ex) {
221 LOG.debug("TableId problem: ",ex);