import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.List;
+import javax.annotation.PreDestroy;
+import javax.inject.Inject;
+import javax.inject.Singleton;
import org.opendaylight.infrautils.utils.concurrent.LoggingFutures;
+import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry;
+import org.opendaylight.mdsal.binding.api.RpcProviderService;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecNwTtlCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.nw.ttl._case.DecNwTtl;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.nw.ttl._case.DecNwTtlBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlow;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4Match;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg0;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxRegCaseBuilder;
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;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.load.grouping.NxRegLoadBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.load.grouping.nx.reg.load.DstBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.test.rev130819.TestFlow;
import org.opendaylight.yang.gen.v1.urn.opendaylight.test.rev130819.TestFlowInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.test.rev130819.TestFlowOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.test.rev130819.TestService;
+import org.opendaylight.yangtools.concepts.Registration;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.util.BindingMap;
import org.opendaylight.yangtools.yang.common.RpcResult;
import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
import org.opendaylight.yangtools.yang.common.Uint16;
import org.opendaylight.yangtools.yang.common.Uint32;
import org.opendaylight.yangtools.yang.common.Uint64;
import org.opendaylight.yangtools.yang.common.Uint8;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
*
* @author msunal
*/
-public class Test implements TestService {
+@Singleton
+@Component(service = { })
+public final class Test implements TestFlow, AutoCloseable {
private static final Logger LOG = LoggerFactory.getLogger(Test.class);
- private SalFlowService flowService;
+ private final AddFlow addFlow;
+ private final Registration reg;
+ @Inject
+ @Activate
+ public Test(@Reference final RpcConsumerRegistry rpcService,
+ @Reference final RpcProviderService rpcProviderService) {
+ addFlow = rpcService.getRpc(AddFlow.class);
+ reg = rpcProviderService.registerRpcImplementation(this);
+ }
+ @PreDestroy
+ @Deactivate
@Override
- public ListenableFuture<RpcResult<TestFlowOutput>> testFlow(TestFlowInput input) {
- AddFlowInputBuilder flow = new AddFlowInputBuilder();
- flow.setPriority(Uint16.TWO);
- flow.setMatch(createMatchBld().build());
- flow.setInstructions(createDecNwTtlInstructionsBld().build());
- flow.setBarrier(Boolean.FALSE);
- flow.setCookie(new FlowCookie(Uint64.TEN));
- flow.setCookieMask(new FlowCookie(Uint64.TEN));
- flow.setHardTimeout(Uint16.ZERO);
- flow.setIdleTimeout(Uint16.ZERO);
- flow.setInstallHw(false);
- flow.setStrict(false);
- flow.setContainerName(null);
- flow.setFlags(new FlowModFlags(false, false, false, false, true));
- flow.setTableId(Uint8.ZERO);
-
- flow.setFlowName("NiciraFLOW");
+ public void close() {
+ reg.close();
+ }
+ @Override
+ public ListenableFuture<RpcResult<TestFlowOutput>> invoke(final TestFlowInput input) {
// Construct the flow instance id
final InstanceIdentifier<Node> flowInstanceId = InstanceIdentifier
.builder(Nodes.class) // File under nodes
// A particular node identified by nodeKey
.child(Node.class, new NodeKey(new NodeId("openflow:1"))).build();
- flow.setNode(new NodeRef(flowInstanceId));
- pushFlowViaRpc(flow.build());
+ pushFlowViaRpc(new AddFlowInputBuilder()
+ .setPriority(Uint16.TWO)
+ .setMatch(new MatchBuilder()
+ .setLayer3Match(new Ipv4MatchBuilder().setIpv4Destination(new Ipv4Prefix("10.0.0.1/24")).build())
+ .setEthernetMatch(new EthernetMatchBuilder()
+ .setEthernetType(new EthernetTypeBuilder().setType(new EtherType(Uint32.valueOf(0x0800))).build())
+ .build())
+ // .addAugmentation(createNxMatchAugment().getAugmentationObject())
+ .build())
+ .setInstructions(new InstructionsBuilder()
+ .setInstruction(BindingMap.of(new InstructionBuilder()
+ .setOrder(0)
+ .setInstruction(new ApplyActionsCaseBuilder()
+ .setApplyActions(new ApplyActionsBuilder()
+ .setAction(BindingMap.of(new ActionBuilder()
+ .setOrder(0)
+ .setAction(new DecNwTtlCaseBuilder().setDecNwTtl(new DecNwTtlBuilder().build()).build())
+ .build(), new ActionBuilder()
+ // base part
+ .setOrder(1)
+ .setAction(new NxActionRegLoadNodesNodeTableFlowApplyActionsCaseBuilder()
+ // vendor part
+ .setNxRegLoad(new NxRegLoadBuilder()
+ .setDst(new DstBuilder()
+ .setDstChoice(new DstNxRegCaseBuilder().setNxReg(NxmNxReg0.VALUE).build())
+ .setStart(Uint16.ZERO)
+ .setEnd(Uint16.valueOf(5))
+ .build())
+ .setValue(Uint64.valueOf(55L))
+ .build())
+ .build())
+ .build()))
+ .build())
+ .build())
+ .build()))
+ .build())
+ .setBarrier(Boolean.FALSE)
+ .setCookie(new FlowCookie(Uint64.TEN))
+ .setCookieMask(new FlowCookie(Uint64.TEN))
+ .setHardTimeout(Uint16.ZERO)
+ .setIdleTimeout(Uint16.ZERO)
+ .setInstallHw(false)
+ .setStrict(false)
+ .setContainerName(null)
+ .setFlags(new FlowModFlags(false, false, false, false, true))
+ .setTableId(Uint8.ZERO)
+ .setFlowName("NiciraFLOW")
+ .setNode(new NodeRef(flowInstanceId))
+ .build());
return Futures.immediateFuture(RpcResultBuilder.<TestFlowOutput>status(true).build());
}
- private void pushFlowViaRpc(AddFlowInput addFlowInput) {
- if (flowService != null) {
- LoggingFutures.addErrorLogging(flowService.addFlow(addFlowInput), LOG, "addFlow");
+ private void pushFlowViaRpc(final AddFlowInput addFlowInput) {
+ if (addFlow != null) {
+ LoggingFutures.addErrorLogging(addFlow.invoke(addFlowInput), LOG, "addFlow");
}
}
-
- public void setFlowService(SalFlowService flowService) {
- this.flowService = flowService;
- }
-
- private static MatchBuilder createMatchBld() {
- MatchBuilder match = new MatchBuilder();
- Ipv4MatchBuilder ipv4Match = new Ipv4MatchBuilder();
- Ipv4Prefix prefix = new Ipv4Prefix("10.0.0.1/24");
- ipv4Match.setIpv4Destination(prefix);
- Ipv4Match i4m = ipv4Match.build();
- match.setLayer3Match(i4m);
-
- EthernetMatchBuilder eth = new EthernetMatchBuilder();
- EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
- ethTypeBuilder.setType(new EtherType(Uint32.valueOf(0x0800)));
- eth.setEthernetType(ethTypeBuilder.build());
- match.setEthernetMatch(eth.build());
-
-// AugmentTuple<Match> extAugmentWrapper = createNxMatchAugment();
-// match.addAugmentation(extAugmentWrapper.getAugmentationClass(), extAugmentWrapper.getAugmentationObject());
-
- return match;
- }
-
- private static InstructionsBuilder createDecNwTtlInstructionsBld() {
- // Add our drop action to a list
- List<Action> actionList = new ArrayList<>();
- actionList.add(createOFAction(0).build());
- actionList.add(createNxActionBld(1).build());
-
- // Create an Apply Action
- ApplyActionsBuilder aab = new ApplyActionsBuilder();
- aab.setAction(actionList);
-
- // Wrap our Apply Action in an Instruction
- InstructionBuilder ib = new InstructionBuilder();
- ib.setInstruction(new ApplyActionsCaseBuilder().setApplyActions(aab.build()).build());
- ib.withKey(new InstructionKey(0));
- ib.setOrder(0);
-
- // Put our Instruction in a list of Instructions
- InstructionsBuilder isb = new InstructionsBuilder();
- List<Instruction> instructions = new ArrayList<>();
- instructions.add(ib.build());
- ib.withKey(new InstructionKey(0));
- isb.setInstruction(instructions);
- return isb;
- }
-
- private static ActionBuilder createOFAction(int actionKeyVal) {
- DecNwTtlBuilder ta = new DecNwTtlBuilder();
- DecNwTtl decNwTtl = ta.build();
- ActionBuilder ab = new ActionBuilder();
- ab.setAction(new DecNwTtlCaseBuilder().setDecNwTtl(decNwTtl).build());
- ab.withKey(new ActionKey(actionKeyVal));
- return ab;
- }
-
- private static ActionBuilder createNxActionBld(int actionKeyVal) {
- // vendor part
- DstNxRegCaseBuilder nxRegCaseBld = new DstNxRegCaseBuilder().setNxReg(NxmNxReg0.class);
- DstBuilder dstBld = new DstBuilder()
- .setDstChoice(nxRegCaseBld.build())
- .setStart(Uint16.ZERO)
- .setEnd(Uint16.valueOf(5));
- NxRegLoadBuilder nxRegLoadBuilder = new NxRegLoadBuilder();
- nxRegLoadBuilder.setDst(dstBld.build());
- nxRegLoadBuilder.setValue(BigInteger.valueOf(55L));
- NxActionRegLoadNodesNodeTableFlowApplyActionsCaseBuilder topNxActionCaseBld =
- new NxActionRegLoadNodesNodeTableFlowApplyActionsCaseBuilder();
- topNxActionCaseBld.setNxRegLoad(nxRegLoadBuilder.build());
-
- // base part
- ActionBuilder abExt = new ActionBuilder();
- abExt.withKey(new ActionKey(actionKeyVal));
- abExt.setAction(topNxActionCaseBld.build());
- return abExt;
- }
}