Added support for switch idle state
[openflowjava.git] / openflow-protocol-impl / src / test / java / org / opendaylight / openflowjava / protocol / impl / integration / MockPlugin.java
1 /* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
2 package org.opendaylight.openflowjava.protocol.impl.integration;\r
3 \r
4 import java.lang.reflect.InvocationTargetException;\r
5 import java.net.InetAddress;\r
6 import java.util.Arrays;\r
7 import java.util.concurrent.ExecutionException;\r
8 import java.util.concurrent.TimeUnit;\r
9 import java.util.concurrent.TimeoutException;\r
10 \r
11 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter;\r
12 import org.opendaylight.openflowjava.protocol.api.connection.SwitchConnectionHandler;\r
13 import org.opendaylight.openflowjava.protocol.impl.util.BufferHelper;\r
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoReplyInput;\r
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoReplyInputBuilder;\r
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoRequestMessage;\r
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterMessage;\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowRemovedMessage;\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesInput;\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesInputBuilder;\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloInput;\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloInputBuilder;\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloMessage;\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessage;\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestMessage;\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OpenflowProtocolListener;\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessage;\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatusMessage;\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.DisconnectEvent;\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SwitchIdleEvent;\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SystemNotificationsListener;\r
34 import org.opendaylight.yangtools.yang.common.RpcError;\r
35 import org.opendaylight.yangtools.yang.common.RpcResult;\r
36 import org.slf4j.Logger;\r
37 import org.slf4j.LoggerFactory;\r
38 \r
39 import com.google.common.util.concurrent.SettableFuture;\r
40 \r
41 /**\r
42  * @author michal.polkorab\r
43  *\r
44  */\r
45 public class MockPlugin implements OpenflowProtocolListener, SwitchConnectionHandler, SystemNotificationsListener {\r
46 \r
47     private static final Logger LOGGER = LoggerFactory.getLogger(MockPlugin.class);\r
48     private ConnectionAdapter adapter;\r
49     private SettableFuture<Void> finishedFuture;\r
50     private int idleCounter = 0;\r
51     \r
52     public MockPlugin() {\r
53         finishedFuture = SettableFuture.create();\r
54     }\r
55     \r
56     @Override\r
57     public void onSwitchConnected(ConnectionAdapter connection) {\r
58         LOGGER.debug("onSwitchConnected");\r
59         this.adapter = connection;\r
60         connection.setMessageListener(this);\r
61         connection.setSystemListener(this);\r
62     }\r
63 \r
64     @Override\r
65     public boolean accept(InetAddress switchAddress) {\r
66         // TODO Auto-generated method stub\r
67         return true;\r
68     }\r
69 \r
70     @Override\r
71     public void onEchoRequestMessage(EchoRequestMessage notification) {\r
72         LOGGER.debug("EchoRequest message received");\r
73         LOGGER.debug("Building EchoReplyInput");\r
74         EchoReplyInputBuilder replyBuilder = new EchoReplyInputBuilder();\r
75         try {\r
76             BufferHelper.setupHeader(replyBuilder);\r
77         } catch (NoSuchMethodException | SecurityException\r
78                 | IllegalAccessException | IllegalArgumentException\r
79                 | InvocationTargetException e) {\r
80             LOGGER.error(e.getMessage(), e);\r
81         }\r
82         replyBuilder.setXid(notification.getXid());\r
83         EchoReplyInput echoReplyInput = replyBuilder.build();\r
84         LOGGER.debug("EchoReplyInput built");\r
85         LOGGER.debug("Going to send EchoReplyInput");\r
86         adapter.echoReply(echoReplyInput);\r
87         LOGGER.debug("EchoReplyInput sent");\r
88     }\r
89 \r
90     @Override\r
91     public void onErrorMessage(ErrorMessage notification) {\r
92         LOGGER.debug("Error message received");\r
93         \r
94     }\r
95 \r
96     @Override\r
97     public void onExperimenterMessage(ExperimenterMessage notification) {\r
98         LOGGER.debug("Experimenter message received");\r
99         \r
100     }\r
101 \r
102     @Override\r
103     public void onFlowRemovedMessage(FlowRemovedMessage notification) {\r
104         LOGGER.debug("FlowRemoved message received");\r
105         \r
106     }\r
107 \r
108     @Override\r
109     public void onHelloMessage(HelloMessage notification) {\r
110         LOGGER.debug("Hello message received");\r
111         HelloInputBuilder hib = new HelloInputBuilder();\r
112         GetFeaturesInputBuilder featuresBuilder = new GetFeaturesInputBuilder();\r
113         try {\r
114             BufferHelper.setupHeader(hib);\r
115             BufferHelper.setupHeader(featuresBuilder);\r
116         } catch (Exception e) {\r
117            LOGGER.error(e.getMessage(), e);\r
118         }\r
119         HelloInput hi = hib.build();\r
120         adapter.hello(hi);\r
121         LOGGER.debug("hello msg sent");\r
122         GetFeaturesInput featuresInput = featuresBuilder.build();\r
123         try {\r
124             LOGGER.debug("Going to send featuresRequest");\r
125             RpcResult<GetFeaturesOutput> rpcResult = adapter.getFeatures(\r
126                     featuresInput).get(2500, TimeUnit.MILLISECONDS);\r
127             if (rpcResult.isSuccessful()) {\r
128                 byte[] byteArray = rpcResult.getResult().getDatapathId()\r
129                         .toByteArray();\r
130                 LOGGER.debug("DatapathId: " + Arrays.toString(byteArray));\r
131             } else {\r
132                 RpcError rpcError = rpcResult.getErrors().iterator().next();\r
133                 LOGGER.warn("rpcResult failed: "\r
134                         + rpcError.getCause().getMessage(), rpcError.getCause());\r
135             }\r
136         } catch (InterruptedException | ExecutionException | TimeoutException e) {\r
137             LOGGER.error(e.getMessage(), e);\r
138         }\r
139         LOGGER.info("After FeaturesReply message - disconnecting");\r
140         adapter.disconnect();\r
141         finishedFuture.set(null);\r
142     }\r
143 \r
144     @Override\r
145     public void onMultipartReplyMessage(MultipartReplyMessage notification) {\r
146         LOGGER.debug("MultipartReply message received");\r
147         \r
148     }\r
149 \r
150     @Override\r
151     public void onMultipartRequestMessage(MultipartRequestMessage notification) {\r
152         LOGGER.debug("MultipartRequest message received");\r
153         \r
154     }\r
155 \r
156     @Override\r
157     public void onPacketInMessage(PacketInMessage notification) {\r
158         LOGGER.debug("PacketIn message received");\r
159         \r
160     }\r
161 \r
162     @Override\r
163     public void onPortStatusMessage(PortStatusMessage notification) {\r
164         LOGGER.debug("PortStatus message received");\r
165         \r
166     }\r
167 \r
168     @Override\r
169     public void onDisconnectEvent(DisconnectEvent notification) {\r
170         LOGGER.debug("disconnection ocured: "+notification.getInfo());\r
171     }\r
172 \r
173     public SettableFuture<Void> getFinishedFuture() {\r
174         return finishedFuture;\r
175     }\r
176 \r
177     @Override\r
178     public void onSwitchIdleEvent(SwitchIdleEvent notification) {\r
179         LOGGER.debug("switch status: "+notification.getInfo());\r
180         idleCounter ++;\r
181     }\r
182     \r
183     public int getIdleCounter() {\r
184         return idleCounter;\r
185     }\r
186 \r
187 \r
188 }\r