blob: 5c372fbf00f99281bc375a517a993d44fc362b92 [file] [log] [blame]
HIGUCHI Yuta155cfc52013-06-14 15:54:16 -07001package net.onrc.onos.ofcontroller.floodlightlistener;
Pankaj Berdeda809572013-02-22 15:31:20 -08002
3import java.util.ArrayList;
4import java.util.Collection;
5import java.util.Map;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -07006import java.util.concurrent.ScheduledExecutorService;
7import java.util.concurrent.TimeUnit;
Pankaj Berdeda809572013-02-22 15:31:20 -08008
Pankaj Berde465ac7c2013-05-23 13:47:49 -07009import org.openflow.protocol.OFPhysicalPort;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070010import org.openflow.util.HexString;
Pankaj Berdeda809572013-02-22 15:31:20 -080011import org.slf4j.Logger;
12import org.slf4j.LoggerFactory;
13
14import net.floodlightcontroller.core.IFloodlightProviderService;
15import net.floodlightcontroller.core.IOFSwitch;
16import net.floodlightcontroller.core.IOFSwitchListener;
Pankaj Berdeda809572013-02-22 15:31:20 -080017import net.floodlightcontroller.core.module.FloodlightModuleContext;
18import net.floodlightcontroller.core.module.FloodlightModuleException;
19import net.floodlightcontroller.core.module.IFloodlightModule;
20import net.floodlightcontroller.core.module.IFloodlightService;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070021import net.floodlightcontroller.core.util.SingletonTask;
Pankaj Berdeda809572013-02-22 15:31:20 -080022import net.floodlightcontroller.devicemanager.IDevice;
23import net.floodlightcontroller.devicemanager.IDeviceListener;
24import net.floodlightcontroller.devicemanager.IDeviceService;
Pankaj Berde00e90882013-06-10 21:25:05 -070025import net.floodlightcontroller.routing.Link;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070026import net.floodlightcontroller.threadpool.IThreadPoolService;
yoshi2fd4c7e2013-11-22 15:47:55 -080027import net.onrc.onos.graph.DBOperation;
28import net.onrc.onos.graph.DBConnection;
29import net.onrc.onos.graph.GraphDBManager;
Pankaj Berde38646d62013-06-21 11:34:04 -070030import net.onrc.onos.graph.IDBConnection;
31import net.onrc.onos.graph.LocalTopologyEventListener;
HIGUCHI Yuta2d011582013-06-15 01:47:11 -070032import net.onrc.onos.ofcontroller.core.IDeviceStorage;
33import net.onrc.onos.ofcontroller.core.ILinkStorage;
HIGUCHI Yuta36cf0762013-06-14 14:25:38 -070034import net.onrc.onos.ofcontroller.core.IOFSwitchPortListener;
HIGUCHI Yuta20514902013-06-12 11:24:16 -070035import net.onrc.onos.ofcontroller.core.ISwitchStorage;
36import net.onrc.onos.ofcontroller.core.INetMapStorage.DM_OPERATION;
HIGUCHI Yuta20514902013-06-12 11:24:16 -070037import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
38import net.onrc.onos.ofcontroller.core.ISwitchStorage.SwitchState;
HIGUCHI Yuta2d011582013-06-15 01:47:11 -070039import net.onrc.onos.ofcontroller.core.internal.DeviceStorageImpl;
40import net.onrc.onos.ofcontroller.core.internal.LinkStorageImpl;
HIGUCHI Yutaed49ef72013-06-12 11:34:10 -070041import net.onrc.onos.ofcontroller.core.internal.SwitchStorageImpl;
HIGUCHI Yutaa56fbde2013-06-17 14:26:05 -070042import net.onrc.onos.ofcontroller.linkdiscovery.ILinkDiscoveryListener;
43import net.onrc.onos.ofcontroller.linkdiscovery.ILinkDiscoveryService;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070044import net.onrc.onos.registry.controller.IControllerRegistryService;
45import net.onrc.onos.registry.controller.IControllerRegistryService.ControlChangeCallback;
46import net.onrc.onos.registry.controller.RegistryException;
Pankaj Berdeda809572013-02-22 15:31:20 -080047
HIGUCHI Yuta155cfc52013-06-14 15:54:16 -070048public class NetworkGraphPublisher implements IDeviceListener, IOFSwitchListener, IOFSwitchPortListener,
Pankaj Berdeda809572013-02-22 15:31:20 -080049 ILinkDiscoveryListener, IFloodlightModule {
50
51 protected IDeviceStorage devStore;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070052 protected ISwitchStorage swStore;
Pankaj Berde00e90882013-06-10 21:25:05 -070053 protected ILinkStorage linkStore;
Pankaj Berdeda809572013-02-22 15:31:20 -080054 protected static Logger log;
55 protected IDeviceService deviceService;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070056 protected IControllerRegistryService registryService;
yoshi2fd4c7e2013-11-22 15:47:55 -080057 protected DBOperation op;
Pankaj Berdeda809572013-02-22 15:31:20 -080058
59 protected static final String DBConfigFile = "dbconf";
yoshi2fd4c7e2013-11-22 15:47:55 -080060 protected static final String GraphDBStore = "graph_db_store";
Pankaj Berde1e3e5ba2013-03-15 13:17:53 -070061 protected static final String CleanupEnabled = "EnableCleanup";
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070062 protected IThreadPoolService threadPool;
Pankaj Berde465ac7c2013-05-23 13:47:49 -070063 protected IFloodlightProviderService floodlightProvider;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070064
Pankaj Berde62016142013-04-09 15:35:50 -070065 protected final int CLEANUP_TASK_INTERVAL = 60; // 1 min
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070066 protected SingletonTask cleanupTask;
Pankaj Berde00e90882013-06-10 21:25:05 -070067 protected ILinkDiscoveryService linkDiscovery;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070068
69 /**
70 * Cleanup and synch switch state from registry
71 */
72 protected class SwitchCleanup implements ControlChangeCallback, Runnable {
73 @Override
74 public void run() {
75 try {
76 log.debug("Running cleanup thread");
77 switchCleanup();
78 }
79 catch (Exception e) {
80 log.error("Error in cleanup thread", e);
81 } finally {
Toshio Koide70ba38b2013-06-13 14:05:05 -070082 op.close();
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070083 cleanupTask.reschedule(CLEANUP_TASK_INTERVAL,
Pankaj Berde99fcee12013-03-18 09:41:53 -070084 TimeUnit.SECONDS);
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070085 }
86 }
87
88 @Override
89 public void controlChanged(long dpid, boolean hasControl) {
90 // TODO Auto-generated method stub
91
92 if (hasControl) {
Pankaj Berde99fcee12013-03-18 09:41:53 -070093 log.debug("got control to set inactive sw {}", HexString.toHexString(dpid));
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070094 swStore.update(HexString.toHexString(dpid),SwitchState.INACTIVE, DM_OPERATION.UPDATE);
95 registryService.releaseControl(dpid);
96 }
97 }
98 }
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070099
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700100 protected void switchCleanup() {
Toshio Koide70ba38b2013-06-13 14:05:05 -0700101 op.close();
102 Iterable<ISwitchObject> switches = op.getActiveSwitches();
Jonathan Hartf02a0932013-03-18 18:30:48 -0700103
104 log.debug("Checking for inactive switches");
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700105 // For each switch check if a controller exists in controller registry
106 for (ISwitchObject sw: switches) {
Jonathan Hartf02a0932013-03-18 18:30:48 -0700107 //log.debug("checking if switch is inactive: {}", sw.getDPID());
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700108 try {
109 long dpid = HexString.toLong(sw.getDPID());
110 String controller = registryService.getControllerForSwitch(dpid);
111 if (controller == null) {
Pankaj Berde99fcee12013-03-18 09:41:53 -0700112 log.debug("request Control to set inactive sw {}", HexString.toHexString(dpid));
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700113 registryService.requestControl(dpid, new SwitchCleanup());
Umesh Krishnaswamy255b9882013-04-02 19:55:43 -0700114 //} else {
115 // log.debug("sw {} is controlled by controller: {}",HexString.toHexString(dpid),controller);
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700116 }
117 } catch (NumberFormatException e) {
118 // TODO Auto-generated catch block
119 e.printStackTrace();
120 } catch (RegistryException e) {
Jonathan Hart4baf3be2013-03-21 18:26:13 -0700121 log.debug("Caught RegistryException trying to requestControl in cleanup thread");
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700122 e.printStackTrace();
123 }
124 }
Toshio Koide70ba38b2013-06-13 14:05:05 -0700125 op.close();
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700126 }
Pankaj Berdeda809572013-02-22 15:31:20 -0800127
128 @Override
129 public void linkDiscoveryUpdate(LDUpdate update) {
130 // TODO Auto-generated method stub
Pankaj Berde00e90882013-06-10 21:25:05 -0700131 Link lt = new Link(update.getSrc(),update.getSrcPort(),update.getDst(),update.getDstPort());
Jonathan Harte7c2d2f2013-07-27 18:08:34 +1200132 //log.debug("{}:LinkDicoveryUpdate(): Updating Link {}",this.getClass(), lt);
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700133
Jonathan Harte7c2d2f2013-07-27 18:08:34 +1200134 switch (update.getOperation()) {
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700135 case LINK_REMOVED:
Jonathan Harte7c2d2f2013-07-27 18:08:34 +1200136 log.debug("LinkDiscoveryUpdate(): Removing link {}", lt);
Pankaj Berde00e90882013-06-10 21:25:05 -0700137 linkStore.update(lt, DM_OPERATION.DELETE);
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700138 // TODO: Move network map link removal here
139 // reconcile paths here
140// IPortObject srcPort = conn.utils().searchPort(conn, HexString.toHexString(update.getSrc()), update.getSrcPort());
141 break;
Pankaj Berde00e90882013-06-10 21:25:05 -0700142 case LINK_UPDATED:
Jonathan Harte7c2d2f2013-07-27 18:08:34 +1200143 log.debug("LinkDiscoveryUpdate(): Updating link {}", lt);
Pankaj Berde00e90882013-06-10 21:25:05 -0700144 linkStore.update(lt, DM_OPERATION.UPDATE);
145 break;
146 case LINK_ADDED:
Jonathan Harte7c2d2f2013-07-27 18:08:34 +1200147 log.debug("LinkDiscoveryUpdate(): Adding link {}", lt);
Pankaj Berde00e90882013-06-10 21:25:05 -0700148 linkStore.update(lt, DM_OPERATION.INSERT);
149 break;
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700150
151 default:
152 break;
153 }
Pankaj Berdeda809572013-02-22 15:31:20 -0800154
155 }
156
157 @Override
158 public void addedSwitch(IOFSwitch sw) {
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700159
160 if (registryService.hasControl(sw.getId())) {
Pankaj Berdebbd38612013-06-22 05:59:12 -0700161 swStore.addSwitch(sw);
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700162 }
Pankaj Berdeda809572013-02-22 15:31:20 -0800163
164 }
165
166 @Override
167 public void removedSwitch(IOFSwitch sw) {
168 // TODO Auto-generated method stub
169
170 }
171
172 @Override
173 public void switchPortChanged(Long switchId) {
174 // TODO Auto-generated method stub
175
176 }
177
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700178
179 @Override
180 public void switchPortAdded(Long switchId, OFPhysicalPort port) {
181 // TODO Auto-generated method stub
182 swStore.addPort(HexString.toHexString(switchId), port);
183 }
184
185 @Override
186 public void switchPortRemoved(Long switchId, OFPhysicalPort port) {
187 // TODO Auto-generated method stub
188 swStore.deletePort(HexString.toHexString(switchId), port.getPortNumber());
189 }
190
Pankaj Berdeda809572013-02-22 15:31:20 -0800191 @Override
192 public String getName() {
HIGUCHI Yuta155cfc52013-06-14 15:54:16 -0700193 return "NetworkGraphPublisher";
Pankaj Berdeda809572013-02-22 15:31:20 -0800194 }
195
196 @Override
197 public void deviceAdded(IDevice device) {
198 // TODO Auto-generated method stub
199 log.debug("{}:deviceAdded(): Adding device {}",this.getClass(),device.getMACAddressString());
200 devStore.addDevice(device);
201 }
202
203 @Override
204 public void deviceRemoved(IDevice device) {
205 // TODO Auto-generated method stub
206
207 }
208
209 @Override
210 public void deviceMoved(IDevice device) {
211 // TODO Auto-generated method stub
212 devStore.changeDeviceAttachments(device);
213
214 }
215
216 @Override
217 public void deviceIPV4AddrChanged(IDevice device) {
218 // TODO Auto-generated method stub
219 devStore.changeDeviceIPv4Address(device);
220
221 }
222
223 @Override
224 public void deviceVlanChanged(IDevice device) {
225 // TODO Auto-generated method stub
226 }
227
228
229 @Override
230 public Collection<Class<? extends IFloodlightService>> getModuleServices() {
231 // TODO Auto-generated method stub
232 return null;
233 }
234
235 @Override
236 public Map<Class<? extends IFloodlightService>, IFloodlightService> getServiceImpls() {
237 // TODO Auto-generated method stub
238 return null;
239 }
240
241 @Override
242 public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
243 Collection<Class<? extends IFloodlightService>> l =
244 new ArrayList<Class<? extends IFloodlightService>>();
245 l.add(IFloodlightProviderService.class);
246 l.add(IDeviceService.class);
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700247 l.add(IThreadPoolService.class);
Pankaj Berdeda809572013-02-22 15:31:20 -0800248 return l;
249 }
250
251 @Override
252 public void init(FloodlightModuleContext context)
253 throws FloodlightModuleException {
254 // TODO Auto-generated method stub
255 Map<String, String> configMap = context.getConfigParams(this);
256 String conf = configMap.get(DBConfigFile);
yoshi2fd4c7e2013-11-22 15:47:55 -0800257 String dbStore = configMap.get(GraphDBStore);
258 op = GraphDBManager.getDBOperation(dbStore, conf);
Pankaj Berdeda809572013-02-22 15:31:20 -0800259
HIGUCHI Yuta155cfc52013-06-14 15:54:16 -0700260 log = LoggerFactory.getLogger(NetworkGraphPublisher.class);
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700261 floodlightProvider =
262 context.getServiceImpl(IFloodlightProviderService.class);
Pankaj Berdeda809572013-02-22 15:31:20 -0800263 deviceService = context.getServiceImpl(IDeviceService.class);
Pankaj Berde00e90882013-06-10 21:25:05 -0700264 linkDiscovery = context.getServiceImpl(ILinkDiscoveryService.class);
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700265 threadPool = context.getServiceImpl(IThreadPoolService.class);
266 registryService = context.getServiceImpl(IControllerRegistryService.class);
Pankaj Berdeda809572013-02-22 15:31:20 -0800267
Pankaj Berdeda809572013-02-22 15:31:20 -0800268 devStore = new DeviceStorageImpl();
yoshi2fd4c7e2013-11-22 15:47:55 -0800269 devStore.init(dbStore, conf);
Pankaj Berdeda809572013-02-22 15:31:20 -0800270
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700271 swStore = new SwitchStorageImpl();
yoshi2fd4c7e2013-11-22 15:47:55 -0800272 swStore.init(dbStore, conf);
Pankaj Berde00e90882013-06-10 21:25:05 -0700273
274 linkStore = new LinkStorageImpl();
yoshi2fd4c7e2013-11-22 15:47:55 -0800275 linkStore.init(dbStore, conf);
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700276
HIGUCHI Yuta155cfc52013-06-14 15:54:16 -0700277 log.debug("Initializing NetworkGraphPublisher module with {}", conf);
Pankaj Berdeda809572013-02-22 15:31:20 -0800278
279 }
280
281 @Override
282 public void startUp(FloodlightModuleContext context) {
283 // TODO Auto-generated method stub
Pankaj Berde1e3e5ba2013-03-15 13:17:53 -0700284 Map<String, String> configMap = context.getConfigParams(this);
285 String cleanupNeeded = configMap.get(CleanupEnabled);
286
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700287 deviceService.addListener(this);
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700288 floodlightProvider.addOFSwitchListener(this);
Pankaj Berde00e90882013-06-10 21:25:05 -0700289 linkDiscovery.addListener(this);
Pankaj Berde9d6b5072013-04-03 11:51:23 -0700290
291 log.debug("Adding EventListener");
Toshio Koide70ba38b2013-06-13 14:05:05 -0700292 IDBConnection conn = op.getDBConnection();
yoshi2fd4c7e2013-11-22 15:47:55 -0800293 conn.addEventListener(new LocalTopologyEventListener((DBConnection) conn));
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700294 // Setup the Cleanup task.
Pankaj Berde99fcee12013-03-18 09:41:53 -0700295 if (cleanupNeeded == null || !cleanupNeeded.equals("False")) {
Pankaj Berde1e3e5ba2013-03-15 13:17:53 -0700296 ScheduledExecutorService ses = threadPool.getScheduledExecutor();
297 cleanupTask = new SingletonTask(ses, new SwitchCleanup());
Pankaj Berde99fcee12013-03-18 09:41:53 -0700298 cleanupTask.reschedule(CLEANUP_TASK_INTERVAL, TimeUnit.SECONDS);
Pankaj Berde1e3e5ba2013-03-15 13:17:53 -0700299 }
Pankaj Berdeda809572013-02-22 15:31:20 -0800300 }
301
302}