blob: bd27344c737e796ae245850d4955d830154f5ea1 [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 Berdeda809572013-02-22 15:31:20 -080025import net.floodlightcontroller.linkdiscovery.ILinkDiscoveryListener;
Pankaj Berde00e90882013-06-10 21:25:05 -070026import net.floodlightcontroller.linkdiscovery.ILinkDiscoveryService;
Pankaj Berde00e90882013-06-10 21:25:05 -070027import net.floodlightcontroller.linkdiscovery.internal.LinkStorageImpl;
28import net.floodlightcontroller.routing.Link;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070029import net.floodlightcontroller.threadpool.IThreadPoolService;
HIGUCHI Yuta36cf0762013-06-14 14:25:38 -070030import net.onrc.onos.ofcontroller.core.IOFSwitchPortListener;
HIGUCHI Yuta20514902013-06-12 11:24:16 -070031import net.onrc.onos.ofcontroller.core.ISwitchStorage;
32import net.onrc.onos.ofcontroller.core.INetMapStorage.DM_OPERATION;
HIGUCHI Yuta20514902013-06-12 11:24:16 -070033import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
34import net.onrc.onos.ofcontroller.core.ISwitchStorage.SwitchState;
HIGUCHI Yutaed49ef72013-06-12 11:34:10 -070035import net.onrc.onos.ofcontroller.core.internal.SwitchStorageImpl;
HIGUCHI Yutad3fa44d2013-06-12 11:53:09 -070036import net.onrc.onos.ofcontroller.devicemanager.IDeviceStorage;
HIGUCHI Yuta351edcb2013-06-12 11:58:13 -070037import net.onrc.onos.ofcontroller.devicemanager.internal.DeviceStorageImpl;
HIGUCHI Yuta80c3ab82013-06-12 13:17:05 -070038import net.onrc.onos.ofcontroller.linkdiscovery.ILinkStorage;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070039import net.onrc.onos.registry.controller.IControllerRegistryService;
40import net.onrc.onos.registry.controller.IControllerRegistryService.ControlChangeCallback;
41import net.onrc.onos.registry.controller.RegistryException;
Pankaj Berde9d6b5072013-04-03 11:51:23 -070042import net.onrc.onos.util.GraphDBConnection;
Toshio Koide70ba38b2013-06-13 14:05:05 -070043import net.onrc.onos.util.GraphDBOperation;
44import net.onrc.onos.util.IDBConnection;
Pankaj Berde9d6b5072013-04-03 11:51:23 -070045import net.onrc.onos.util.LocalTopologyEventListener;
Pankaj Berdeda809572013-02-22 15:31:20 -080046
HIGUCHI Yuta155cfc52013-06-14 15:54:16 -070047public class NetworkGraphPublisher implements IDeviceListener, IOFSwitchListener, IOFSwitchPortListener,
Pankaj Berdeda809572013-02-22 15:31:20 -080048 ILinkDiscoveryListener, IFloodlightModule {
49
50 protected IDeviceStorage devStore;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070051 protected ISwitchStorage swStore;
Pankaj Berde00e90882013-06-10 21:25:05 -070052 protected ILinkStorage linkStore;
Pankaj Berdeda809572013-02-22 15:31:20 -080053 protected static Logger log;
54 protected IDeviceService deviceService;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070055 protected IControllerRegistryService registryService;
Toshio Koide70ba38b2013-06-13 14:05:05 -070056 protected GraphDBOperation op;
Pankaj Berdeda809572013-02-22 15:31:20 -080057
58 protected static final String DBConfigFile = "dbconf";
Pankaj Berde1e3e5ba2013-03-15 13:17:53 -070059 protected static final String CleanupEnabled = "EnableCleanup";
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070060 protected IThreadPoolService threadPool;
Pankaj Berde465ac7c2013-05-23 13:47:49 -070061 protected IFloodlightProviderService floodlightProvider;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070062
Pankaj Berde62016142013-04-09 15:35:50 -070063 protected final int CLEANUP_TASK_INTERVAL = 60; // 1 min
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070064 protected SingletonTask cleanupTask;
Pankaj Berde00e90882013-06-10 21:25:05 -070065 protected ILinkDiscoveryService linkDiscovery;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070066
67 /**
68 * Cleanup and synch switch state from registry
69 */
70 protected class SwitchCleanup implements ControlChangeCallback, Runnable {
71 @Override
72 public void run() {
73 try {
74 log.debug("Running cleanup thread");
75 switchCleanup();
76 }
77 catch (Exception e) {
78 log.error("Error in cleanup thread", e);
79 } finally {
Toshio Koide70ba38b2013-06-13 14:05:05 -070080 op.close();
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070081 cleanupTask.reschedule(CLEANUP_TASK_INTERVAL,
Pankaj Berde99fcee12013-03-18 09:41:53 -070082 TimeUnit.SECONDS);
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070083 }
84 }
85
86 @Override
87 public void controlChanged(long dpid, boolean hasControl) {
88 // TODO Auto-generated method stub
89
90 if (hasControl) {
Pankaj Berde99fcee12013-03-18 09:41:53 -070091 log.debug("got control to set inactive sw {}", HexString.toHexString(dpid));
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070092 swStore.update(HexString.toHexString(dpid),SwitchState.INACTIVE, DM_OPERATION.UPDATE);
93 registryService.releaseControl(dpid);
94 }
95 }
96 }
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070097
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070098 protected void switchCleanup() {
Toshio Koide70ba38b2013-06-13 14:05:05 -070099 op.close();
100 Iterable<ISwitchObject> switches = op.getActiveSwitches();
Jonathan Hartf02a0932013-03-18 18:30:48 -0700101
102 log.debug("Checking for inactive switches");
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700103 // For each switch check if a controller exists in controller registry
104 for (ISwitchObject sw: switches) {
Jonathan Hartf02a0932013-03-18 18:30:48 -0700105 //log.debug("checking if switch is inactive: {}", sw.getDPID());
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700106 try {
107 long dpid = HexString.toLong(sw.getDPID());
108 String controller = registryService.getControllerForSwitch(dpid);
109 if (controller == null) {
Pankaj Berde99fcee12013-03-18 09:41:53 -0700110 log.debug("request Control to set inactive sw {}", HexString.toHexString(dpid));
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700111 registryService.requestControl(dpid, new SwitchCleanup());
Umesh Krishnaswamy255b9882013-04-02 19:55:43 -0700112 //} else {
113 // log.debug("sw {} is controlled by controller: {}",HexString.toHexString(dpid),controller);
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700114 }
115 } catch (NumberFormatException e) {
116 // TODO Auto-generated catch block
117 e.printStackTrace();
118 } catch (RegistryException e) {
Jonathan Hart4baf3be2013-03-21 18:26:13 -0700119 log.debug("Caught RegistryException trying to requestControl in cleanup thread");
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700120 e.printStackTrace();
121 }
122 }
Toshio Koide70ba38b2013-06-13 14:05:05 -0700123 op.close();
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700124 }
Pankaj Berdeda809572013-02-22 15:31:20 -0800125
126 @Override
127 public void linkDiscoveryUpdate(LDUpdate update) {
128 // TODO Auto-generated method stub
Pankaj Berde00e90882013-06-10 21:25:05 -0700129 Link lt = new Link(update.getSrc(),update.getSrcPort(),update.getDst(),update.getDstPort());
130 log.debug("{}:LinkDicoveryUpdate(): Updating Link {}",this.getClass(), lt);
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700131 switch (update.getOperation()) {
132
133 case LINK_REMOVED:
Pankaj Berde00e90882013-06-10 21:25:05 -0700134 linkStore.update(lt, DM_OPERATION.DELETE);
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700135 // TODO: Move network map link removal here
136 // reconcile paths here
137// IPortObject srcPort = conn.utils().searchPort(conn, HexString.toHexString(update.getSrc()), update.getSrcPort());
138 break;
Pankaj Berde00e90882013-06-10 21:25:05 -0700139 case LINK_UPDATED:
140 linkStore.update(lt, DM_OPERATION.UPDATE);
141 break;
142 case LINK_ADDED:
143 linkStore.update(lt, DM_OPERATION.INSERT);
144 break;
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700145
146 default:
147 break;
148 }
Pankaj Berdeda809572013-02-22 15:31:20 -0800149
150 }
151
152 @Override
153 public void addedSwitch(IOFSwitch sw) {
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700154
155 if (registryService.hasControl(sw.getId())) {
156 swStore.update(sw.getStringId(), SwitchState.ACTIVE, DM_OPERATION.UPDATE);
157 for (OFPhysicalPort port: sw.getPorts()) {
158 swStore.addPort(sw.getStringId(), port);
159 }
160 }
Pankaj Berdeda809572013-02-22 15:31:20 -0800161
162 }
163
164 @Override
165 public void removedSwitch(IOFSwitch sw) {
166 // TODO Auto-generated method stub
167
168 }
169
170 @Override
171 public void switchPortChanged(Long switchId) {
172 // TODO Auto-generated method stub
173
174 }
175
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700176
177 @Override
178 public void switchPortAdded(Long switchId, OFPhysicalPort port) {
179 // TODO Auto-generated method stub
180 swStore.addPort(HexString.toHexString(switchId), port);
181 }
182
183 @Override
184 public void switchPortRemoved(Long switchId, OFPhysicalPort port) {
185 // TODO Auto-generated method stub
186 swStore.deletePort(HexString.toHexString(switchId), port.getPortNumber());
187 }
188
Pankaj Berdeda809572013-02-22 15:31:20 -0800189 @Override
190 public String getName() {
HIGUCHI Yuta155cfc52013-06-14 15:54:16 -0700191 return "NetworkGraphPublisher";
Pankaj Berdeda809572013-02-22 15:31:20 -0800192 }
193
194 @Override
195 public void deviceAdded(IDevice device) {
196 // TODO Auto-generated method stub
197 log.debug("{}:deviceAdded(): Adding device {}",this.getClass(),device.getMACAddressString());
198 devStore.addDevice(device);
199 }
200
201 @Override
202 public void deviceRemoved(IDevice device) {
203 // TODO Auto-generated method stub
204
205 }
206
207 @Override
208 public void deviceMoved(IDevice device) {
209 // TODO Auto-generated method stub
210 devStore.changeDeviceAttachments(device);
211
212 }
213
214 @Override
215 public void deviceIPV4AddrChanged(IDevice device) {
216 // TODO Auto-generated method stub
217 devStore.changeDeviceIPv4Address(device);
218
219 }
220
221 @Override
222 public void deviceVlanChanged(IDevice device) {
223 // TODO Auto-generated method stub
224 }
225
226
227 @Override
228 public Collection<Class<? extends IFloodlightService>> getModuleServices() {
229 // TODO Auto-generated method stub
230 return null;
231 }
232
233 @Override
234 public Map<Class<? extends IFloodlightService>, IFloodlightService> getServiceImpls() {
235 // TODO Auto-generated method stub
236 return null;
237 }
238
239 @Override
240 public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
241 Collection<Class<? extends IFloodlightService>> l =
242 new ArrayList<Class<? extends IFloodlightService>>();
243 l.add(IFloodlightProviderService.class);
244 l.add(IDeviceService.class);
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700245 l.add(IThreadPoolService.class);
Pankaj Berdeda809572013-02-22 15:31:20 -0800246 return l;
247 }
248
249 @Override
250 public void init(FloodlightModuleContext context)
251 throws FloodlightModuleException {
252 // TODO Auto-generated method stub
253 Map<String, String> configMap = context.getConfigParams(this);
254 String conf = configMap.get(DBConfigFile);
Toshio Koide70ba38b2013-06-13 14:05:05 -0700255 op = new GraphDBOperation(GraphDBConnection.getInstance(conf));
Pankaj Berdeda809572013-02-22 15:31:20 -0800256
HIGUCHI Yuta155cfc52013-06-14 15:54:16 -0700257 log = LoggerFactory.getLogger(NetworkGraphPublisher.class);
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700258 floodlightProvider =
259 context.getServiceImpl(IFloodlightProviderService.class);
Pankaj Berdeda809572013-02-22 15:31:20 -0800260 deviceService = context.getServiceImpl(IDeviceService.class);
Pankaj Berde00e90882013-06-10 21:25:05 -0700261 linkDiscovery = context.getServiceImpl(ILinkDiscoveryService.class);
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700262 threadPool = context.getServiceImpl(IThreadPoolService.class);
263 registryService = context.getServiceImpl(IControllerRegistryService.class);
Pankaj Berdeda809572013-02-22 15:31:20 -0800264
Pankaj Berdeda809572013-02-22 15:31:20 -0800265 devStore = new DeviceStorageImpl();
266 devStore.init(conf);
267
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700268 swStore = new SwitchStorageImpl();
269 swStore.init(conf);
Pankaj Berde00e90882013-06-10 21:25:05 -0700270
271 linkStore = new LinkStorageImpl();
272 linkStore.init(conf);
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700273
HIGUCHI Yuta155cfc52013-06-14 15:54:16 -0700274 log.debug("Initializing NetworkGraphPublisher module with {}", conf);
Pankaj Berdeda809572013-02-22 15:31:20 -0800275
276 }
277
278 @Override
279 public void startUp(FloodlightModuleContext context) {
280 // TODO Auto-generated method stub
Pankaj Berde1e3e5ba2013-03-15 13:17:53 -0700281 Map<String, String> configMap = context.getConfigParams(this);
282 String cleanupNeeded = configMap.get(CleanupEnabled);
283
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700284 deviceService.addListener(this);
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700285 floodlightProvider.addOFSwitchListener(this);
Pankaj Berde00e90882013-06-10 21:25:05 -0700286 linkDiscovery.addListener(this);
Pankaj Berde9d6b5072013-04-03 11:51:23 -0700287
288 log.debug("Adding EventListener");
Toshio Koide70ba38b2013-06-13 14:05:05 -0700289 IDBConnection conn = op.getDBConnection();
290 conn.addEventListener(new LocalTopologyEventListener((GraphDBConnection) conn));
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700291 // Setup the Cleanup task.
Pankaj Berde99fcee12013-03-18 09:41:53 -0700292 if (cleanupNeeded == null || !cleanupNeeded.equals("False")) {
Pankaj Berde1e3e5ba2013-03-15 13:17:53 -0700293 ScheduledExecutorService ses = threadPool.getScheduledExecutor();
294 cleanupTask = new SingletonTask(ses, new SwitchCleanup());
Pankaj Berde99fcee12013-03-18 09:41:53 -0700295 cleanupTask.reschedule(CLEANUP_TASK_INTERVAL, TimeUnit.SECONDS);
Pankaj Berde1e3e5ba2013-03-15 13:17:53 -0700296 }
Pankaj Berdeda809572013-02-22 15:31:20 -0800297 }
298
299}