3 * Copyright (c) 2013 Ericsson , Inc. and others. All rights reserved.
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
10 package org.opendaylight.openflowplugin.test;
13 import java.util.ArrayList;
14 import java.util.List;
15 import java.util.concurrent.ExecutionException;
16 import java.util.concurrent.Future;
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;
53 public class OpenflowpluginTestCommandProvider implements CommandProvider {
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";
63 public OpenflowpluginTestCommandProvider(BundleContext ctx) {
67 public void onSessionInitiated(ProviderContext session) {
69 dataBrokerService = session.getSALService(DataBrokerService.class);
70 ctx.registerService(CommandProvider.class.getName(), this, null);
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();
83 private InstanceIdentifier<Node> nodeToInstanceId(Node node) {
84 return InstanceIdentifier.builder(Nodes.class).child(Node.class, node.getKey()).toInstance();
87 private void createTestFlow() {
88 // Sample data , committing to DataStore
89 DataModification modification = (DataModification) dataBrokerService.beginTransaction();
91 FlowKey key = new FlowKey(id, new NodeRef(new NodeRef(nodeToInstanceId(testNode))));
92 FlowBuilder flow = new FlowBuilder();
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();
117 // List<org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.Action> actions = Collections
118 // .singletonList(action.build());
119 // flow.setAction(actions);
121 flow.setFlowName(originalFlowName);
122 testFlow = flow.build();
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();
135 RpcResult<TransactionStatus> result = commitFuture.get();
136 TransactionStatus status = result.getResult();
137 ci.println("Status of Flow Data Loaded Transaction: " + status);
139 } catch (InterruptedException e) {
140 // TODO Auto-generated catch block
142 } catch (ExecutionException e) {
143 // TODO Auto-generated catch block
148 public void _addFlow(CommandInterpreter ci) {
149 writeFlow(ci, testFlow);
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();
162 RpcResult<TransactionStatus> result = commitFuture.get();
163 TransactionStatus status = result.getResult();
164 ci.println("Status of Flow Data Loaded Transaction: " + status);
166 } catch (InterruptedException e) {
167 // TODO Auto-generated catch block
169 } catch (ExecutionException e) {
170 // TODO Auto-generated catch block
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());
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();
188 return new NodeRef(path);
192 public String getHelp() {