blob: 21cbfc3704a27c40f5b85f958c17897c36e17586 [file] [log] [blame]
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -08001package net.floodlightcontroller.core.module;
2
3import java.util.Collection;
4import java.util.HashMap;
5import java.util.HashSet;
6import java.util.Map;
7import java.util.Set;
8
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -08009import org.restlet.resource.Get;
10import org.restlet.resource.ServerResource;
11import org.slf4j.Logger;
12import org.slf4j.LoggerFactory;
13
14/**
15 * Returns list of modules loaded by Floodlight.
Ray Milkey269ffb92014-04-03 14:43:30 -070016 *
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080017 * @author Rob Sherwood
18 */
19public class ModuleLoaderResource extends ServerResource {
Ray Milkey269ffb92014-04-03 14:43:30 -070020 protected final static Logger log =
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080021 LoggerFactory.getLogger(ModuleLoaderResource.class);
Ray Milkey269ffb92014-04-03 14:43:30 -070022
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080023 /**
24 * Retrieves information about loaded modules.
Ray Milkey269ffb92014-04-03 14:43:30 -070025 *
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080026 * @return Information about loaded modules.
27 */
28 @Get("json")
29 public Map<String, Object> retrieve() {
Ray Milkey269ffb92014-04-03 14:43:30 -070030 return retrieveInternal(false);
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080031 }
Ray Milkey269ffb92014-04-03 14:43:30 -070032
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080033 /**
34 * Retrieves all modules and their dependencies available
35 * to Floodlight.
Ray Milkey269ffb92014-04-03 14:43:30 -070036 *
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080037 * @param loadedOnly Whether to return all modules available or only the ones loaded.
38 * @return Information about modules available or loaded.
39 */
Ray Milkey269ffb92014-04-03 14:43:30 -070040 public Map<String, Object> retrieveInternal(boolean loadedOnly) {
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080041 Map<String, Object> model = new HashMap<String, Object>();
42
43 Set<String> loadedModules = new HashSet<String>();
44 for (Object val : getContext().getAttributes().values()) {
Ray Milkey269ffb92014-04-03 14:43:30 -070045 if ((val instanceof IFloodlightModule) || (val instanceof IFloodlightService)) {
46 String serviceImpl = val.getClass().getCanonicalName();
47 loadedModules.add(serviceImpl);
48 // log.debug("Tracking serviceImpl " + serviceImpl);
49 }
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080050 }
51
Ray Milkey269ffb92014-04-03 14:43:30 -070052 for (String moduleName :
53 FloodlightModuleLoader.moduleNameMap.keySet()) {
54 Map<String, Object> moduleInfo = new HashMap<String, Object>();
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080055
Ray Milkey269ffb92014-04-03 14:43:30 -070056 IFloodlightModule module =
57 FloodlightModuleLoader.moduleNameMap.get(
58 moduleName);
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080059
Ray Milkey269ffb92014-04-03 14:43:30 -070060 Collection<Class<? extends IFloodlightService>> deps =
61 module.getModuleDependencies();
62 if (deps == null)
63 deps = new HashSet<Class<? extends IFloodlightService>>();
64 Map<String, Object> depsMap = new HashMap<String, Object>();
65 for (Class<? extends IFloodlightService> service : deps) {
66 Object serviceImpl = getContext().getAttributes().get(service.getCanonicalName());
67 if (serviceImpl != null)
68 depsMap.put(service.getCanonicalName(), serviceImpl.getClass().getCanonicalName());
69 else
70 depsMap.put(service.getCanonicalName(), "<unresolved>");
71
72 }
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080073 moduleInfo.put("depends", depsMap);
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080074
Ray Milkey269ffb92014-04-03 14:43:30 -070075 Collection<Class<? extends IFloodlightService>> provides =
76 module.getModuleServices();
77 if (provides == null)
78 provides = new HashSet<Class<? extends IFloodlightService>>();
79 Map<String, Object> providesMap = new HashMap<String, Object>();
80 for (Class<? extends IFloodlightService> service : provides) {
81 providesMap.put(service.getCanonicalName(), module.getServiceImpls().get(service).getClass().getCanonicalName());
82 }
83 moduleInfo.put("provides", providesMap);
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080084
Ray Milkey269ffb92014-04-03 14:43:30 -070085 moduleInfo.put("loaded", false); // not loaded, by default
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -080086
Ray Milkey269ffb92014-04-03 14:43:30 -070087 // check if this module is loaded directly
88 if (loadedModules.contains(module.getClass().getCanonicalName())) {
89 moduleInfo.put("loaded", true);
90 } else {
91 // if not, then maybe one of the services it exports is loaded
92 for (Class<? extends IFloodlightService> service : provides) {
93 String modString = module.getServiceImpls().get(service).getClass().getCanonicalName();
94 if (loadedModules.contains(modString))
95 moduleInfo.put("loaded", true);
96 /* else
97 log.debug("ServiceImpl not loaded " + modString); */
98 }
99 }
100
101 if ((Boolean) moduleInfo.get("loaded") || !loadedOnly)
102 model.put(moduleName, moduleInfo);
103 }
Umesh Krishnaswamy345ee992012-12-13 20:29:48 -0800104 return model;
105 }
106}