32 package org.openkilda.floodlight;
34 import static org.junit.Assert.fail;
36 import java.util.ArrayList;
37 import java.util.Collection;
38 import java.util.Collections;
39 import java.util.HashMap;
40 import java.util.Iterator;
41 import java.util.List;
43 import java.util.Map.Entry;
44 import java.util.concurrent.ConcurrentHashMap;
45 import java.util.concurrent.ConcurrentLinkedQueue;
46 import java.util.concurrent.ConcurrentMap;
47 import java.util.concurrent.ExecutorService;
48 import java.util.concurrent.Executors;
49 import java.util.concurrent.Future;
50 import java.util.concurrent.TimeUnit;
52 import net.floodlightcontroller.core.FloodlightContext;
53 import net.floodlightcontroller.core.HAListenerTypeMarker;
54 import net.floodlightcontroller.core.HARole;
55 import net.floodlightcontroller.core.IControllerCompletionListener;
56 import net.floodlightcontroller.core.IFloodlightProviderService;
57 import net.floodlightcontroller.core.IHAListener;
58 import net.floodlightcontroller.core.IInfoProvider;
59 import net.floodlightcontroller.core.IListener.Command;
60 import net.floodlightcontroller.core.IOFMessageListener;
61 import net.floodlightcontroller.core.IOFSwitch;
62 import net.floodlightcontroller.core.RoleInfo;
63 import net.floodlightcontroller.core.internal.Controller.IUpdate;
64 import net.floodlightcontroller.core.internal.Controller.ModuleLoaderState;
65 import net.floodlightcontroller.core.internal.RoleManager;
66 import net.floodlightcontroller.core.module.FloodlightModuleContext;
67 import net.floodlightcontroller.core.module.FloodlightModuleException;
68 import net.floodlightcontroller.core.module.IFloodlightModule;
69 import net.floodlightcontroller.core.module.IFloodlightService;
70 import net.floodlightcontroller.core.util.ListenerDispatcher;
72 import org.projectfloodlight.openflow.protocol.OFMessage;
73 import org.projectfloodlight.openflow.protocol.OFPacketIn;
74 import org.projectfloodlight.openflow.protocol.OFType;
76 import net.floodlightcontroller.packet.Ethernet;
78 import org.slf4j.Logger;
79 import org.slf4j.LoggerFactory;
87 protected ConcurrentMap<OFType, ListenerDispatcher<OFType,IOFMessageListener>>
listeners;
88 protected ListenerDispatcher<HAListenerTypeMarker, IHAListener>
haListeners;
90 private final boolean useAsyncUpdates;
91 private volatile ExecutorService executorService;
92 private volatile Future<?> mostRecentUpdateFuture;
94 private ConcurrentLinkedQueue<IControllerCompletionListener> completionListeners;
100 listeners =
new ConcurrentHashMap<OFType, ListenerDispatcher<OFType,
101 IOFMessageListener>>();
103 new ListenerDispatcher<HAListenerTypeMarker, IHAListener>();
104 completionListeners =
105 new ConcurrentLinkedQueue<IControllerCompletionListener>();
107 this.useAsyncUpdates = useAsyncUpdates;
116 IOFMessageListener listener) {
117 ListenerDispatcher<OFType, IOFMessageListener> ldd =
120 ldd =
new ListenerDispatcher<OFType, IOFMessageListener>();
123 ldd.addListener(
type, listener);
128 IOFMessageListener listener) {
129 ListenerDispatcher<OFType, IOFMessageListener> ldd =
132 ldd.removeListener(listener);
141 Map<OFType, List<IOFMessageListener>> lers =
142 new HashMap<OFType, List<IOFMessageListener>>();
143 for(Entry<OFType, ListenerDispatcher<OFType, IOFMessageListener>> e :
145 lers.put(e.getKey(), e.getValue().getOrderedListeners());
147 return Collections.unmodifiableMap(lers);
151 this.listeners.clear();
159 List<IOFMessageListener> theListeners =
listeners.get(msg.getType()).getOrderedListeners();
160 if (theListeners != null) {
161 Command
result = Command.CONTINUE;
162 Iterator<IOFMessageListener> it = theListeners.iterator();
163 if (OFType.PACKET_IN.equals(msg.getType())) {
164 OFPacketIn pi = (OFPacketIn)msg;
165 Ethernet eth =
new Ethernet();
166 eth.deserialize(pi.getData(), 0, pi.getData().length);
167 IFloodlightProviderService.bcStore.put(bc,
168 IFloodlightProviderService.CONTEXT_PI_PAYLOAD,
171 while (it.hasNext() && !Command.STOP.equals(
result)) {
172 result = it.next().receive(sw, msg, bc);
176 for (IControllerCompletionListener listener:completionListeners)
177 listener.onMessageConsumed(sw, msg, bc);
182 FloodlightContext bc =
new FloodlightContext();
183 List<IOFMessageListener> msgListeners = null;
184 if (
listeners.containsKey(m.getType())) {
185 msgListeners =
listeners.get(m.getType()).getOrderedListeners();
188 if (msgListeners != null) {
189 for (IOFMessageListener listener : msgListeners) {
190 if (Command.STOP.equals(listener.receive(sw, m, bc))) {
198 for (OFMessage m:msglist) {
207 executorService = Executors.newSingleThreadExecutor();
211 if (executorService != null) {
212 executorService.shutdownNow();
213 executorService = null;
214 mostRecentUpdateFuture = null;
220 Collection<Class<? extends IFloodlightService>> services =
221 new ArrayList<Class<? extends IFloodlightService>>(1);
222 services.add(IFloodlightProviderService.class);
227 public Map<Class<? extends IFloodlightService>, IFloodlightService>
229 Map<Class<? extends IFloodlightService>,
230 IFloodlightService> m =
231 new HashMap<Class<? extends IFloodlightService>,
232 IFloodlightService>();
233 m.put(IFloodlightProviderService.class,
this);
238 public Collection<Class<? extends IFloodlightService>>
244 public void init(FloodlightModuleContext context)
throws FloodlightModuleException {
249 public void startUp(FloodlightModuleContext context) {
266 Map<String, Object> summary =
new HashMap<String, Object>();
267 summary.put(
"test-summary-1", 2);
268 summary.put(
"test-summary-2", 5);
274 if (useAsyncUpdates) {
275 mostRecentUpdateFuture = executorService.submit(
new Runnable() {
286 public void waitForUpdates(
long timeout, TimeUnit unit)
throws InterruptedException {
288 long timeoutNanos = unit.toNanos(timeout);
289 long start = System.nanoTime();
291 Future<?> future = mostRecentUpdateFuture;
292 if ((future == null) || future.isDone())
295 long now = System.nanoTime();
296 if (now > start + timeoutNanos) {
297 fail(
"Timeout waiting for update tasks to complete");
325 public void setRole(HARole role, String roleChangeDescription) {
335 IUpdate update =
new IUpdate() {
337 public void dispatch() {
338 for (IHAListener rl :
haListeners.getOrderedListeners()) {
339 rl.transitionToActive();
356 private void logListeners() {
357 for (Map.Entry<OFType,
358 ListenerDispatcher<OFType,
359 IOFMessageListener>> entry
362 OFType
type = entry.getKey();
363 ListenerDispatcher<OFType, IOFMessageListener> ldd =
366 StringBuffer sb =
new StringBuffer();
367 sb.append(
"OFListeners for ");
370 for (IOFMessageListener l : ldd.getOrderedListeners()) {
371 sb.append(l.getName());
374 log.debug(sb.toString());
386 Map<String, Long> m =
new HashMap<String, Long>();
387 m.put(
"total", 1000000000L);
388 m.put(
"free", 20000000L);
399 FloodlightContext bContext) {
421 completionListeners.add(listener);
427 completionListeners.remove(listener);
void removeHAListener(IHAListener listener)
synchronized void removeOFMessageListener(OFType type, IOFMessageListener listener)
void waitForUpdates(long timeout, TimeUnit unit)
void handleMessage(IOFSwitch sw, OFMessage m, FloodlightContext bContext)
ModuleLoaderState getModuleLoaderState()
void addUpdateToQueue(final IUpdate update)
Map< String, Object > getControllerInfo(String type)
void transitionToActive()
void startUp(FloodlightModuleContext context)
Collection< Class<? extends IFloodlightService > > getModuleDependencies()
void dispatchMessage(IOFSwitch sw, OFMessage msg, FloodlightContext bc)
MockFloodlightProvider(boolean useAsyncUpdates)
void removeCompletionListener(IControllerCompletionListener listener)
void removeInfoProvider(String type, IInfoProvider provider)
void init(FloodlightModuleContext context)
ListenerDispatcher< HAListenerTypeMarker, IHAListener > haListeners
RoleManager getRoleManager()
Collection< Class<? extends IFloodlightService > > getModuleServices()
Map< String, String > getControllerNodeIPs()
synchronized void addOFMessageListener(OFType type, IOFMessageListener listener)
ConcurrentMap< OFType, ListenerDispatcher< OFType, IOFMessageListener > > listeners
void addHAListener(IHAListener listener)
void handleOutgoingMessages(IOFSwitch sw, List< OFMessage > msglist, FloodlightContext bc)
void addInfoProvider(String type, IInfoProvider provider)
Map< Class<? extends IFloodlightService >, IFloodlightService > getServiceImpls()
long getSystemStartTime()
void handleOutgoingMessage(IOFSwitch sw, OFMessage m)
void addCompletionListener(IControllerCompletionListener listener)
Map< OFType, List< IOFMessageListener > > getListeners()
void dispatchMessage(IOFSwitch sw, OFMessage msg)
void setRole(HARole role, String roleChangeDescription)
Map< String, Long > getMemory()