Fix checkstyle violations in openflowplugin extensions
[openflowplugin.git] / extension / test-extension / src / main / java / org / opendaylight / openflowplugin / extension / test / Test.java
1 /**
2  * Copyright (c) 2014 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.extension.test;
9
10 import com.google.common.util.concurrent.Futures;
11 import java.math.BigInteger;
12 import java.util.ArrayList;
13 import java.util.List;
14 import java.util.concurrent.Future;
15 import org.opendaylight.openflowplugin.extension.api.AugmentTuple;
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.Match;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionKey;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4Match;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg0;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxRegCaseBuilder;
48 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;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.load.grouping.NxRegLoadBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.load.grouping.nx.reg.load.DstBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.test.rev130819.TestFlowInput;
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
57 /**
58  * Implementation of TestService.
59  *
60  * @author msunal
61  */
62 public class Test implements TestService {
63
64     private SalFlowService flowService;
65
66
67     @Override
68     public Future<RpcResult<Void>> testFlow(TestFlowInput input) {
69         AddFlowInputBuilder flow = new AddFlowInputBuilder();
70         flow.setPriority(2);
71         flow.setMatch(createMatchBld().build());
72         flow.setInstructions(createDecNwTtlInstructionsBld().build());
73         flow.setBarrier(Boolean.FALSE);
74         BigInteger value = BigInteger.valueOf(10L);
75         flow.setCookie(new FlowCookie(value));
76         flow.setCookieMask(new FlowCookie(value));
77         flow.setHardTimeout(0);
78         flow.setIdleTimeout(0);
79         flow.setInstallHw(false);
80         flow.setStrict(false);
81         flow.setContainerName(null);
82         flow.setFlags(new FlowModFlags(false, false, false, false, true));
83         flow.setTableId((short) 0);
84
85         flow.setFlowName("NiciraFLOW");
86
87         // Construct the flow instance id
88         final InstanceIdentifier<Node> flowInstanceId = InstanceIdentifier
89                 .builder(Nodes.class) // File under nodes
90                 // A particular node identified by nodeKey
91                 .child(Node.class, new NodeKey(new NodeId("openflow:1"))).build();
92         flow.setNode(new NodeRef(flowInstanceId));
93
94         pushFlowViaRpc(flow.build());
95
96         return Futures.immediateFuture(RpcResultBuilder.<Void>status(true).build());
97     }
98
99     private void pushFlowViaRpc(AddFlowInput addFlowInput) {
100         flowService.addFlow(addFlowInput);
101     }
102
103     public void setFlowService(SalFlowService flowService) {
104         this.flowService = flowService;
105     }
106
107     private static MatchBuilder createMatchBld() {
108         MatchBuilder match = new MatchBuilder();
109         Ipv4MatchBuilder ipv4Match = new Ipv4MatchBuilder();
110         Ipv4Prefix prefix = new Ipv4Prefix("10.0.0.1/24");
111         ipv4Match.setIpv4Destination(prefix);
112         Ipv4Match i4m = ipv4Match.build();
113         match.setLayer3Match(i4m);
114
115         EthernetMatchBuilder eth = new EthernetMatchBuilder();
116         EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
117         ethTypeBuilder.setType(new EtherType(0x0800L));
118         eth.setEthernetType(ethTypeBuilder.build());
119         match.setEthernetMatch(eth.build());
120
121 //        AugmentTuple<Match> extAugmentWrapper = createNxMatchAugment();
122 //        match.addAugmentation(extAugmentWrapper.getAugmentationClass(), extAugmentWrapper.getAugmentationObject());
123
124         return match;
125     }
126
127     private static AugmentTuple<Match> createNxMatchAugment() {
128         // TODO add example
129         return null;
130     }
131
132     private static InstructionsBuilder createDecNwTtlInstructionsBld() {
133         // Add our drop action to a list
134         List<Action> actionList = new ArrayList<>();
135         actionList.add(createOFAction(0).build());
136         actionList.add(createNxActionBld(1).build());
137
138         // Create an Apply Action
139         ApplyActionsBuilder aab = new ApplyActionsBuilder();
140         aab.setAction(actionList);
141
142         // Wrap our Apply Action in an Instruction
143         InstructionBuilder ib = new InstructionBuilder();
144         ib.setInstruction(new ApplyActionsCaseBuilder().setApplyActions(aab.build()).build());
145         ib.setKey(new InstructionKey(0));
146         ib.setOrder(0);
147
148         // Put our Instruction in a list of Instructions
149         InstructionsBuilder isb = new InstructionsBuilder();
150         List<Instruction> instructions = new ArrayList<>();
151         instructions.add(ib.build());
152         ib.setKey(new InstructionKey(0));
153         isb.setInstruction(instructions);
154         return isb;
155     }
156
157     private static ActionBuilder createOFAction(int actionKeyVal) {
158         DecNwTtlBuilder ta = new DecNwTtlBuilder();
159         DecNwTtl decNwTtl = ta.build();
160         ActionBuilder ab = new ActionBuilder();
161         ab.setAction(new DecNwTtlCaseBuilder().setDecNwTtl(decNwTtl).build());
162         ab.setKey(new ActionKey(actionKeyVal));
163         return ab;
164     }
165
166     private static ActionBuilder createNxActionBld(int actionKeyVal) {
167         // vendor part
168         DstNxRegCaseBuilder nxRegCaseBld = new DstNxRegCaseBuilder().setNxReg(NxmNxReg0.class);
169         DstBuilder dstBld = new DstBuilder()
170             .setDstChoice(nxRegCaseBld.build())
171             .setStart(0)
172             .setEnd(5);
173         NxRegLoadBuilder nxRegLoadBuilder = new NxRegLoadBuilder();
174         nxRegLoadBuilder.setDst(dstBld.build());
175         nxRegLoadBuilder.setValue(BigInteger.valueOf(55L));
176         NxActionRegLoadNodesNodeTableFlowApplyActionsCaseBuilder topNxActionCaseBld =
177                 new NxActionRegLoadNodesNodeTableFlowApplyActionsCaseBuilder();
178         topNxActionCaseBld.setNxRegLoad(nxRegLoadBuilder.build());
179
180         // base part
181         ActionBuilder abExt = new ActionBuilder();
182         abExt.setKey(new ActionKey(actionKeyVal));
183         abExt.setAction(topNxActionCaseBld.build());
184         return abExt;
185     }
186 }