diff --git a/src/main/java/net/floodlightcontroller/core/module/ModuleLoaderResource.java b/src/main/java/net/floodlightcontroller/core/module/ModuleLoaderResource.java new file mode 100644 index 0000000000000000000000000000000000000000..94f4147d50417f101ff7a14558e9bf484d351606 --- /dev/null +++ b/src/main/java/net/floodlightcontroller/core/module/ModuleLoaderResource.java @@ -0,0 +1,74 @@ +package net.floodlightcontroller.core.module; + +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + + +import org.restlet.resource.Get; +import org.restlet.resource.ServerResource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ModuleLoaderResource extends ServerResource { + protected static Logger log = + LoggerFactory.getLogger(ModuleLoaderResource.class); + + @Get("json") + public Map<String, Object> retrieve() { + Map<String, Object> model = new HashMap<String, Object>(); + + Set<String> loadedModules = new HashSet<String>(); + for (Object val : getContext().getAttributes().values()) { + if ((val instanceof IFloodlightModule) || (val instanceof IFloodlightService)) { + String serviceImpl = val.getClass().getCanonicalName(); + loadedModules.add(serviceImpl); + // log.debug("Tracking serviceImpl " + serviceImpl); + } + } + + for (String moduleName : + FloodlightModuleLoader.moduleNameMap.keySet() ) { + Map<String,Object> moduleInfo = new HashMap<String, Object>(); + + IFloodlightModule module = + FloodlightModuleLoader.moduleNameMap.get( + moduleName); + + Collection<Class<? extends IFloodlightService>> deps = + module.getModuleDependencies(); + if ( deps == null) + deps = new HashSet<Class<? extends IFloodlightService>>(); + moduleInfo.put("depends", deps); + + Collection<Class<? extends IFloodlightService>> provides = + module.getModuleServices(); + if ( provides == null) + provides = new HashSet<Class<? extends IFloodlightService>>(); + moduleInfo.put("provides", provides); + + moduleInfo.put("loaded", false); // not loaded, by default + + // check if this module is loaded directly + if (loadedModules.contains(module.getClass().getCanonicalName())) { + moduleInfo.put("loaded", true); + } else { + // if not, then maybe one of the services it exports is loaded + for (Class<? extends IFloodlightService> service : provides) { + String modString = module.getServiceImpls().get(service).getClass().getCanonicalName(); + if (loadedModules.contains(modString)) + moduleInfo.put("loaded", true); + /* else + log.debug("ServiceImpl not loaded " + modString); */ + } + } + + + model.put(moduleName, moduleInfo); + } + return model; + } +} diff --git a/src/main/java/net/floodlightcontroller/core/web/CoreWebRoutable.java b/src/main/java/net/floodlightcontroller/core/web/CoreWebRoutable.java index 8443c343c05faf1de14084dfbe37888066007741..ad168d66c950a1b19cecf567956e2e6cf5eea2b8 100644 --- a/src/main/java/net/floodlightcontroller/core/web/CoreWebRoutable.java +++ b/src/main/java/net/floodlightcontroller/core/web/CoreWebRoutable.java @@ -17,6 +17,7 @@ package net.floodlightcontroller.core.web; +import net.floodlightcontroller.core.module.ModuleLoaderResource; import net.floodlightcontroller.restserver.RestletRoutable; import org.restlet.Context; @@ -36,6 +37,7 @@ public class CoreWebRoutable implements RestletRoutable { @Override public Restlet getRestlet(Context context) { Router router = new Router(context); + router.attach("/module/list/json", ModuleLoaderResource.class); router.attach("/switch/all/{statType}/json", AllSwitchStatisticsResource.class); router.attach("/switch/{switchId}/{statType}/json", SwitchStatisticsResource.class); router.attach("/controller/switches/json", ControllerSwitchesResource.class);