diff --git a/src/main/java/META-INF/services/net.floodlightcontroller.core.module.IFloodlightModule b/src/main/java/META-INF/services/net.floodlightcontroller.core.module.IFloodlightModule index 14ee2a0f6f2cfc1cd5626e71c9e06d1ce3700f4a..1207638607366e0818a2c375d8b16f68a2ee760e 100644 --- a/src/main/java/META-INF/services/net.floodlightcontroller.core.module.IFloodlightModule +++ b/src/main/java/META-INF/services/net.floodlightcontroller.core.module.IFloodlightModule @@ -6,4 +6,5 @@ net.floodlightcontroller.routing.dijkstra.RoutingImpl net.floodlightcontroller.forwarding.Forwarding net.floodlightcontroller.core.OFMessageFilterManager net.floodlightcontroller.staticflowentry.StaticFlowEntryPusher -net.floodlightcontroller.perfmon.PktInProcessingTime \ No newline at end of file +net.floodlightcontroller.perfmon.PktInProcessingTime +net.floodlightcontroller.restserver.RestApiServer \ No newline at end of file diff --git a/src/main/java/net/floodlightcontroller/core/CoreModule.java b/src/main/java/net/floodlightcontroller/core/CoreModule.java index 5464df7ead839044d9ad293efbe29046d60301b5..be4ebc25e644ca7794cc2930c5125e961f363f82 100644 --- a/src/main/java/net/floodlightcontroller/core/CoreModule.java +++ b/src/main/java/net/floodlightcontroller/core/CoreModule.java @@ -9,22 +9,22 @@ import net.floodlightcontroller.core.internal.Controller; import net.floodlightcontroller.core.module.FloodlightModuleContext; import net.floodlightcontroller.core.module.FloodlightModuleException; import net.floodlightcontroller.core.module.IFloodlightModule; -import net.floodlightcontroller.core.web.JacksonCustomConverter; +import net.floodlightcontroller.core.module.IFloodlightService; import net.floodlightcontroller.counter.CounterStore; import net.floodlightcontroller.counter.ICounterStoreService; import net.floodlightcontroller.perfmon.IPktInProcessingTimeService; +import net.floodlightcontroller.restserver.IRestApiService; import net.floodlightcontroller.storage.IStorageSourceService; public class CoreModule implements IFloodlightModule { Controller controller; @Override - public Collection<Class<? extends IFloodlightService>> getServices() { + public Collection<Class<? extends IFloodlightService>> getModuleServices() { Collection<Class<? extends IFloodlightService>> services = new ArrayList<Class<? extends IFloodlightService>>(2); services.add(IFloodlightProviderService.class); services.add(ICounterStoreService.class); - services.add(IRestApiService.class); return services; } @@ -41,17 +41,17 @@ public class CoreModule implements IFloodlightModule { IFloodlightService>(); m.put(IFloodlightProviderService.class, controller); m.put(ICounterStoreService.class, counterStore); - m.put(IRestApiService.class, controller); return m; } @Override - public Collection<Class<? extends IFloodlightService>> getDependencies() { + public Collection<Class<? extends IFloodlightService>> getModuleDependencies() { Collection<Class<? extends IFloodlightService>> dependencies = - new ArrayList<Class<? extends IFloodlightService>>(1); + new ArrayList<Class<? extends IFloodlightService>>(4); dependencies.add(IStorageSourceService.class); dependencies.add(IOFMessageFilterManagerService.class); dependencies.add(IPktInProcessingTimeService.class); + dependencies.add(IRestApiService.class); return dependencies; } @@ -64,13 +64,14 @@ public class CoreModule implements IFloodlightModule { controller.setCounterStore( context.getServiceImpl(ICounterStoreService.class)); controller.setMessageFilterManagerService( - context.getServiceImpl(IOFMessageFilterManagerService.class)); + context.getServiceImpl(IOFMessageFilterManagerService.class)); + controller.setRestApiService( + context.getServiceImpl(IRestApiService.class)); controller.init(); } @Override public void startUp(FloodlightModuleContext context) { controller.startupComponents(); - JacksonCustomConverter.replaceConverter(); } } diff --git a/src/main/java/net/floodlightcontroller/core/IFloodlightProviderService.java b/src/main/java/net/floodlightcontroller/core/IFloodlightProviderService.java index 048c19944ad85fcbfe866f3a9b5db96c5b69fecd..c2d5cf433297e7b89af5b95370a70862e2825012 100644 --- a/src/main/java/net/floodlightcontroller/core/IFloodlightProviderService.java +++ b/src/main/java/net/floodlightcontroller/core/IFloodlightProviderService.java @@ -22,6 +22,7 @@ import java.util.Map; import java.util.concurrent.ScheduledExecutorService; import net.floodlightcontroller.core.internal.CmdLineSettings; +import net.floodlightcontroller.core.module.IFloodlightService; import net.floodlightcontroller.packet.Ethernet; import org.openflow.protocol.OFMessage; diff --git a/src/main/java/net/floodlightcontroller/core/IOFMessageFilterManagerService.java b/src/main/java/net/floodlightcontroller/core/IOFMessageFilterManagerService.java index df77cdf45543eac46bd4af901eacac711b0dc1ab..58de92ca04d6b7ad519b2fa85b6d2e06d56ecf47 100644 --- a/src/main/java/net/floodlightcontroller/core/IOFMessageFilterManagerService.java +++ b/src/main/java/net/floodlightcontroller/core/IOFMessageFilterManagerService.java @@ -1,5 +1,7 @@ package net.floodlightcontroller.core; +import net.floodlightcontroller.core.module.IFloodlightService; + import org.openflow.protocol.OFMessage; public interface IOFMessageFilterManagerService extends IFloodlightService { diff --git a/src/main/java/net/floodlightcontroller/core/IRestApiService.java b/src/main/java/net/floodlightcontroller/core/IRestApiService.java deleted file mode 100644 index 4340e16c2e3155a46eab3a4693ce9e31c6f4c856..0000000000000000000000000000000000000000 --- a/src/main/java/net/floodlightcontroller/core/IRestApiService.java +++ /dev/null @@ -1,14 +0,0 @@ -package net.floodlightcontroller.core; - -import net.floodlightcontroller.core.module.IFloodlightModule; -import net.floodlightcontroller.core.web.RestletRoutable; - -public interface IRestApiService extends IFloodlightService { - /** - * Adds a REST API - * @param routeable - */ - public void addRestApi(RestletRoutable routeable, - Class<? extends IFloodlightService> service, - IFloodlightModule module); -} diff --git a/src/main/java/net/floodlightcontroller/core/Main.java b/src/main/java/net/floodlightcontroller/core/Main.java index 7a90d0c7119338d59a5faee046a77241c4dae866..e35c0b546916e5140df21588fe8fa272a9c8b2b8 100644 --- a/src/main/java/net/floodlightcontroller/core/Main.java +++ b/src/main/java/net/floodlightcontroller/core/Main.java @@ -7,6 +7,7 @@ import net.floodlightcontroller.core.internal.CmdLineSettings; import net.floodlightcontroller.core.module.FloodlightModuleException; import net.floodlightcontroller.core.module.FloodlightModuleLoader; import net.floodlightcontroller.core.module.IFloodlightModuleContext; +import net.floodlightcontroller.restserver.IRestApiService; /** * Host for the Floodlight main method @@ -34,6 +35,8 @@ public class Main { FloodlightModuleLoader fml = new FloodlightModuleLoader(); IFloodlightModuleContext moduleContext = fml.loadModulesFromConfig(); + IRestApiService restApi = moduleContext.getServiceImpl(IRestApiService.class); + restApi.run(); IFloodlightProviderService controller = moduleContext.getServiceImpl(IFloodlightProviderService.class); controller.setCmdLineOptions(settings); diff --git a/src/main/java/net/floodlightcontroller/core/OFMessageFilterManager.java b/src/main/java/net/floodlightcontroller/core/OFMessageFilterManager.java index b9d466cee1bbd5d9ab0c7cfa433eadfde2763ec6..19a2d9d48a13c67330529b1fbb5bd10de72652ab 100644 --- a/src/main/java/net/floodlightcontroller/core/OFMessageFilterManager.java +++ b/src/main/java/net/floodlightcontroller/core/OFMessageFilterManager.java @@ -54,6 +54,7 @@ import org.apache.thrift.protocol.TProtocol; import net.floodlightcontroller.core.module.FloodlightModuleContext; import net.floodlightcontroller.core.module.FloodlightModuleException; import net.floodlightcontroller.core.module.IFloodlightModule; +import net.floodlightcontroller.core.module.IFloodlightService; import net.floodlightcontroller.packet.Ethernet; import net.floodlightcontroller.packetstreamer.thrift.*; @@ -541,7 +542,7 @@ public class OFMessageFilterManager // IFloodlightModule methods @Override - public Collection<Class<? extends IFloodlightService>> getServices() { + public Collection<Class<? extends IFloodlightService>> getModuleServices() { Collection<Class<? extends IFloodlightService>> l = new ArrayList<Class<? extends IFloodlightService>>(); l.add(IOFMessageFilterManagerService.class); @@ -561,7 +562,7 @@ public class OFMessageFilterManager } @Override - public Collection<Class<? extends IFloodlightService>> getDependencies() { + public Collection<Class<? extends IFloodlightService>> getModuleDependencies() { Collection<Class<? extends IFloodlightService>> l = new ArrayList<Class<? extends IFloodlightService>>(); l.add(IFloodlightProviderService.class); diff --git a/src/main/java/net/floodlightcontroller/core/internal/Controller.java b/src/main/java/net/floodlightcontroller/core/internal/Controller.java index 30578037fcb1ecf1517d73d1e83a9b4c09d98b3d..15b87891eb8ab7f8acb06bcec0342f873f70c198 100644 --- a/src/main/java/net/floodlightcontroller/core/internal/Controller.java +++ b/src/main/java/net/floodlightcontroller/core/internal/Controller.java @@ -21,7 +21,6 @@ import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketAddress; -import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.HashMap; @@ -46,7 +45,6 @@ import java.nio.channels.ClosedChannelException; import net.floodlightcontroller.core.FloodlightContext; import net.floodlightcontroller.core.IFloodlightProviderService; -import net.floodlightcontroller.core.IFloodlightService; import net.floodlightcontroller.core.IOFController; import net.floodlightcontroller.core.IOFMessageFilterManagerService; import net.floodlightcontroller.core.IOFMessageListener; @@ -54,12 +52,9 @@ import net.floodlightcontroller.core.IOFMessageListener.Command; import net.floodlightcontroller.core.IOFSwitch; import net.floodlightcontroller.core.IOFSwitchFilter; import net.floodlightcontroller.core.IOFSwitchListener; -import net.floodlightcontroller.core.IRestApiService; import net.floodlightcontroller.core.internal.OFChannelState.HandshakeState; -import net.floodlightcontroller.core.module.IFloodlightModule; import net.floodlightcontroller.core.util.ListenerDispatcher; import net.floodlightcontroller.core.web.CoreWebRoutable; -import net.floodlightcontroller.core.web.RestletRoutable; import static net.floodlightcontroller.counter.CounterValue.CounterType; import net.floodlightcontroller.counter.CounterStore; import net.floodlightcontroller.counter.ICounter; @@ -69,6 +64,7 @@ import net.floodlightcontroller.jython.Server; import net.floodlightcontroller.packet.Ethernet; import net.floodlightcontroller.packet.IPv4; import net.floodlightcontroller.perfmon.IPktInProcessingTimeService; +import net.floodlightcontroller.restserver.IRestApiService; import net.floodlightcontroller.storage.IResultSet; import net.floodlightcontroller.storage.IStorageExceptionHandler; import net.floodlightcontroller.storage.IStorageSourceService; @@ -119,17 +115,6 @@ import org.openflow.protocol.factory.MessageParseException; import org.openflow.util.HexString; import org.openflow.util.U16; import org.openflow.util.U32; -import org.restlet.Component; -import org.restlet.Context; -import org.restlet.Request; -import org.restlet.Response; -import org.restlet.Restlet; -import org.restlet.data.Protocol; -import org.restlet.data.Reference; -import org.restlet.routing.Filter; -import org.restlet.routing.Router; -import org.restlet.routing.Template; -import org.restlet.Application; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -138,8 +123,7 @@ import org.slf4j.LoggerFactory; * The main controller class. Handles all setup and network listeners */ public class Controller - extends Application - implements IFloodlightProviderService, IRestApiService, IOFController { + implements IFloodlightProviderService, IOFController { protected static Logger log = LoggerFactory.getLogger(Controller.class); @@ -151,6 +135,7 @@ public class Controller protected Set<IOFSwitchListener> switchListeners; protected BlockingQueue<Update> updates; protected ICounterStoreService counterStore; + protected IRestApiService restApi; protected ScheduledExecutorService executor = Executors.newScheduledThreadPool(5); @@ -160,11 +145,7 @@ public class Controller protected IPktInProcessingTimeService pktinProcTime; protected long ptWarningThresholdInNano; - protected List<RestletRoutable> restlets; - protected Context context; - // Configuration options - protected int restPort = 8080; protected int openFlowPort = 6633; // Storage table names @@ -207,11 +188,6 @@ public class Controller } } - public Controller() { - super(new Context()); - this.context = getContext(); - } - // *************** // Getters/Setters // *************** @@ -232,6 +208,10 @@ public class Controller this.pktinProcTime = pits; } + public void setRestApiService(IRestApiService restApi) { + this.restApi = restApi; + } + // ********************** // ChannelUpstreamHandler // ********************** @@ -1066,53 +1046,6 @@ public class Controller return "localhost"; } - // *********** - // Application - // *********** - - @Override - public Restlet createInboundRoot() { - Router baseRouter = new Router(context); - baseRouter.setDefaultMatchingMode(Template.MODE_STARTS_WITH); - for (RestletRoutable rr : restlets) { - baseRouter.attach(rr.basePath(), rr.getRestlet(context)); - } - - Filter slashFilter = new Filter() { - @Override - protected int beforeHandle(Request request, Response response) { - Reference ref = request.getResourceRef(); - String originalPath = ref.getPath(); - if (originalPath.contains("//")) - { - String newPath = originalPath.replaceAll("/+", "/"); - ref.setPath(newPath); - } - return Filter.CONTINUE; - } - - }; - slashFilter.setNext(baseRouter); - - return slashFilter; - } - - // *************** - // IRestApiService - // *************** - - @Override - public void addRestApi(RestletRoutable routeable, - Class<? extends IFloodlightService> service, - IFloodlightModule module) { - if (log.isDebugEnabled()) { - log.debug("Adding REST API for service " + service.getCanonicalName()); - } - restlets.add(routeable); - context.getAttributes().put(service.getCanonicalName(), - module); - } - // ************** // Initialization // ************** @@ -1275,20 +1208,6 @@ public class Controller */ public void run() { try { - // Start listening for REST requests - final Component component = new Component(); - component.getServers().add(Protocol.HTTP, restPort); - component.getDefaultHost().attach(this); - - component.start(); - - // Start listening for switch connections - //int threads = - // Runtime.getRuntime().availableProcessors() * 2 + 1; - //int threads = 1; - //long maxMem = Runtime.getRuntime().maxMemory() * 1 / 3; - //long memPerChannel = 2 * 1024 * 1024; - final ServerBootstrap bootstrap = new ServerBootstrap( new NioServerSocketChannelFactory( Executors.newCachedThreadPool(), @@ -1298,12 +1217,6 @@ public class Controller bootstrap.setOption("child.keepAlive", true); bootstrap.setOption("child.tcpNoDelay", true); - //OrderedMemoryAwareThreadPoolExecutor pipelineExecutor = - // new OrderedMemoryAwareThreadPoolExecutor( - // threads, memPerChannel, maxMem, - // 1000, TimeUnit.SECONDS, - // Executors.defaultThreadFactory()); - ChannelPipelineFactory pfact = new OpenflowPipelineFactory(this, null); bootstrap.setPipelineFactory(pfact); @@ -1355,8 +1268,6 @@ public class Controller ListenerDispatcher<OFType, IOFMessageListener>>(); this.switchListeners = new CopyOnWriteArraySet<IOFSwitchListener>(); - this.restlets = new ArrayList<RestletRoutable>(); - this.context = getContext(); } /** @@ -1367,11 +1278,11 @@ public class Controller // Our internal data structures this.updates = new LinkedBlockingQueue<Update>(); - + this.switches = new ConcurrentHashMap<Long, IOFSwitch>(); + this.factory = new BasicFactory(); + // Add the core REST API - restlets.add(new CoreWebRoutable()); - context.getAttributes().put( - this.getClass().getCanonicalName(), this); + restApi.addRestletRoutable(new CoreWebRoutable()); // Set floodlight to terminate on a storage exception IStorageExceptionHandler handler = @@ -1402,12 +1313,7 @@ public class Controller } } log.info("Connected to storage source"); - - - // Init our data structures - this.switches = new ConcurrentHashMap<Long, IOFSwitch>(); - this.factory = new BasicFactory(); - + // Processing Time Warning Threshold ptWarningThresholdInNano = Long.parseLong(System.getProperty( "net.floodlightcontroller.core.PTWarningThresholdInMilli", "0")) * 1000000; @@ -1443,7 +1349,6 @@ public class Controller @Override public void setCmdLineOptions(CmdLineSettings settings) { - this.restPort = settings.getRestPort(); this.openFlowPort = settings.getOpenFlowPort(); } } diff --git a/src/main/java/net/floodlightcontroller/core/module/FloodlightModuleContext.java b/src/main/java/net/floodlightcontroller/core/module/FloodlightModuleContext.java index 4041cfdc171c28a419e751dcd43ab20a6d36b826..00cf5af9f6716ff4861ae079e664c2310dfabf89 100644 --- a/src/main/java/net/floodlightcontroller/core/module/FloodlightModuleContext.java +++ b/src/main/java/net/floodlightcontroller/core/module/FloodlightModuleContext.java @@ -1,8 +1,8 @@ package net.floodlightcontroller.core.module; +import java.util.Collection; import java.util.HashMap; import java.util.Map; -import net.floodlightcontroller.core.IFloodlightService; /** * The service registry for an IFloodlightProvider. @@ -38,4 +38,8 @@ public class FloodlightModuleContext implements IFloodlightModuleContext { return (T)s; } + @Override + public Collection<Class<? extends IFloodlightService>> getAllServices() { + return serviceMap.keySet(); + } } diff --git a/src/main/java/net/floodlightcontroller/core/module/FloodlightModuleLoader.java b/src/main/java/net/floodlightcontroller/core/module/FloodlightModuleLoader.java index a9bb2f4fbb5a85625809a64ee839c61445ed4542..840774b21bfa0567452df7fd3936d7cd898482b9 100644 --- a/src/main/java/net/floodlightcontroller/core/module/FloodlightModuleLoader.java +++ b/src/main/java/net/floodlightcontroller/core/module/FloodlightModuleLoader.java @@ -9,7 +9,6 @@ import java.util.Map.Entry; import java.util.ServiceLoader; import java.util.Set; -import net.floodlightcontroller.core.IFloodlightService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -23,55 +22,61 @@ public class FloodlightModuleLoader { protected static Logger logger = LoggerFactory.getLogger(FloodlightModuleLoader.class); - protected FloodlightModuleContext floodlightModuleContext; - protected Map<Class<? extends IFloodlightService>, + protected static Map<Class<? extends IFloodlightService>, Collection<IFloodlightModule>> serviceMap; - protected Map<IFloodlightModule, + protected static Map<IFloodlightModule, Collection<Class<? extends IFloodlightService>>> moduleServiceMap; - protected Map<String, IFloodlightModule> moduleNameMap; + protected static Map<String, IFloodlightModule> moduleNameMap; + protected static Object lock = new Object(); + + protected FloodlightModuleContext floodlightModuleContext; public FloodlightModuleLoader() { floodlightModuleContext = new FloodlightModuleContext(); - serviceMap = - new HashMap<Class<? extends IFloodlightService>, - Collection<IFloodlightModule>>(); - moduleServiceMap = - new HashMap<IFloodlightModule, - Collection<Class<? extends - IFloodlightService>>>(); - moduleNameMap = new HashMap<String, IFloodlightModule>(); } /** * Finds all IFloodlightModule(s) in the classpath. */ - protected void findAllModules() throws FloodlightModuleException { - // Get all the current modules in the classpath - ServiceLoader<IFloodlightModule> moduleLoader - = ServiceLoader.load(IFloodlightModule.class); - // Iterate for each module, iterate through and add it's services - for (IFloodlightModule m : moduleLoader) { - if (logger.isDebugEnabled()) { - logger.debug("Found module " + m.getClass().getName()); - } + protected static void findAllModules() throws FloodlightModuleException { + synchronized (lock) { + if (serviceMap != null) return; + serviceMap = + new HashMap<Class<? extends IFloodlightService>, + Collection<IFloodlightModule>>(); + moduleServiceMap = + new HashMap<IFloodlightModule, + Collection<Class<? extends + IFloodlightService>>>(); + moduleNameMap = new HashMap<String, IFloodlightModule>(); + + // Get all the current modules in the classpath + ServiceLoader<IFloodlightModule> moduleLoader + = ServiceLoader.load(IFloodlightModule.class); + // Iterate for each module, iterate through and add it's services + for (IFloodlightModule m : moduleLoader) { + if (logger.isDebugEnabled()) { + logger.debug("Found module " + m.getClass().getName()); + } - // Set up moduleNameMap - moduleNameMap.put(m.getClass().getCanonicalName(), m); + // Set up moduleNameMap + moduleNameMap.put(m.getClass().getCanonicalName(), m); - // Set up serviceMap - Collection<Class<? extends IFloodlightService>> servs = - m.getServices(); - if (servs != null) { - moduleServiceMap.put(m, servs); - for (Class<? extends IFloodlightService> s : servs) { - Collection<IFloodlightModule> mods = - serviceMap.get(s); - if (mods == null) { - mods = new ArrayList<IFloodlightModule>(); - serviceMap.put(s, mods); + // Set up serviceMap + Collection<Class<? extends IFloodlightService>> servs = + m.getModuleServices(); + if (servs != null) { + moduleServiceMap.put(m, servs); + for (Class<? extends IFloodlightService> s : servs) { + Collection<IFloodlightModule> mods = + serviceMap.get(s); + if (mods == null) { + mods = new ArrayList<IFloodlightModule>(); + serviceMap.put(s, mods); + } + mods.add(m); } - mods.add(m); } } } @@ -96,6 +101,32 @@ public class FloodlightModuleLoader { return floodlightModuleContext; } + /** + * Loads modules (and their dependencies) specified in the list + * @param mList The array of fully qualified module names + * @return The ModuleContext containing all the loaded modules + * @throws FloodlightModuleException + */ + public IFloodlightModuleContext loadModulesFromList(String[] mList) + throws FloodlightModuleException { + logger.debug("Starting module loader"); + findAllModules(); + + Set<IFloodlightModule> moduleSet = new HashSet<IFloodlightModule>(); + Map<Class<? extends IFloodlightService>, IFloodlightModule> moduleMap = + new HashMap<Class<? extends IFloodlightService>, + IFloodlightModule>(); + + for (String s : mList) { + calculateModuleDeps(moduleMap, moduleSet, s); + } + + initModules(moduleSet); + startupModules(moduleSet); + + return floodlightModuleContext; + } + /** * Add a module to the set of modules to load and register its services * @param moduleMap the module map @@ -138,7 +169,7 @@ public class FloodlightModuleLoader { addModule(moduleMap, moduleSet, module); Collection<Class<? extends IFloodlightService>> deps = - module.getDependencies(); + module.getModuleDependencies(); if (deps != null) { for (Class<? extends IFloodlightService> c : deps) { diff --git a/src/main/java/net/floodlightcontroller/core/module/IFloodlightModule.java b/src/main/java/net/floodlightcontroller/core/module/IFloodlightModule.java index aede7bec902df8e3ef3a1023d92fbe9a8355bdf0..003e0a119d1eeda8abc1a7ee45798e552622956f 100644 --- a/src/main/java/net/floodlightcontroller/core/module/IFloodlightModule.java +++ b/src/main/java/net/floodlightcontroller/core/module/IFloodlightModule.java @@ -3,7 +3,6 @@ package net.floodlightcontroller.core.module; import java.util.Collection; import java.util.Map; -import net.floodlightcontroller.core.IFloodlightService; /** * Defines an interface for loadable Floodlight modules. @@ -26,7 +25,7 @@ public interface IFloodlightModule { * @return */ - public Collection<Class<? extends IFloodlightService>> getServices(); + public Collection<Class<? extends IFloodlightService>> getModuleServices(); /** * Instantiate (as needed) and return objects that implement each @@ -46,7 +45,7 @@ public interface IFloodlightModule { * on. */ - public Collection<Class<? extends IFloodlightService>> getDependencies(); + public Collection<Class<? extends IFloodlightService>> getModuleDependencies(); /** * This is a hook for each module to do its <em>internal</em> initialization, diff --git a/src/main/java/net/floodlightcontroller/core/module/IFloodlightModuleContext.java b/src/main/java/net/floodlightcontroller/core/module/IFloodlightModuleContext.java index 75bcfb1127fb29ebf19b87316b401d53e29cbae0..a22c3807201b42d6db2997e1f54f1357e0296ffb 100644 --- a/src/main/java/net/floodlightcontroller/core/module/IFloodlightModuleContext.java +++ b/src/main/java/net/floodlightcontroller/core/module/IFloodlightModuleContext.java @@ -1,6 +1,7 @@ package net.floodlightcontroller.core.module; -import net.floodlightcontroller.core.IFloodlightService; +import java.util.Collection; + public interface IFloodlightModuleContext { /** @@ -11,4 +12,10 @@ public interface IFloodlightModuleContext { * or a ClassCastException was encountered. */ public <T extends IFloodlightService> T getServiceImpl(Class<T> service); + + /** + * Returns all loaded services + * @return A collection of service classes that have been loaded + */ + public Collection<Class<? extends IFloodlightService>> getAllServices(); } diff --git a/src/main/java/net/floodlightcontroller/core/IFloodlightService.java b/src/main/java/net/floodlightcontroller/core/module/IFloodlightService.java similarity index 86% rename from src/main/java/net/floodlightcontroller/core/IFloodlightService.java rename to src/main/java/net/floodlightcontroller/core/module/IFloodlightService.java index ccf0c3ff554bac16c9235f734e0e79ef444d4d31..8bf26cca38d3d8a8d0ec0b80f23ea19616fb8327 100644 --- a/src/main/java/net/floodlightcontroller/core/IFloodlightService.java +++ b/src/main/java/net/floodlightcontroller/core/module/IFloodlightService.java @@ -1,4 +1,4 @@ -package net.floodlightcontroller.core; +package net.floodlightcontroller.core.module; /** * This is the base interface for any IFloodlightModule package that provides diff --git a/src/main/java/net/floodlightcontroller/core/web/AllSwitchStatisticsResource.java b/src/main/java/net/floodlightcontroller/core/web/AllSwitchStatisticsResource.java index 0c880736bea5de2e5c4bcc72bfb34005acb367b0..f8509d9223e38b3f689edeb16d1be576e50a8c69 100644 --- a/src/main/java/net/floodlightcontroller/core/web/AllSwitchStatisticsResource.java +++ b/src/main/java/net/floodlightcontroller/core/web/AllSwitchStatisticsResource.java @@ -80,7 +80,9 @@ public class AllSwitchStatisticsResource extends SwitchResourceBase { return model; } - IFloodlightProviderService floodlightProvider = (IFloodlightProviderService)getApplication(); + IFloodlightProviderService floodlightProvider = + (IFloodlightProviderService)getContext().getAttributes(). + get(IFloodlightProviderService.class.getCanonicalName()); Long[] switchDpids = floodlightProvider.getSwitches().keySet().toArray(new Long[0]); List<GetConcurrentStatsThread> activeThreads = new ArrayList<GetConcurrentStatsThread>(switchDpids.length); List<GetConcurrentStatsThread> pendingRemovalThreads = new ArrayList<GetConcurrentStatsThread>(); @@ -167,7 +169,9 @@ public class AllSwitchStatisticsResource extends SwitchResourceBase { } public void run() { - IFloodlightProviderService floodlightProvider = (IFloodlightProviderService)getApplication(); + IFloodlightProviderService floodlightProvider = + (IFloodlightProviderService)getContext().getAttributes(). + get(IFloodlightProviderService.class.getCanonicalName()); if ((requestType == REQUESTTYPE.OFSTATS) && (statType != null)) { switchReply = getSwitchStatistics(switchId, statType); diff --git a/src/main/java/net/floodlightcontroller/core/web/ControllerSwitchesResource.java b/src/main/java/net/floodlightcontroller/core/web/ControllerSwitchesResource.java index 026382a6c5506102e5977e48f107cdb976258787..c8f74860e7369ecb789be974bc3343ba86afcf78 100644 --- a/src/main/java/net/floodlightcontroller/core/web/ControllerSwitchesResource.java +++ b/src/main/java/net/floodlightcontroller/core/web/ControllerSwitchesResource.java @@ -35,9 +35,10 @@ import org.restlet.resource.ServerResource; public class ControllerSwitchesResource extends ServerResource { @Get("json") public List<Map<String, String>> retrieve() { - List<Map<String, String>> switchIds = new ArrayList<Map<String, String>>(); - - IFloodlightProviderService floodlightProvider = (IFloodlightProviderService)getApplication(); + List<Map<String, String>> switchIds = new ArrayList<Map<String, String>>(); + IFloodlightProviderService floodlightProvider = + (IFloodlightProviderService)getContext().getAttributes(). + get(IFloodlightProviderService.class.getCanonicalName()); Map<Long, IOFSwitch> switches = floodlightProvider.getSwitches(); for (IOFSwitch s: switches.values()) { diff --git a/src/main/java/net/floodlightcontroller/core/web/CoreWebRoutable.java b/src/main/java/net/floodlightcontroller/core/web/CoreWebRoutable.java index d5ac8cfae64a2b8b0a1cddd082d7a475cf81ba7b..4f10f5e323aec7b376ce0542a97c962f7837a38f 100644 --- a/src/main/java/net/floodlightcontroller/core/web/CoreWebRoutable.java +++ b/src/main/java/net/floodlightcontroller/core/web/CoreWebRoutable.java @@ -17,6 +17,8 @@ package net.floodlightcontroller.core.web; +import net.floodlightcontroller.restserver.RestletRoutable; + import org.restlet.Context; import org.restlet.Restlet; import org.restlet.routing.Router; diff --git a/src/main/java/net/floodlightcontroller/core/web/SwitchClustersResource.java b/src/main/java/net/floodlightcontroller/core/web/SwitchClustersResource.java index 2b81663431032116432548aece7a5536e362502b..8ac83ce8f1a6aa3843a0f023fb0550d6cf2c99f2 100644 --- a/src/main/java/net/floodlightcontroller/core/web/SwitchClustersResource.java +++ b/src/main/java/net/floodlightcontroller/core/web/SwitchClustersResource.java @@ -36,7 +36,9 @@ import org.restlet.resource.ServerResource; public class SwitchClustersResource extends ServerResource { @Get("json") public Map<String, List<String>> retrieve() { - IFloodlightProviderService floodlightProvider = (IFloodlightProviderService)getApplication(); + IFloodlightProviderService floodlightProvider = + (IFloodlightProviderService)getContext().getAttributes(). + get(IFloodlightProviderService.class.getCanonicalName()); Map<String, List<String>> switchClusterMap = new HashMap<String, List<String>>(); for (Entry<Long, IOFSwitch> entry : floodlightProvider.getSwitches().entrySet()) { Long clusterDpid = entry.getValue().getSwitchClusterId(); diff --git a/src/main/java/net/floodlightcontroller/core/web/SwitchCounterCategoriesResource.java b/src/main/java/net/floodlightcontroller/core/web/SwitchCounterCategoriesResource.java index 39d5db5791a1d6c5d01aaa47a664c35f45d16dd0..f14d7062eb658f334f8b11108c5f9dfe6d5e20af 100644 --- a/src/main/java/net/floodlightcontroller/core/web/SwitchCounterCategoriesResource.java +++ b/src/main/java/net/floodlightcontroller/core/web/SwitchCounterCategoriesResource.java @@ -37,7 +37,9 @@ import net.floodlightcontroller.counter.ICounterStoreService; public class SwitchCounterCategoriesResource extends CounterResourceBase { @Get("json") public Map<String, Object> retrieve() { - IFloodlightProviderService floodlightProvider = (IFloodlightProviderService)getApplication(); + IFloodlightProviderService floodlightProvider = + (IFloodlightProviderService)getContext().getAttributes(). + get(IFloodlightProviderService.class.getCanonicalName()); HashMap<String,Object> model = new HashMap<String,Object>(); String switchID = (String) getRequestAttributes().get("switchId"); diff --git a/src/main/java/net/floodlightcontroller/core/web/SwitchCounterResource.java b/src/main/java/net/floodlightcontroller/core/web/SwitchCounterResource.java index e9625fca3d88434f554415489524ca4e142f5313..0af59c42fa5fdb8eb46bcc66cf48395ec90a7383 100644 --- a/src/main/java/net/floodlightcontroller/core/web/SwitchCounterResource.java +++ b/src/main/java/net/floodlightcontroller/core/web/SwitchCounterResource.java @@ -36,7 +36,9 @@ import net.floodlightcontroller.counter.ICounterStoreService; public class SwitchCounterResource extends CounterResourceBase { @Get("json") public Map<String, Object> retrieve() { - IFloodlightProviderService floodlightProvider = (IFloodlightProviderService)getApplication(); + IFloodlightProviderService floodlightProvider = + (IFloodlightProviderService)getContext().getAttributes(). + get(IFloodlightProviderService.class.getCanonicalName()); HashMap<String,Object> model = new HashMap<String,Object>(); String switchID = (String) getRequestAttributes().get("switchId"); diff --git a/src/main/java/net/floodlightcontroller/core/web/SwitchResourceBase.java b/src/main/java/net/floodlightcontroller/core/web/SwitchResourceBase.java index 3ac4e1e43429695231433e324d07861399373171..baf4ad6e1a8bfc525aa092a9413b3008986e85b1 100644 --- a/src/main/java/net/floodlightcontroller/core/web/SwitchResourceBase.java +++ b/src/main/java/net/floodlightcontroller/core/web/SwitchResourceBase.java @@ -66,7 +66,9 @@ public class SwitchResourceBase extends ServerResource { } protected List<OFStatistics> getSwitchStatistics(long switchId, OFStatisticsType statType) { - IFloodlightProviderService floodlightProvider = (IFloodlightProviderService)getApplication(); + IFloodlightProviderService floodlightProvider = + (IFloodlightProviderService)getContext().getAttributes(). + get(IFloodlightProviderService.class.getCanonicalName()); IOFSwitch sw = floodlightProvider.getSwitches().get(switchId); Future<List<OFStatistics>> future; @@ -132,7 +134,9 @@ public class SwitchResourceBase extends ServerResource { * @return A list of switch table entries */ protected List<Map<String, Object>> getSwitchTableJson(long switchId) { - IFloodlightProviderService floodlightProvider = (IFloodlightProviderService)getApplication(); + IFloodlightProviderService floodlightProvider = + (IFloodlightProviderService)getContext().getAttributes(). + get(IFloodlightProviderService.class.getCanonicalName()); IOFSwitch sw = floodlightProvider.getSwitches().get(switchId); List<Map<String, Object>> switchTableJson = null; diff --git a/src/main/java/net/floodlightcontroller/core/web/SwitchStatisticsResource.java b/src/main/java/net/floodlightcontroller/core/web/SwitchStatisticsResource.java index 42e5feafe7c90d808f832a0c443105b05be0e165..41c779ba9d1e5641adf6552e613c2202d5097747 100644 --- a/src/main/java/net/floodlightcontroller/core/web/SwitchStatisticsResource.java +++ b/src/main/java/net/floodlightcontroller/core/web/SwitchStatisticsResource.java @@ -42,7 +42,9 @@ public class SwitchStatisticsResource extends SwitchResourceBase { @Get("json") public Map<String, Object> retrieve() { - IFloodlightProviderService floodlightProvider = (IFloodlightProviderService)getApplication(); + IFloodlightProviderService floodlightProvider = + (IFloodlightProviderService)getContext().getAttributes(). + get(IFloodlightProviderService.class.getCanonicalName()); HashMap<String,Object> result = new HashMap<String,Object>(); List<OFStatistics> values = null; diff --git a/src/main/java/net/floodlightcontroller/counter/ICounterStoreService.java b/src/main/java/net/floodlightcontroller/counter/ICounterStoreService.java index 3303198f75e5b0fe658c1cad1d6bbd19bc4d7af2..86e71f8d695f148ff38e7415eb9bca2822d9007e 100644 --- a/src/main/java/net/floodlightcontroller/counter/ICounterStoreService.java +++ b/src/main/java/net/floodlightcontroller/counter/ICounterStoreService.java @@ -3,7 +3,7 @@ package net.floodlightcontroller.counter; import java.util.List; import java.util.Map; -import net.floodlightcontroller.core.IFloodlightService; +import net.floodlightcontroller.core.module.IFloodlightService; import net.floodlightcontroller.counter.CounterStore.NetworkLayer; public interface ICounterStoreService extends IFloodlightService { diff --git a/src/main/java/net/floodlightcontroller/devicemanager/IDeviceManagerService.java b/src/main/java/net/floodlightcontroller/devicemanager/IDeviceManagerService.java index 184a289a7324330dc56e42c34334d9f13b388448..effeae4b0da47b46db5b05b36d6361992799fbf0 100755 --- a/src/main/java/net/floodlightcontroller/devicemanager/IDeviceManagerService.java +++ b/src/main/java/net/floodlightcontroller/devicemanager/IDeviceManagerService.java @@ -25,7 +25,7 @@ package net.floodlightcontroller.devicemanager; import java.util.List; -import net.floodlightcontroller.core.IFloodlightService; +import net.floodlightcontroller.core.module.IFloodlightService; /** * Used to interact with DeviceManager implementations diff --git a/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java b/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java index 2ddc0772db0d51e39099231fa3196469cbb95827..e9cac3dcb721c8451c999bce30f50d74465fe027 100755 --- a/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java +++ b/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java @@ -41,13 +41,13 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import net.floodlightcontroller.core.FloodlightContext; import net.floodlightcontroller.core.IFloodlightProviderService; -import net.floodlightcontroller.core.IFloodlightService; import net.floodlightcontroller.core.IOFMessageListener; import net.floodlightcontroller.core.IOFSwitch; import net.floodlightcontroller.core.IOFSwitchListener; import net.floodlightcontroller.core.module.FloodlightModuleContext; import net.floodlightcontroller.core.module.FloodlightModuleException; import net.floodlightcontroller.core.module.IFloodlightModule; +import net.floodlightcontroller.core.module.IFloodlightService; import net.floodlightcontroller.core.util.SingletonTask; import net.floodlightcontroller.devicemanager.Device; import net.floodlightcontroller.devicemanager.DeviceAttachmentPoint; @@ -1928,7 +1928,7 @@ public class DeviceManagerImpl implements IDeviceManagerService, IOFMessageListe // IFloodlightModule methods @Override - public Collection<Class<? extends IFloodlightService>> getServices() { + public Collection<Class<? extends IFloodlightService>> getModuleServices() { Collection<Class<? extends IFloodlightService>> l = new ArrayList<Class<? extends IFloodlightService>>(); l.add(IDeviceManagerService.class); @@ -1948,7 +1948,7 @@ public class DeviceManagerImpl implements IDeviceManagerService, IOFMessageListe } @Override - public Collection<Class<? extends IFloodlightService>> getDependencies() { + public Collection<Class<? extends IFloodlightService>> getModuleDependencies() { Collection<Class<? extends IFloodlightService>> l = new ArrayList<Class<? extends IFloodlightService>>(); l.add(IFloodlightProviderService.class); @@ -1985,8 +1985,10 @@ public class DeviceManagerImpl implements IDeviceManagerService, IOFMessageListe this.evHistDevMgrPktIn = new EventHistory<OFMatch>("Pakcet-In"); - // Register to get updates from topology - topology.addListener(this); + if (topology != null) { + // Register to get updates from topology + topology.addListener(this); + } // Create our database tables storageSource.createTable(DEVICE_TABLE_NAME, null); diff --git a/src/main/java/net/floodlightcontroller/forwarding/Forwarding.java b/src/main/java/net/floodlightcontroller/forwarding/Forwarding.java index 76d165fd58b6d47a10282c64a526929f3f206912..12908996af83f898ef890376743833f19c0beec9 100644 --- a/src/main/java/net/floodlightcontroller/forwarding/Forwarding.java +++ b/src/main/java/net/floodlightcontroller/forwarding/Forwarding.java @@ -26,11 +26,11 @@ import java.util.Map; import net.floodlightcontroller.core.FloodlightContext; import net.floodlightcontroller.core.IFloodlightProviderService; -import net.floodlightcontroller.core.IFloodlightService; import net.floodlightcontroller.core.IOFSwitch; import net.floodlightcontroller.core.module.FloodlightModuleContext; import net.floodlightcontroller.core.module.FloodlightModuleException; import net.floodlightcontroller.core.module.IFloodlightModule; +import net.floodlightcontroller.core.module.IFloodlightService; import net.floodlightcontroller.counter.ICounterStoreService; import net.floodlightcontroller.devicemanager.Device; import net.floodlightcontroller.devicemanager.DeviceAttachmentPoint; @@ -258,7 +258,7 @@ public class Forwarding extends ForwardingBase implements IFloodlightModule { // IFloodlightModule methods @Override - public Collection<Class<? extends IFloodlightService>> getServices() { + public Collection<Class<? extends IFloodlightService>> getModuleServices() { // We don't export any services return null; } @@ -271,7 +271,7 @@ public class Forwarding extends ForwardingBase implements IFloodlightModule { } @Override - public Collection<Class<? extends IFloodlightService>> getDependencies() { + public Collection<Class<? extends IFloodlightService>> getModuleDependencies() { Collection<Class<? extends IFloodlightService>> l = new ArrayList<Class<? extends IFloodlightService>>(); l.add(IFloodlightProviderService.class); diff --git a/src/main/java/net/floodlightcontroller/perfmon/IPktInProcessingTimeService.java b/src/main/java/net/floodlightcontroller/perfmon/IPktInProcessingTimeService.java index 9da9e5a41398df14550e72121ce091615095413a..b6bf1dd9e8349e3810b818532715a54f6eed1778 100644 --- a/src/main/java/net/floodlightcontroller/perfmon/IPktInProcessingTimeService.java +++ b/src/main/java/net/floodlightcontroller/perfmon/IPktInProcessingTimeService.java @@ -1,6 +1,6 @@ package net.floodlightcontroller.perfmon; -import net.floodlightcontroller.core.IFloodlightService; +import net.floodlightcontroller.core.module.IFloodlightService; import net.floodlightcontroller.perfmon.PktInProcessingTime.CircularTimeBucketSet; import net.floodlightcontroller.perfmon.PktInProcessingTime.PerfMonConfigs; diff --git a/src/main/java/net/floodlightcontroller/perfmon/PktinProcessingTime.java b/src/main/java/net/floodlightcontroller/perfmon/PktinProcessingTime.java index 26ee0bdab3f01fd468edafb0c4190ec07c64bcbf..773ba2e469392c9b42382bfc9035f5935616c7cb 100644 --- a/src/main/java/net/floodlightcontroller/perfmon/PktinProcessingTime.java +++ b/src/main/java/net/floodlightcontroller/perfmon/PktinProcessingTime.java @@ -8,11 +8,11 @@ import java.util.Collection; import java.util.HashMap; import java.util.Map; -import net.floodlightcontroller.core.IFloodlightService; import net.floodlightcontroller.core.IOFMessageListener.FlListenerID; import net.floodlightcontroller.core.module.FloodlightModuleContext; import net.floodlightcontroller.core.module.FloodlightModuleException; import net.floodlightcontroller.core.module.IFloodlightModule; +import net.floodlightcontroller.core.module.IFloodlightService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -433,7 +433,7 @@ public class PktInProcessingTime // IFloodlightModule methods @Override - public Collection<Class<? extends IFloodlightService>> getServices() { + public Collection<Class<? extends IFloodlightService>> getModuleServices() { Collection<Class<? extends IFloodlightService>> l = new ArrayList<Class<? extends IFloodlightService>>(); l.add(IPktInProcessingTimeService.class); @@ -453,7 +453,7 @@ public class PktInProcessingTime } @Override - public Collection<Class<? extends IFloodlightService>> getDependencies() { + public Collection<Class<? extends IFloodlightService>> getModuleDependencies() { // We don't have any dependencies return null; } diff --git a/src/main/java/net/floodlightcontroller/restserver/IRestApiService.java b/src/main/java/net/floodlightcontroller/restserver/IRestApiService.java new file mode 100644 index 0000000000000000000000000000000000000000..d90679580e0adfbc645368dac58c179ef1490846 --- /dev/null +++ b/src/main/java/net/floodlightcontroller/restserver/IRestApiService.java @@ -0,0 +1,16 @@ +package net.floodlightcontroller.restserver; + +import net.floodlightcontroller.core.module.IFloodlightService; + +public interface IRestApiService extends IFloodlightService { + /** + * Adds a REST API + * @param routeable + */ + public void addRestletRoutable(RestletRoutable routable); + + /** + * Runs the REST API server + */ + public void run(); +} diff --git a/src/main/java/net/floodlightcontroller/restserver/RestApiServer.java b/src/main/java/net/floodlightcontroller/restserver/RestApiServer.java new file mode 100644 index 0000000000000000000000000000000000000000..0886fdfc0acc1365c61fc8c3748503d75243c9ed --- /dev/null +++ b/src/main/java/net/floodlightcontroller/restserver/RestApiServer.java @@ -0,0 +1,157 @@ +package net.floodlightcontroller.restserver; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.restlet.Application; +import org.restlet.Component; +import org.restlet.Context; +import org.restlet.Request; +import org.restlet.Response; +import org.restlet.Restlet; +import org.restlet.data.Protocol; +import org.restlet.data.Reference; +import org.restlet.routing.Filter; +import org.restlet.routing.Router; +import org.restlet.routing.Template; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import net.floodlightcontroller.core.module.FloodlightModuleContext; +import net.floodlightcontroller.core.module.FloodlightModuleException; +import net.floodlightcontroller.core.module.IFloodlightModule; +import net.floodlightcontroller.core.module.IFloodlightService; +import net.floodlightcontroller.core.web.JacksonCustomConverter; + +public class RestApiServer + implements IFloodlightModule, IRestApiService { + protected static Logger logger = LoggerFactory.getLogger(RestApiServer.class); + protected List<RestletRoutable> restlets; + protected int restPort = 8080; + protected FloodlightModuleContext fmlContext; + + // *********** + // Application + // *********** + + protected class RestApplication extends Application { + protected Context context; + + public RestApplication() { + super(new Context()); + this.context = getContext(); + } + + @Override + public Restlet createInboundRoot() { + Router baseRouter = new Router(context); + baseRouter.setDefaultMatchingMode(Template.MODE_STARTS_WITH); + for (RestletRoutable rr : restlets) { + baseRouter.attach(rr.basePath(), rr.getRestlet(context)); + } + + Filter slashFilter = new Filter() { + @Override + protected int beforeHandle(Request request, Response response) { + Reference ref = request.getResourceRef(); + String originalPath = ref.getPath(); + if (originalPath.contains("//")) + { + String newPath = originalPath.replaceAll("/+", "/"); + ref.setPath(newPath); + } + return Filter.CONTINUE; + } + + }; + slashFilter.setNext(baseRouter); + + return slashFilter; + } + + public void run(FloodlightModuleContext fmlContext) { + // Add everything in the module context to the rest + for (Class<? extends IFloodlightService> s : fmlContext.getAllServices()) { + context.getAttributes().put(s.getCanonicalName(), + fmlContext.getServiceImpl(s)); + } + + // Use our custom serializers + JacksonCustomConverter.replaceConverter(); + + // Start listening for REST requests + try { + final Component component = new Component(); + component.getServers().add(Protocol.HTTP, restPort); + component.getDefaultHost().attach(this); + component.start(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } + + // *************** + // IRestApiService + // *************** + + @Override + public void addRestletRoutable(RestletRoutable routable) { + if (logger.isDebugEnabled()) { + logger.debug("Adding REST API routable " + + routable.getClass().getCanonicalName()); + } + restlets.add(routable); + } + + @Override + public void run() { + RestApplication restApp = new RestApplication(); + restApp.run(fmlContext); + } + + // ***************** + // IFloodlightModule + // ***************** + + @Override + public Collection<Class<? extends IFloodlightService>> getModuleServices() { + Collection<Class<? extends IFloodlightService>> services = + new ArrayList<Class<? extends IFloodlightService>>(1); + services.add(IRestApiService.class); + return services; + } + + @Override + public Map<Class<? extends IFloodlightService>, IFloodlightService> + getServiceImpls() { + Map<Class<? extends IFloodlightService>, + IFloodlightService> m = + new HashMap<Class<? extends IFloodlightService>, + IFloodlightService>(); + m.put(IRestApiService.class, this); + return m; + } + + @Override + public Collection<Class<? extends IFloodlightService>> getModuleDependencies() { + // We don't have any + return null; + } + + @Override + public void init(FloodlightModuleContext context) + throws FloodlightModuleException { + // This has to be done here since we don't know what order the + // startUp methods will be called + this.restlets = new ArrayList<RestletRoutable>(); + } + + @Override + public void startUp(FloodlightModuleContext fmlContext) { + this.fmlContext = fmlContext; + } +} \ No newline at end of file diff --git a/src/main/java/net/floodlightcontroller/core/web/RestletRoutable.java b/src/main/java/net/floodlightcontroller/restserver/RestletRoutable.java similarity index 96% rename from src/main/java/net/floodlightcontroller/core/web/RestletRoutable.java rename to src/main/java/net/floodlightcontroller/restserver/RestletRoutable.java index a0dd751dad4a9b577d80a090dee2528f7919a339..cb7dfce8c26e8aa7eb83a1e6f2cc688345d564ff 100644 --- a/src/main/java/net/floodlightcontroller/core/web/RestletRoutable.java +++ b/src/main/java/net/floodlightcontroller/restserver/RestletRoutable.java @@ -15,7 +15,7 @@ * under the License. **/ -package net.floodlightcontroller.core.web; +package net.floodlightcontroller.restserver; import org.restlet.Context; import org.restlet.Restlet; diff --git a/src/main/java/net/floodlightcontroller/routing/IRoutingEngineService.java b/src/main/java/net/floodlightcontroller/routing/IRoutingEngineService.java index 1b5e857f590827000e1fcc63267dd31557b14992..768d242646b8122a0cc2264d4a6723d18184722a 100644 --- a/src/main/java/net/floodlightcontroller/routing/IRoutingEngineService.java +++ b/src/main/java/net/floodlightcontroller/routing/IRoutingEngineService.java @@ -17,8 +17,8 @@ package net.floodlightcontroller.routing; -import net.floodlightcontroller.core.IFloodlightService; import net.floodlightcontroller.core.IOFSwitch; +import net.floodlightcontroller.core.module.IFloodlightService; import net.floodlightcontroller.routing.Route; /** diff --git a/src/main/java/net/floodlightcontroller/routing/dijkstra/RoutingImpl.java b/src/main/java/net/floodlightcontroller/routing/dijkstra/RoutingImpl.java index fcf2a463fafca9ca198e0e66c9997dd869828561..887fdf666ebe26976301d14b29578e083b5ec0a6 100644 --- a/src/main/java/net/floodlightcontroller/routing/dijkstra/RoutingImpl.java +++ b/src/main/java/net/floodlightcontroller/routing/dijkstra/RoutingImpl.java @@ -32,11 +32,11 @@ import org.openflow.protocol.OFPhysicalPort.OFPortState; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import net.floodlightcontroller.core.IFloodlightService; import net.floodlightcontroller.core.IOFSwitch; import net.floodlightcontroller.core.module.FloodlightModuleContext; import net.floodlightcontroller.core.module.FloodlightModuleException; import net.floodlightcontroller.core.module.IFloodlightModule; +import net.floodlightcontroller.core.module.IFloodlightService; import net.floodlightcontroller.routing.BroadcastTree; import net.floodlightcontroller.routing.IRoutingEngineService; import net.floodlightcontroller.routing.Link; @@ -329,7 +329,7 @@ public class RoutingImpl // IFloodlightModule @Override - public Collection<Class<? extends IFloodlightService>> getServices() { + public Collection<Class<? extends IFloodlightService>> getModuleServices() { Collection<Class<? extends IFloodlightService>> l = new ArrayList<Class<? extends IFloodlightService>>(); l.add(IRoutingEngineService.class); @@ -349,7 +349,7 @@ public class RoutingImpl } @Override - public Collection<Class<? extends IFloodlightService>> getDependencies() { + public Collection<Class<? extends IFloodlightService>> getModuleDependencies() { Collection<Class<? extends IFloodlightService>> l = new ArrayList<Class<? extends IFloodlightService>>(); l.add(ITopologyService.class); diff --git a/src/main/java/net/floodlightcontroller/staticflowentry/IStaticFlowEntryPusherService.java b/src/main/java/net/floodlightcontroller/staticflowentry/IStaticFlowEntryPusherService.java index e24c7b9cca5ef91324905df725346df6b667915a..4d3e572d802b4d19e1e1f3fce50275d9b64158d9 100644 --- a/src/main/java/net/floodlightcontroller/staticflowentry/IStaticFlowEntryPusherService.java +++ b/src/main/java/net/floodlightcontroller/staticflowentry/IStaticFlowEntryPusherService.java @@ -20,8 +20,9 @@ package net.floodlightcontroller.staticflowentry; import java.util.HashMap; import java.util.List; -import net.floodlightcontroller.core.IFloodlightService; import net.floodlightcontroller.core.IOFSwitch; +import net.floodlightcontroller.core.module.IFloodlightService; + import org.openflow.protocol.OFFlowMod; /** diff --git a/src/main/java/net/floodlightcontroller/staticflowentry/StaticFlowEntryPusher.java b/src/main/java/net/floodlightcontroller/staticflowentry/StaticFlowEntryPusher.java index 32a4f0178da0bc4da9f7d1cca0ea64bbe318d3e0..84e719c0e759d6388e14d57463eae133e8cd0f93 100644 --- a/src/main/java/net/floodlightcontroller/staticflowentry/StaticFlowEntryPusher.java +++ b/src/main/java/net/floodlightcontroller/staticflowentry/StaticFlowEntryPusher.java @@ -34,12 +34,12 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import net.floodlightcontroller.core.IFloodlightProviderService; -import net.floodlightcontroller.core.IFloodlightService; import net.floodlightcontroller.core.IOFSwitch; import net.floodlightcontroller.core.IOFSwitchListener; import net.floodlightcontroller.core.module.FloodlightModuleContext; import net.floodlightcontroller.core.module.FloodlightModuleException; import net.floodlightcontroller.core.module.IFloodlightModule; +import net.floodlightcontroller.core.module.IFloodlightService; import org.codehaus.jackson.JsonParseException; import org.codehaus.jackson.JsonParser; @@ -615,7 +615,7 @@ public class StaticFlowEntryPusher } @Override - public Collection<Class<? extends IFloodlightService>> getServices() { + public Collection<Class<? extends IFloodlightService>> getModuleServices() { Collection<Class<? extends IFloodlightService>> l = new ArrayList<Class<? extends IFloodlightService>>(); l.add(IStaticFlowEntryPusherService.class); @@ -635,7 +635,7 @@ public class StaticFlowEntryPusher } @Override - public Collection<Class<? extends IFloodlightService>> getDependencies() { + public Collection<Class<? extends IFloodlightService>> getModuleDependencies() { Collection<Class<? extends IFloodlightService>> l = new ArrayList<Class<? extends IFloodlightService>>(); l.add(IFloodlightProviderService.class); diff --git a/src/main/java/net/floodlightcontroller/storage/IStorageSourceService.java b/src/main/java/net/floodlightcontroller/storage/IStorageSourceService.java index 460b0a0b422a85495262db68643de5fb3bb35df2..f3a57cb3f58a9518e8394a4ac538644920b4e179 100644 --- a/src/main/java/net/floodlightcontroller/storage/IStorageSourceService.java +++ b/src/main/java/net/floodlightcontroller/storage/IStorageSourceService.java @@ -22,7 +22,7 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.Future; -import net.floodlightcontroller.core.IFloodlightService; +import net.floodlightcontroller.core.module.IFloodlightService; import net.floodlightcontroller.perfmon.IPktInProcessingTimeService; public interface IStorageSourceService extends IFloodlightService { diff --git a/src/main/java/net/floodlightcontroller/storage/memory/MemoryStorageSource.java b/src/main/java/net/floodlightcontroller/storage/memory/MemoryStorageSource.java index 955b62d7b83d527699db5f495ebc6766ca5bbec4..493570ce774f08161ea99e5cc9a412060b8dd9de 100644 --- a/src/main/java/net/floodlightcontroller/storage/memory/MemoryStorageSource.java +++ b/src/main/java/net/floodlightcontroller/storage/memory/MemoryStorageSource.java @@ -17,9 +17,9 @@ package net.floodlightcontroller.storage.memory; -import net.floodlightcontroller.core.IFloodlightService; import net.floodlightcontroller.core.module.FloodlightModuleContext; import net.floodlightcontroller.core.module.FloodlightModuleException; +import net.floodlightcontroller.core.module.IFloodlightService; import net.floodlightcontroller.perfmon.IPktInProcessingTimeService; import net.floodlightcontroller.storage.nosql.NoSqlStorageSource; import net.floodlightcontroller.storage.IStorageSourceService; @@ -180,7 +180,7 @@ public class MemoryStorageSource extends NoSqlStorageSource { // IFloodlightModule methods @Override - public Collection<Class<? extends IFloodlightService>> getServices() { + public Collection<Class<? extends IFloodlightService>> getModuleServices() { Collection<Class<? extends IFloodlightService>> l = new ArrayList<Class<? extends IFloodlightService>>(); l.add(IStorageSourceService.class); @@ -199,7 +199,7 @@ public class MemoryStorageSource extends NoSqlStorageSource { } @Override - public Collection<Class<? extends IFloodlightService>> getDependencies() { + public Collection<Class<? extends IFloodlightService>> getModuleDependencies() { // we don't have any depedencies return null; } diff --git a/src/main/java/net/floodlightcontroller/storage/web/StorageNotifyResource.java b/src/main/java/net/floodlightcontroller/storage/web/StorageNotifyResource.java index 39e2bbe8204c69ca08f59a216c8de0d98a8283c3..fcfa96f40d6b0e27271f48b9a91524d5b6a52a0e 100644 --- a/src/main/java/net/floodlightcontroller/storage/web/StorageNotifyResource.java +++ b/src/main/java/net/floodlightcontroller/storage/web/StorageNotifyResource.java @@ -43,7 +43,8 @@ public class StorageNotifyResource extends ServerResource { new TypeReference<List<StorageSourceNotification>>(){}); IStorageSourceService storageSource = - (IStorageSourceService)getContext().getAttributes().get("storageSource"); + (IStorageSourceService)getContext().getAttributes(). + get(IStorageSourceService.class.getCanonicalName()); storageSource.notifyListeners(notifications); HashMap<String, Object> model = new HashMap<String,Object>(); diff --git a/src/main/java/net/floodlightcontroller/storage/web/StorageWebRoutable.java b/src/main/java/net/floodlightcontroller/storage/web/StorageWebRoutable.java index 8f25d914b10f303f543bac5c83301d1579291e58..681847d8fa1013ef1a39c299ba2a03f8e710d6b1 100644 --- a/src/main/java/net/floodlightcontroller/storage/web/StorageWebRoutable.java +++ b/src/main/java/net/floodlightcontroller/storage/web/StorageWebRoutable.java @@ -21,7 +21,7 @@ import org.restlet.Context; import org.restlet.Restlet; import org.restlet.routing.Router; -import net.floodlightcontroller.core.web.RestletRoutable; +import net.floodlightcontroller.restserver.RestletRoutable; /** * Creates a router to handle the storage web URIs diff --git a/src/main/java/net/floodlightcontroller/topology/ITopologyService.java b/src/main/java/net/floodlightcontroller/topology/ITopologyService.java index 1ac0faa68154d6fe92f5d72c97deeef590415505..849cfaff37ff4d5a0adba06cd5befa6b05cda3e3 100644 --- a/src/main/java/net/floodlightcontroller/topology/ITopologyService.java +++ b/src/main/java/net/floodlightcontroller/topology/ITopologyService.java @@ -26,8 +26,8 @@ package net.floodlightcontroller.topology; import java.util.Map; import java.util.Set; -import net.floodlightcontroller.core.IFloodlightService; import net.floodlightcontroller.core.IOFSwitch; +import net.floodlightcontroller.core.module.IFloodlightService; /** * diff --git a/src/main/java/net/floodlightcontroller/topology/internal/TopologyImpl.java b/src/main/java/net/floodlightcontroller/topology/internal/TopologyImpl.java index cb97a3b745b4294a61371a76a98b5594105b99ce..5dc733baa4c8636a8bf47372256db8add48c5007 100644 --- a/src/main/java/net/floodlightcontroller/topology/internal/TopologyImpl.java +++ b/src/main/java/net/floodlightcontroller/topology/internal/TopologyImpl.java @@ -36,19 +36,19 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import net.floodlightcontroller.core.FloodlightContext; import net.floodlightcontroller.core.IFloodlightProviderService; -import net.floodlightcontroller.core.IFloodlightService; import net.floodlightcontroller.core.IOFMessageListener; import net.floodlightcontroller.core.IOFSwitch; import net.floodlightcontroller.core.IOFSwitchListener; -import net.floodlightcontroller.core.IRestApiService; import net.floodlightcontroller.core.module.FloodlightModuleContext; import net.floodlightcontroller.core.module.FloodlightModuleException; import net.floodlightcontroller.core.module.IFloodlightModule; +import net.floodlightcontroller.core.module.IFloodlightService; import net.floodlightcontroller.core.util.SingletonTask; import net.floodlightcontroller.packet.BPDU; import net.floodlightcontroller.packet.Ethernet; import net.floodlightcontroller.packet.LLDP; import net.floodlightcontroller.packet.LLDPTLV; +import net.floodlightcontroller.restserver.IRestApiService; import net.floodlightcontroller.routing.BroadcastTree; import net.floodlightcontroller.routing.IRoutingEngineService; import net.floodlightcontroller.storage.IResultSet; @@ -1350,7 +1350,7 @@ public class TopologyImpl // IFloodlightModule classes @Override - public Collection<Class<? extends IFloodlightService>> getServices() { + public Collection<Class<? extends IFloodlightService>> getModuleServices() { Collection<Class<? extends IFloodlightService>> l = new ArrayList<Class<? extends IFloodlightService>>(); l.add(ITopologyService.class); @@ -1370,7 +1370,7 @@ public class TopologyImpl } @Override - public Collection<Class<? extends IFloodlightService>> getDependencies() { + public Collection<Class<? extends IFloodlightService>> getModuleDependencies() { Collection<Class<? extends IFloodlightService>> l = new ArrayList<Class<? extends IFloodlightService>>(); l.add(IFloodlightProviderService.class); @@ -1484,6 +1484,10 @@ public class TopologyImpl floodlightProvider.addOFSwitchListener(this); // init our rest api - restApi.addRestApi(new TopologyWebRoutable(), ITopologyService.class, this); + if (restApi != null) { + restApi.addRestletRoutable(new TopologyWebRoutable()); + } else { + log.error("Could not instantiate REST API"); + } } } diff --git a/src/main/java/net/floodlightcontroller/topology/web/TopologyWebRoutable.java b/src/main/java/net/floodlightcontroller/topology/web/TopologyWebRoutable.java index 81749f577e925f204391ef414da0ce5fe6adee56..fa918c450dbe250d973861db226afa8f26f5ac06 100644 --- a/src/main/java/net/floodlightcontroller/topology/web/TopologyWebRoutable.java +++ b/src/main/java/net/floodlightcontroller/topology/web/TopologyWebRoutable.java @@ -4,8 +4,8 @@ import org.restlet.Context; import org.restlet.Restlet; import org.restlet.routing.Router; -import net.floodlightcontroller.core.web.RestletRoutable; import net.floodlightcontroller.core.web.SwitchClustersResource; +import net.floodlightcontroller.restserver.RestletRoutable; public class TopologyWebRoutable implements RestletRoutable { /** diff --git a/src/test/java/net/floodlightcontroller/core/internal/ControllerTest.java b/src/test/java/net/floodlightcontroller/core/internal/ControllerTest.java index 2ca28981fde23a4559cb87c38ef39568d9bfc430..953caf4c81164457d9d1db5c8762b73211b155c8 100644 --- a/src/test/java/net/floodlightcontroller/core/internal/ControllerTest.java +++ b/src/test/java/net/floodlightcontroller/core/internal/ControllerTest.java @@ -31,10 +31,14 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import net.floodlightcontroller.core.FloodlightContext; import net.floodlightcontroller.core.IFloodlightProviderService; +import net.floodlightcontroller.core.IOFMessageFilterManagerService; import net.floodlightcontroller.core.IOFMessageListener; import net.floodlightcontroller.core.IOFMessageListener.Command; import net.floodlightcontroller.core.IOFSwitch; import net.floodlightcontroller.core.OFMessageFilterManager; +import net.floodlightcontroller.core.module.FloodlightModuleContext; +import net.floodlightcontroller.core.module.FloodlightModuleLoader; +import net.floodlightcontroller.core.module.IFloodlightModuleContext; import net.floodlightcontroller.core.test.MockFloodlightProvider; import net.floodlightcontroller.packet.ARP; import net.floodlightcontroller.packet.Ethernet; @@ -67,11 +71,14 @@ public class ControllerTest extends FloodlightTestCase { private Controller controller; @Override - public void setUp() { + public void setUp() throws Exception { super.setUp(); - - controller = new Controller(); - controller.init(); + FloodlightModuleLoader fml = new FloodlightModuleLoader(); + IFloodlightModuleContext moduleContext = fml.loadModulesFromList( + new String[] {"net.floodlightcontroller.core.CoreModule"}); + controller = + (Controller) moduleContext. + getServiceImpl(IFloodlightProviderService.class); } public Controller getController() { @@ -281,13 +288,16 @@ public class ControllerTest extends FloodlightTestCase { @Test public void testMessageFilterManager() throws Exception { - - MockFloodlightProvider mbp = new MockFloodlightProvider(); + FloodlightModuleContext fmCntx = new FloodlightModuleContext(); + MockFloodlightProvider mfp = new MockFloodlightProvider(); + OFMessageFilterManager mfm = new OFMessageFilterManager(); + fmCntx.addService(IOFMessageFilterManagerService.class, mfm); + fmCntx.addService(IFloodlightProviderService.class, mfp); String sid = null; - OFMessageFilterManager mfm = new OFMessageFilterManager(); - mfm.init(mbp); - mfm.startUp(); + + mfm.init(fmCntx); + mfm.startUp(fmCntx); ConcurrentHashMap <String, String> filter; int i; @@ -361,15 +371,15 @@ public class ControllerTest extends FloodlightTestCase { List <IOFMessageListener> lm; // Check to see if all the listeners are active. - lm = mbp.getListeners().get(OFType.PACKET_OUT); + lm = mfp.getListeners().get(OFType.PACKET_OUT); assertTrue(lm.size() == 1); assertTrue(lm.get(0).equals(mfm)); - lm = mbp.getListeners().get(OFType.FLOW_MOD); + lm = mfp.getListeners().get(OFType.FLOW_MOD); assertTrue(lm.size() == 1); assertTrue(lm.get(0).equals(mfm)); - lm = mbp.getListeners().get(OFType.PACKET_IN); + lm = mfp.getListeners().get(OFType.PACKET_IN); assertTrue(lm.size() == 1); assertTrue(lm.get(0).equals(mfm)); diff --git a/src/test/java/net/floodlightcontroller/core/test/MockFloodlightProvider.java b/src/test/java/net/floodlightcontroller/core/test/MockFloodlightProvider.java index 2c6e86c43f853237c7be16dab0e6acd852a351dc..df1d29e1a44d44092f793bcf0f05e430c70396c0 100644 --- a/src/test/java/net/floodlightcontroller/core/test/MockFloodlightProvider.java +++ b/src/test/java/net/floodlightcontroller/core/test/MockFloodlightProvider.java @@ -32,6 +32,7 @@ import net.floodlightcontroller.core.IOFSwitch; import net.floodlightcontroller.core.IOFSwitchFilter; import net.floodlightcontroller.core.IOFSwitchListener; import net.floodlightcontroller.core.IOFMessageListener.Command; +import net.floodlightcontroller.core.internal.CmdLineSettings; import net.floodlightcontroller.packet.Ethernet; import org.openflow.protocol.OFMessage; @@ -194,4 +195,14 @@ public class MockFloodlightProvider implements IFloodlightProviderService { public BasicFactory getOFMessageFactory() { return factory; } + + @Override + public void run() { + // no-op + } + + @Override + public void setCmdLineOptions(CmdLineSettings settings) { + // no-op + } } diff --git a/src/test/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImplTest.java b/src/test/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImplTest.java index f8aacabe0f1dbb09af9be96d852eaa5aa1a87043..50d11bfc5979e850e6fc37088a71e53e97680599 100644 --- a/src/test/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImplTest.java +++ b/src/test/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImplTest.java @@ -61,13 +61,14 @@ public class DeviceManagerImplTest extends FloodlightTestCase { DeviceManagerImpl deviceManager; @Before - public void setUp() { + public void setUp() throws Exception { super.setUp(); mockFloodlightProvider = getMockFloodlightProvider(); deviceManager = new DeviceManagerImpl(); deviceManager.setFloodlightProvider(mockFloodlightProvider); - deviceManager.setStorageSource(new MemoryStorageSource()); + deviceManager.storageSource = new MemoryStorageSource(); + deviceManager.startUp(null); //deviceManager.startUp(); // Build our test packet diff --git a/src/test/java/net/floodlightcontroller/devicemanager/test/MockDeviceManager.java b/src/test/java/net/floodlightcontroller/devicemanager/test/MockDeviceManager.java index 13b3ab675fa579440fec0c36dcaac8941990eb00..31ba67ad93417e4c90dfe3f36b5f87181e0f91f5 100644 --- a/src/test/java/net/floodlightcontroller/devicemanager/test/MockDeviceManager.java +++ b/src/test/java/net/floodlightcontroller/devicemanager/test/MockDeviceManager.java @@ -26,6 +26,7 @@ import java.util.Map; import java.util.Map.Entry; import net.floodlightcontroller.devicemanager.Device; +import net.floodlightcontroller.devicemanager.IDeviceManagerAware; import net.floodlightcontroller.devicemanager.IDeviceManagerService; import net.floodlightcontroller.packet.Ethernet; @@ -92,4 +93,10 @@ public class MockDeviceManager implements IDeviceManagerService { } return devices; } + + @Override + public void addListener(IDeviceManagerAware listener) { + // TODO Auto-generated method stub + + } } diff --git a/src/test/java/net/floodlightcontroller/forwarding/ForwardingTest.java b/src/test/java/net/floodlightcontroller/forwarding/ForwardingTest.java index 28dcbe70b124ceac9b1b2011124386f947f44fff..9c71bb084b2ba99aa7fd938838ed5a2a13bd01ad 100644 --- a/src/test/java/net/floodlightcontroller/forwarding/ForwardingTest.java +++ b/src/test/java/net/floodlightcontroller/forwarding/ForwardingTest.java @@ -81,7 +81,7 @@ public class ForwardingTest extends FloodlightTestCase { protected Date currentDate; @Override - public void setUp() { + public void setUp() throws Exception { super.setUp(); // Mock context diff --git a/src/test/java/net/floodlightcontroller/hub/HubTest.java b/src/test/java/net/floodlightcontroller/hub/HubTest.java index 6311b2518e067349f215be66b6775adb375739f1..b4a215cd066a7772fc669683dba47aedeb8e7bca 100644 --- a/src/test/java/net/floodlightcontroller/hub/HubTest.java +++ b/src/test/java/net/floodlightcontroller/hub/HubTest.java @@ -60,7 +60,7 @@ public class HubTest extends FloodlightTestCase { private Hub hub; @Before - public void setUp() { + public void setUp() throws Exception { super.setUp(); mockFloodlightProvider = getMockFloodlightProvider(); diff --git a/src/test/java/net/floodlightcontroller/learningswitch/LearningSwitchTest.java b/src/test/java/net/floodlightcontroller/learningswitch/LearningSwitchTest.java index ecbb4d2a2991a54a25276e3ee19c133e27b06bdc..613f8990dacbf0e965b9426b39cebd5b144cf9cd 100644 --- a/src/test/java/net/floodlightcontroller/learningswitch/LearningSwitchTest.java +++ b/src/test/java/net/floodlightcontroller/learningswitch/LearningSwitchTest.java @@ -63,7 +63,7 @@ public class LearningSwitchTest extends FloodlightTestCase { private LearningSwitch learningSwitch; @Before - public void setUp() { + public void setUp() throws Exception { super.setUp(); mockFloodlightProvider = getMockFloodlightProvider(); diff --git a/src/test/java/net/floodlightcontroller/staticflowentry/StaticFlowEntryPusherTest.java b/src/test/java/net/floodlightcontroller/staticflowentry/StaticFlowEntryPusherTest.java index addc9e5555c25e1a2dd8e7e87e1523b76987734b..cc9d82a49708862ce66a6ec7160ba72216970201 100644 --- a/src/test/java/net/floodlightcontroller/staticflowentry/StaticFlowEntryPusherTest.java +++ b/src/test/java/net/floodlightcontroller/staticflowentry/StaticFlowEntryPusherTest.java @@ -27,9 +27,10 @@ import org.openflow.util.HexString; public class StaticFlowEntryPusherTest extends FloodlightTestCase { String flowMod1, flowMod2; static String TestSwitch1DPID = "00:00:00:00:00:00:00:01"; + StaticFlowEntryPusher staticFlowEntryPusher; @Before - public void setUp() { + public void setUp() throws Exception { super.setUp(); flowMod1 = "{\"switch\": \"00:00:00:00:00:00:00:01\", " + "\"name\": \"flow-mod-1\", " + @@ -46,11 +47,15 @@ public class StaticFlowEntryPusherTest extends FloodlightTestCase { "\"ingress-port\": \"2\"," + "\"active\": \"true\", " + "\"actions\": \"output=3\"}"; - } + + staticFlowEntryPusher = new StaticFlowEntryPusher(); + staticFlowEntryPusher.floodlightProvider = + getMockFloodlightProvider(); + staticFlowEntryPusher.startUp(null); +} @Test public void testAddAndRemoveEntries() throws Exception { - StaticFlowEntryPusher staticFlowEntryPusher = new StaticFlowEntryPusher(); IOFSwitch mockSwitch = createMock(IOFSwitch.class); long dpid = HexString.toLong(TestSwitch1DPID); Capture<OFMessage> writeCapture = new Capture<OFMessage>(CaptureType.ALL); diff --git a/src/test/java/net/floodlightcontroller/storage/memory/tests/MemoryStorageTest.java b/src/test/java/net/floodlightcontroller/storage/memory/tests/MemoryStorageTest.java index 9e8d7c0a82b0f0afe484804208a00d795a93f678..a0f79f1aa183673cf8125a749667626760c35a72 100644 --- a/src/test/java/net/floodlightcontroller/storage/memory/tests/MemoryStorageTest.java +++ b/src/test/java/net/floodlightcontroller/storage/memory/tests/MemoryStorageTest.java @@ -24,7 +24,7 @@ import org.junit.Before; public class MemoryStorageTest extends StorageTest { @Before - public void setUp() { + public void setUp() throws Exception { storageSource = new MemoryStorageSource(); super.setUp(); } diff --git a/src/test/java/net/floodlightcontroller/storage/tests/StorageTest.java b/src/test/java/net/floodlightcontroller/storage/tests/StorageTest.java index 16056d3cbe0ea8a4aba542ddd9e58c26dc486279..2aa44bd120449e4f3daf2d8ea51dd0f99ad10e38 100644 --- a/src/test/java/net/floodlightcontroller/storage/tests/StorageTest.java +++ b/src/test/java/net/floodlightcontroller/storage/tests/StorageTest.java @@ -139,7 +139,7 @@ public abstract class StorageTest extends FloodlightTestCase { } } - public void setUp() { + public void setUp() throws Exception { super.setUp(); IPktInProcessingTimeService pktinProcessingTime = new PktInProcessingTime(); storageSource.setPktinProcessingTime(pktinProcessingTime); diff --git a/src/test/java/net/floodlightcontroller/test/FloodlightTestCase.java b/src/test/java/net/floodlightcontroller/test/FloodlightTestCase.java index 23d649a93cf639e98981c7a74a10421eecf90052..d0fc5c48abcab71dc69512bd74fec22e4573058b 100644 --- a/src/test/java/net/floodlightcontroller/test/FloodlightTestCase.java +++ b/src/test/java/net/floodlightcontroller/test/FloodlightTestCase.java @@ -64,7 +64,7 @@ public class FloodlightTestCase extends TestCase { } @Override - public void setUp() { + public void setUp() throws Exception { mockFloodlightProvider = new MockFloodlightProvider(); } diff --git a/src/test/java/net/floodlightcontroller/topology/internal/TopologyImplTest.java b/src/test/java/net/floodlightcontroller/topology/internal/TopologyImplTest.java index 8bec5d93fe6882bffab0b44c688c111d8600aad2..bccbcb7a5de118382aad7d8dc6c3074e401dacbc 100644 --- a/src/test/java/net/floodlightcontroller/topology/internal/TopologyImplTest.java +++ b/src/test/java/net/floodlightcontroller/topology/internal/TopologyImplTest.java @@ -35,10 +35,13 @@ import org.openflow.protocol.OFPortStatus; import org.openflow.protocol.OFPhysicalPort; import net.floodlightcontroller.core.IOFSwitch; +import net.floodlightcontroller.core.module.FloodlightModuleContext; +import net.floodlightcontroller.routing.IRoutingEngineService; import net.floodlightcontroller.routing.dijkstra.RoutingImpl; import net.floodlightcontroller.storage.memory.MemoryStorageSource; import net.floodlightcontroller.test.FloodlightTestCase; import net.floodlightcontroller.topology.ITopologyListener; +import net.floodlightcontroller.topology.ITopologyService; import net.floodlightcontroller.topology.LinkInfo; import net.floodlightcontroller.topology.LinkTuple; @@ -60,17 +63,20 @@ public class TopologyImplTest extends FloodlightTestCase { } @Before - public void setUp() { + public void setUp() throws Exception { super.setUp(); + FloodlightModuleContext cntx = new FloodlightModuleContext(); topology = new TopologyImpl(); - topology.setFloodlightProvider(getMockFloodlightProvider()); - topology.setStorageSource(new MemoryStorageSource()); + topology.floodlightProvider = getMockFloodlightProvider(); + topology.storageSource = new MemoryStorageSource(); RoutingImpl routingEngine = new RoutingImpl(); - topology.setRoutingEngine(routingEngine); - HashSet<ITopologyListener> topologyAware = new HashSet<ITopologyListener>(); - topologyAware.add(routingEngine); - topology.setTopologyAware(topologyAware); - topology.startUp(); + topology.routingEngine = routingEngine; + topology.topologyAware = new HashSet<ITopologyListener>(); + cntx.addService(IRoutingEngineService.class, routingEngine); + cntx.addService(ITopologyService.class, topology); + routingEngine.init(cntx); + routingEngine.startUp(cntx); // Doesn't use context + topology.startUp(cntx); //Topology doens't use the context here } @Test