Added test-provider project.
[openflowplugin.git] / test-provider / src / main / java / org / opendaylight / openflowplugin / test / OpenflowpluginTestCommandProvider.java
1
2 /*
3  * Copyright (c) 2013 Ericsson , Inc. and others.  All rights reserved.
4  *
5  * This program and the accompanying materials are made available under the
6  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
7  * and is available at http://www.eclipse.org/legal/epl-v10.html
8  */
9
10 package org.opendaylight.openflowplugin.test;
11
12
13 import java.util.ArrayList;
14 import java.util.List;
15 import java.util.concurrent.ExecutionException;
16 import java.util.concurrent.Future;
17
18 import org.eclipse.osgi.framework.console.CommandInterpreter;
19 import org.eclipse.osgi.framework.console.CommandProvider;
20 import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
21 import org.opendaylight.controller.md.sal.common.api.data.DataModification;
22 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
23 import org.opendaylight.controller.sal.binding.api.data.DataBrokerService;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DropAction;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DropActionBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.Flows;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.flows.Flow;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.flows.FlowBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.flows.FlowKey;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
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.yangtools.yang.binding.DataObject;
47 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
48 import org.opendaylight.yangtools.yang.common.RpcResult;
49 import org.osgi.framework.BundleContext;
50
51
52
53 public class OpenflowpluginTestCommandProvider implements CommandProvider {
54
55         private DataBrokerService dataBrokerService;
56         private ProviderContext pc;
57         private BundleContext ctx;
58         private Flow testFlow;
59     private Node testNode;
60     private String originalFlowName = "Foo";
61     private String updatedFlowName = "Bar";
62
63         public OpenflowpluginTestCommandProvider(BundleContext ctx) {
64             this.ctx = ctx;
65         }
66
67         public void onSessionInitiated(ProviderContext session) {
68             pc = session;
69                 dataBrokerService = session.getSALService(DataBrokerService.class);
70                 ctx.registerService(CommandProvider.class.getName(), this, null);
71                 createTestNode();
72                 createTestFlow();
73     }
74
75         private void createTestNode() {
76             NodeRef nodeOne = createNodeRef(OpenflowpluginTestActivator.NODE_ID);
77         NodeBuilder builder = new NodeBuilder();
78         builder.setId(new NodeId(OpenflowpluginTestActivator.NODE_ID));
79         builder.setKey(new NodeKey(builder.getId()));
80         testNode = builder.build();
81         }
82
83         private InstanceIdentifier<Node> nodeToInstanceId(Node node) {
84             return InstanceIdentifier.builder(Nodes.class).child(Node.class, node.getKey()).toInstance();
85         }
86
87         private void createTestFlow() {
88         // Sample data , committing to DataStore
89         DataModification modification = (DataModification) dataBrokerService.beginTransaction();
90         long id = 123;
91         FlowKey key = new FlowKey(id, new NodeRef(new NodeRef(nodeToInstanceId(testNode))));
92         FlowBuilder flow = new FlowBuilder();
93         flow.setKey(key);
94         MatchBuilder match = new MatchBuilder();
95         Ipv4MatchBuilder ipv4Match = new Ipv4MatchBuilder();
96         // ipv4Match.setIpv4Destination(new Ipv4Prefix(cliInput.get(4)));
97         Ipv4Prefix prefix = new Ipv4Prefix("10.0.0.1/24");
98         ipv4Match.setIpv4Destination(prefix);
99         Ipv4Match i4m = ipv4Match.build();
100         match.setLayer3Match(i4m);
101         flow.setMatch(match.build());
102         DropAction dropAction = new DropActionBuilder().build();
103         ApplyActionsBuilder aab = new ApplyActionsBuilder();
104         ActionBuilder ab = new ActionBuilder();
105         ab.setAction(dropAction);
106         List<Action> actionList = new ArrayList<Action>();
107         actionList.add(ab.build());
108         aab.setAction(actionList);
109         InstructionBuilder ib = new InstructionBuilder();
110         ib.setInstruction(aab.build());
111         InstructionsBuilder isb = new InstructionsBuilder();
112         List<Instruction> instructions = new ArrayList<Instruction>();
113         isb.setInstruction(instructions);
114         flow.setInstructions(isb.build());
115      //   ActionBuilder action = new ActionBuilder();
116
117       //  List<org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.Action> actions = Collections
118              //   .singletonList(action.build());
119      //   flow.setAction(actions);
120         flow.setPriority(2);
121         flow.setFlowName(originalFlowName);
122         testFlow = flow.build();
123         }
124
125         public void _removeFlow(CommandInterpreter ci) {
126             DataModification modification = (DataModification) dataBrokerService.beginTransaction();
127         InstanceIdentifier<Flow> path1 = InstanceIdentifier.builder(Flows.class).child(Flow.class, testFlow.getKey()).toInstance();
128         DataObject cls = (DataObject) modification.readConfigurationData(path1);
129         modification.removeOperationalData(nodeToInstanceId(testNode));
130         modification.removeOperationalData(path1);
131         modification.removeConfigurationData(nodeToInstanceId(testNode));
132         modification.removeConfigurationData(path1);
133         Future<RpcResult<TransactionStatus>> commitFuture = modification.commit();
134         try {
135             RpcResult<TransactionStatus> result = commitFuture.get();
136             TransactionStatus status = result.getResult();
137             ci.println("Status of Flow Data Loaded Transaction: " + status);
138
139         } catch (InterruptedException e) {
140             // TODO Auto-generated catch block
141             e.printStackTrace();
142         } catch (ExecutionException e) {
143             // TODO Auto-generated catch block
144             e.printStackTrace();
145         }
146         }
147
148         public void _addFlow(CommandInterpreter ci) {
149         writeFlow(ci, testFlow);
150     }
151
152         private void writeFlow(CommandInterpreter ci,Flow flow) {
153             DataModification modification = (DataModification) dataBrokerService.beginTransaction();
154         InstanceIdentifier<Flow> path1 = InstanceIdentifier.builder(Flows.class).child(Flow.class, flow.getKey()).toInstance();
155         DataObject cls = (DataObject) modification.readConfigurationData(path1);
156         modification.putOperationalData(nodeToInstanceId(testNode), testNode);
157         modification.putOperationalData(path1, flow);
158         modification.putConfigurationData(nodeToInstanceId(testNode), testNode);
159         modification.putConfigurationData(path1, flow);
160         Future<RpcResult<TransactionStatus>> commitFuture = modification.commit();
161         try {
162             RpcResult<TransactionStatus> result = commitFuture.get();
163             TransactionStatus status = result.getResult();
164             ci.println("Status of Flow Data Loaded Transaction: " + status);
165
166         } catch (InterruptedException e) {
167             // TODO Auto-generated catch block
168             e.printStackTrace();
169         } catch (ExecutionException e) {
170             // TODO Auto-generated catch block
171             e.printStackTrace();
172         }
173         }
174
175         public void _modifyFlow(CommandInterpreter ci) {
176             FlowBuilder flow = new FlowBuilder(testFlow);
177             flow.setFlowName(updatedFlowName);
178             writeFlow(ci, flow.build());
179             flow.setFlowName(originalFlowName);
180             writeFlow(ci, flow.build());
181         }
182
183         private static NodeRef createNodeRef(String string) {
184         NodeKey key = new NodeKey(new NodeId(string));
185         InstanceIdentifier<Node> path =
186                 InstanceIdentifier.builder().node(Nodes.class).node(Node.class, key).toInstance();
187
188         return new NodeRef(path);
189     }
190
191     @Override
192     public String getHelp() {
193         return "No help";
194     }
195 }
196