2 * Copyright (c) 2014 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.extension.test;
10 import com.google.common.util.concurrent.Futures;
11 import com.google.common.util.concurrent.ListenableFuture;
12 import java.math.BigInteger;
13 import java.util.ArrayList;
14 import java.util.List;
15 import org.opendaylight.infrautils.utils.concurrent.LoggingFutures;
16 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecNwTtlCaseBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.nw.ttl._case.DecNwTtl;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.nw.ttl._case.DecNwTtlBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInputBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionKey;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4Match;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg0;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxRegCaseBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nodes.node.table.flow.instructions.instruction.instruction.apply.actions._case.apply.actions.action.action.NxActionRegLoadNodesNodeTableFlowApplyActionsCaseBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.load.grouping.NxRegLoadBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.load.grouping.nx.reg.load.DstBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.test.rev130819.TestFlowInput;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.test.rev130819.TestFlowOutput;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.test.rev130819.TestService;
53 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
54 import org.opendaylight.yangtools.yang.common.RpcResult;
55 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
56 import org.opendaylight.yangtools.yang.common.Uint16;
57 import org.opendaylight.yangtools.yang.common.Uint32;
58 import org.opendaylight.yangtools.yang.common.Uint64;
59 import org.opendaylight.yangtools.yang.common.Uint8;
60 import org.slf4j.Logger;
61 import org.slf4j.LoggerFactory;
64 * Implementation of TestService.
68 public class Test implements TestService {
69 private static final Logger LOG = LoggerFactory.getLogger(Test.class);
71 private SalFlowService flowService;
75 public ListenableFuture<RpcResult<TestFlowOutput>> testFlow(TestFlowInput input) {
76 AddFlowInputBuilder flow = new AddFlowInputBuilder();
77 flow.setPriority(Uint16.TWO);
78 flow.setMatch(createMatchBld().build());
79 flow.setInstructions(createDecNwTtlInstructionsBld().build());
80 flow.setBarrier(Boolean.FALSE);
81 flow.setCookie(new FlowCookie(Uint64.TEN));
82 flow.setCookieMask(new FlowCookie(Uint64.TEN));
83 flow.setHardTimeout(Uint16.ZERO);
84 flow.setIdleTimeout(Uint16.ZERO);
85 flow.setInstallHw(false);
86 flow.setStrict(false);
87 flow.setContainerName(null);
88 flow.setFlags(new FlowModFlags(false, false, false, false, true));
89 flow.setTableId(Uint8.ZERO);
91 flow.setFlowName("NiciraFLOW");
93 // Construct the flow instance id
94 final InstanceIdentifier<Node> flowInstanceId = InstanceIdentifier
95 .builder(Nodes.class) // File under nodes
96 // A particular node identified by nodeKey
97 .child(Node.class, new NodeKey(new NodeId("openflow:1"))).build();
98 flow.setNode(new NodeRef(flowInstanceId));
100 pushFlowViaRpc(flow.build());
102 return Futures.immediateFuture(RpcResultBuilder.<TestFlowOutput>status(true).build());
105 private void pushFlowViaRpc(AddFlowInput addFlowInput) {
106 if (flowService != null) {
107 LoggingFutures.addErrorLogging(flowService.addFlow(addFlowInput), LOG, "addFlow");
111 public void setFlowService(SalFlowService flowService) {
112 this.flowService = flowService;
115 private static MatchBuilder createMatchBld() {
116 MatchBuilder match = new MatchBuilder();
117 Ipv4MatchBuilder ipv4Match = new Ipv4MatchBuilder();
118 Ipv4Prefix prefix = new Ipv4Prefix("10.0.0.1/24");
119 ipv4Match.setIpv4Destination(prefix);
120 Ipv4Match i4m = ipv4Match.build();
121 match.setLayer3Match(i4m);
123 EthernetMatchBuilder eth = new EthernetMatchBuilder();
124 EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
125 ethTypeBuilder.setType(new EtherType(Uint32.valueOf(0x0800)));
126 eth.setEthernetType(ethTypeBuilder.build());
127 match.setEthernetMatch(eth.build());
129 // AugmentTuple<Match> extAugmentWrapper = createNxMatchAugment();
130 // match.addAugmentation(extAugmentWrapper.getAugmentationClass(), extAugmentWrapper.getAugmentationObject());
135 private static InstructionsBuilder createDecNwTtlInstructionsBld() {
136 // Add our drop action to a list
137 List<Action> actionList = new ArrayList<>();
138 actionList.add(createOFAction(0).build());
139 actionList.add(createNxActionBld(1).build());
141 // Create an Apply Action
142 ApplyActionsBuilder aab = new ApplyActionsBuilder();
143 aab.setAction(actionList);
145 // Wrap our Apply Action in an Instruction
146 InstructionBuilder ib = new InstructionBuilder();
147 ib.setInstruction(new ApplyActionsCaseBuilder().setApplyActions(aab.build()).build());
148 ib.withKey(new InstructionKey(0));
151 // Put our Instruction in a list of Instructions
152 InstructionsBuilder isb = new InstructionsBuilder();
153 List<Instruction> instructions = new ArrayList<>();
154 instructions.add(ib.build());
155 ib.withKey(new InstructionKey(0));
156 isb.setInstruction(instructions);
160 private static ActionBuilder createOFAction(int actionKeyVal) {
161 DecNwTtlBuilder ta = new DecNwTtlBuilder();
162 DecNwTtl decNwTtl = ta.build();
163 ActionBuilder ab = new ActionBuilder();
164 ab.setAction(new DecNwTtlCaseBuilder().setDecNwTtl(decNwTtl).build());
165 ab.withKey(new ActionKey(actionKeyVal));
169 private static ActionBuilder createNxActionBld(int actionKeyVal) {
171 DstNxRegCaseBuilder nxRegCaseBld = new DstNxRegCaseBuilder().setNxReg(NxmNxReg0.class);
172 DstBuilder dstBld = new DstBuilder()
173 .setDstChoice(nxRegCaseBld.build())
174 .setStart(Uint16.ZERO)
175 .setEnd(Uint16.valueOf(5));
176 NxRegLoadBuilder nxRegLoadBuilder = new NxRegLoadBuilder();
177 nxRegLoadBuilder.setDst(dstBld.build());
178 nxRegLoadBuilder.setValue(BigInteger.valueOf(55L));
179 NxActionRegLoadNodesNodeTableFlowApplyActionsCaseBuilder topNxActionCaseBld =
180 new NxActionRegLoadNodesNodeTableFlowApplyActionsCaseBuilder();
181 topNxActionCaseBld.setNxRegLoad(nxRegLoadBuilder.build());
184 ActionBuilder abExt = new ActionBuilder();
185 abExt.withKey(new ActionKey(actionKeyVal));
186 abExt.setAction(topNxActionCaseBld.build());