Eliminate blueprint from test-extension
[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 com.google.common.util.concurrent.ListenableFuture;
12 import javax.annotation.PreDestroy;
13 import javax.inject.Inject;
14 import javax.inject.Singleton;
15 import org.opendaylight.infrautils.utils.concurrent.LoggingFutures;
16 import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry;
17 import org.opendaylight.mdsal.binding.api.RpcProviderService;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecNwTtlCaseBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.nw.ttl._case.DecNwTtlBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlow;
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.types.rev131026.FlowCookie;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg0;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxRegCaseBuilder;
43 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;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.load.grouping.NxRegLoadBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.load.grouping.nx.reg.load.DstBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.test.rev130819.TestFlow;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.test.rev130819.TestFlowInput;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.test.rev130819.TestFlowOutput;
49 import org.opendaylight.yangtools.concepts.Registration;
50 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
51 import org.opendaylight.yangtools.yang.binding.util.BindingMap;
52 import org.opendaylight.yangtools.yang.common.RpcResult;
53 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
54 import org.opendaylight.yangtools.yang.common.Uint16;
55 import org.opendaylight.yangtools.yang.common.Uint32;
56 import org.opendaylight.yangtools.yang.common.Uint64;
57 import org.opendaylight.yangtools.yang.common.Uint8;
58 import org.osgi.service.component.annotations.Activate;
59 import org.osgi.service.component.annotations.Component;
60 import org.osgi.service.component.annotations.Deactivate;
61 import org.osgi.service.component.annotations.Reference;
62 import org.slf4j.Logger;
63 import org.slf4j.LoggerFactory;
64
65 /**
66  * Implementation of TestService.
67  *
68  * @author msunal
69  */
70 @Singleton
71 @Component(service = { })
72 public final class Test implements TestFlow, AutoCloseable {
73     private static final Logger LOG = LoggerFactory.getLogger(Test.class);
74
75     private final AddFlow addFlow;
76     private final Registration reg;
77
78     @Inject
79     @Activate
80     public Test(@Reference final RpcConsumerRegistry rpcService,
81             @Reference final RpcProviderService rpcProviderService) {
82         addFlow = rpcService.getRpc(AddFlow.class);
83         reg = rpcProviderService.registerRpcImplementation(this);
84     }
85
86     @PreDestroy
87     @Deactivate
88     @Override
89     public void close() {
90         reg.close();
91     }
92
93     @Override
94     public ListenableFuture<RpcResult<TestFlowOutput>> invoke(final TestFlowInput input) {
95         // Construct the flow instance id
96         final InstanceIdentifier<Node> flowInstanceId = InstanceIdentifier
97                 .builder(Nodes.class) // File under nodes
98                 // A particular node identified by nodeKey
99                 .child(Node.class, new NodeKey(new NodeId("openflow:1"))).build();
100
101         pushFlowViaRpc(new AddFlowInputBuilder()
102             .setPriority(Uint16.TWO)
103             .setMatch(new MatchBuilder()
104                 .setLayer3Match(new Ipv4MatchBuilder().setIpv4Destination(new Ipv4Prefix("10.0.0.1/24")).build())
105                 .setEthernetMatch(new EthernetMatchBuilder()
106                     .setEthernetType(new EthernetTypeBuilder().setType(new EtherType(Uint32.valueOf(0x0800))).build())
107                     .build())
108                 // .addAugmentation(createNxMatchAugment().getAugmentationObject())
109                 .build())
110             .setInstructions(new InstructionsBuilder()
111                 .setInstruction(BindingMap.of(new InstructionBuilder()
112                     .setOrder(0)
113                     .setInstruction(new ApplyActionsCaseBuilder()
114                         .setApplyActions(new ApplyActionsBuilder()
115                             .setAction(BindingMap.of(new ActionBuilder()
116                                 .setOrder(0)
117                                 .setAction(new DecNwTtlCaseBuilder().setDecNwTtl(new DecNwTtlBuilder().build()).build())
118                                 .build(), new ActionBuilder()
119                                 // base part
120                                 .setOrder(1)
121                                 .setAction(new NxActionRegLoadNodesNodeTableFlowApplyActionsCaseBuilder()
122                                     // vendor part
123                                     .setNxRegLoad(new NxRegLoadBuilder()
124                                         .setDst(new DstBuilder()
125                                             .setDstChoice(new DstNxRegCaseBuilder().setNxReg(NxmNxReg0.VALUE).build())
126                                             .setStart(Uint16.ZERO)
127                                             .setEnd(Uint16.valueOf(5))
128                                             .build())
129                                         .setValue(Uint64.valueOf(55L))
130                                         .build())
131                                     .build())
132                                 .build()))
133                             .build())
134                         .build())
135                     .build()))
136                 .build())
137             .setBarrier(Boolean.FALSE)
138             .setCookie(new FlowCookie(Uint64.TEN))
139             .setCookieMask(new FlowCookie(Uint64.TEN))
140             .setHardTimeout(Uint16.ZERO)
141             .setIdleTimeout(Uint16.ZERO)
142             .setInstallHw(false)
143             .setStrict(false)
144             .setContainerName(null)
145             .setFlags(new FlowModFlags(false, false, false, false, true))
146             .setTableId(Uint8.ZERO)
147             .setFlowName("NiciraFLOW")
148             .setNode(new NodeRef(flowInstanceId))
149             .build());
150
151         return Futures.immediateFuture(RpcResultBuilder.<TestFlowOutput>status(true).build());
152     }
153
154     private void pushFlowViaRpc(final AddFlowInput addFlowInput) {
155         if (addFlow != null) {
156             LoggingFutures.addErrorLogging(addFlow.invoke(addFlowInput), LOG, "addFlow");
157         }
158     }
159 }