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 org.opendaylight.infrautils.utils.concurrent.LoggingFutures;
13 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecNwTtlCaseBuilder;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.nw.ttl._case.DecNwTtlBuilder;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInputBuilder;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg0;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxRegCaseBuilder;
38 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;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.load.grouping.NxRegLoadBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.load.grouping.nx.reg.load.DstBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.test.rev130819.TestFlowInput;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.test.rev130819.TestFlowOutput;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.test.rev130819.TestService;
44 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
45 import org.opendaylight.yangtools.yang.binding.util.BindingMap;
46 import org.opendaylight.yangtools.yang.common.RpcResult;
47 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
48 import org.opendaylight.yangtools.yang.common.Uint16;
49 import org.opendaylight.yangtools.yang.common.Uint32;
50 import org.opendaylight.yangtools.yang.common.Uint64;
51 import org.opendaylight.yangtools.yang.common.Uint8;
52 import org.slf4j.Logger;
53 import org.slf4j.LoggerFactory;
56 * Implementation of TestService.
60 public class Test implements TestService {
61 private static final Logger LOG = LoggerFactory.getLogger(Test.class);
63 private SalFlowService flowService;
66 public ListenableFuture<RpcResult<TestFlowOutput>> testFlow(final TestFlowInput input) {
67 // Construct the flow instance id
68 final InstanceIdentifier<Node> flowInstanceId = InstanceIdentifier
69 .builder(Nodes.class) // File under nodes
70 // A particular node identified by nodeKey
71 .child(Node.class, new NodeKey(new NodeId("openflow:1"))).build();
73 pushFlowViaRpc(new AddFlowInputBuilder()
74 .setPriority(Uint16.TWO)
75 .setMatch(new MatchBuilder()
76 .setLayer3Match(new Ipv4MatchBuilder().setIpv4Destination(new Ipv4Prefix("10.0.0.1/24")).build())
77 .setEthernetMatch(new EthernetMatchBuilder()
78 .setEthernetType(new EthernetTypeBuilder().setType(new EtherType(Uint32.valueOf(0x0800))).build())
80 // .addAugmentation(createNxMatchAugment().getAugmentationObject())
82 .setInstructions(new InstructionsBuilder()
83 .setInstruction(BindingMap.of(new InstructionBuilder()
85 .setInstruction(new ApplyActionsCaseBuilder()
86 .setApplyActions(new ApplyActionsBuilder()
87 .setAction(BindingMap.of(new ActionBuilder()
89 .setAction(new DecNwTtlCaseBuilder().setDecNwTtl(new DecNwTtlBuilder().build()).build())
90 .build(), new ActionBuilder()
93 .setAction(new NxActionRegLoadNodesNodeTableFlowApplyActionsCaseBuilder()
95 .setNxRegLoad(new NxRegLoadBuilder()
96 .setDst(new DstBuilder()
97 .setDstChoice(new DstNxRegCaseBuilder().setNxReg(NxmNxReg0.VALUE).build())
98 .setStart(Uint16.ZERO)
99 .setEnd(Uint16.valueOf(5))
101 .setValue(Uint64.valueOf(55L))
109 .setBarrier(Boolean.FALSE)
110 .setCookie(new FlowCookie(Uint64.TEN))
111 .setCookieMask(new FlowCookie(Uint64.TEN))
112 .setHardTimeout(Uint16.ZERO)
113 .setIdleTimeout(Uint16.ZERO)
116 .setContainerName(null)
117 .setFlags(new FlowModFlags(false, false, false, false, true))
118 .setTableId(Uint8.ZERO)
119 .setFlowName("NiciraFLOW")
120 .setNode(new NodeRef(flowInstanceId))
123 return Futures.immediateFuture(RpcResultBuilder.<TestFlowOutput>status(true).build());
126 private void pushFlowViaRpc(final AddFlowInput addFlowInput) {
127 if (flowService != null) {
128 LoggingFutures.addErrorLogging(flowService.addFlow(addFlowInput), LOG, "addFlow");
132 public void setFlowService(final SalFlowService flowService) {
133 this.flowService = flowService;