blob: 2346d5a1a9d8b44a18c35edb19b5bcfc5eb8ca37 [file] [log] [blame]
Pankaj Berdeda809572013-02-22 15:31:20 -08001package net.floodlightcontroller.onoslistener;
2
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;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070015import net.floodlightcontroller.core.INetMapStorage.DM_OPERATION;
Pankaj Berde465ac7c2013-05-23 13:47:49 -070016import net.floodlightcontroller.core.INetMapTopologyObjects.IPortObject;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070017import net.floodlightcontroller.core.INetMapTopologyObjects.ISwitchObject;
18import net.floodlightcontroller.core.ISwitchStorage.SwitchState;
Pankaj Berdeda809572013-02-22 15:31:20 -080019import net.floodlightcontroller.core.IOFSwitch;
20import net.floodlightcontroller.core.IOFSwitchListener;
21import net.floodlightcontroller.core.ISwitchStorage;
22import net.floodlightcontroller.core.internal.SwitchStorageImpl;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070023import net.floodlightcontroller.core.internal.TopoSwitchServiceImpl;
Pankaj Berdeda809572013-02-22 15:31:20 -080024import net.floodlightcontroller.core.module.FloodlightModuleContext;
25import net.floodlightcontroller.core.module.FloodlightModuleException;
26import net.floodlightcontroller.core.module.IFloodlightModule;
27import net.floodlightcontroller.core.module.IFloodlightService;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070028import net.floodlightcontroller.core.util.SingletonTask;
Pankaj Berdeda809572013-02-22 15:31:20 -080029import net.floodlightcontroller.devicemanager.IDevice;
30import net.floodlightcontroller.devicemanager.IDeviceListener;
31import net.floodlightcontroller.devicemanager.IDeviceService;
32import net.floodlightcontroller.devicemanager.IDeviceStorage;
33import net.floodlightcontroller.devicemanager.internal.DeviceStorageImpl;
34import net.floodlightcontroller.linkdiscovery.ILinkDiscoveryListener;
Pankaj Berde00e90882013-06-10 21:25:05 -070035import net.floodlightcontroller.linkdiscovery.ILinkDiscoveryService;
36import net.floodlightcontroller.linkdiscovery.ILinkStorage;
37import net.floodlightcontroller.linkdiscovery.internal.LinkStorageImpl;
38import net.floodlightcontroller.routing.Link;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070039import net.floodlightcontroller.threadpool.IThreadPoolService;
40import net.onrc.onos.registry.controller.IControllerRegistryService;
41import net.onrc.onos.registry.controller.IControllerRegistryService.ControlChangeCallback;
42import net.onrc.onos.registry.controller.RegistryException;
Pankaj Berde9d6b5072013-04-03 11:51:23 -070043import net.onrc.onos.util.GraphDBConnection;
Toshio Koide70ba38b2013-06-13 14:05:05 -070044import net.onrc.onos.util.GraphDBOperation;
45import net.onrc.onos.util.IDBConnection;
Pankaj Berde9d6b5072013-04-03 11:51:23 -070046import net.onrc.onos.util.LocalTopologyEventListener;
Pankaj Berdeda809572013-02-22 15:31:20 -080047
48public class OnosPublisher implements IDeviceListener, IOFSwitchListener,
49 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;
Toshio Koide70ba38b2013-06-13 14:05:05 -070057 protected GraphDBOperation op;
Pankaj Berdeda809572013-02-22 15:31:20 -080058
59 protected static final String DBConfigFile = "dbconf";
Pankaj Berde1e3e5ba2013-03-15 13:17:53 -070060 protected static final String CleanupEnabled = "EnableCleanup";
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070061 protected IThreadPoolService threadPool;
Pankaj Berde465ac7c2013-05-23 13:47:49 -070062 protected IFloodlightProviderService floodlightProvider;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070063
Pankaj Berde62016142013-04-09 15:35:50 -070064 protected final int CLEANUP_TASK_INTERVAL = 60; // 1 min
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070065 protected SingletonTask cleanupTask;
Pankaj Berde00e90882013-06-10 21:25:05 -070066 protected ILinkDiscoveryService linkDiscovery;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070067
68 /**
69 * Cleanup and synch switch state from registry
70 */
71 protected class SwitchCleanup implements ControlChangeCallback, Runnable {
72 @Override
73 public void run() {
74 try {
75 log.debug("Running cleanup thread");
76 switchCleanup();
77 }
78 catch (Exception e) {
79 log.error("Error in cleanup thread", e);
80 } finally {
Toshio Koide70ba38b2013-06-13 14:05:05 -070081 op.close();
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070082 cleanupTask.reschedule(CLEANUP_TASK_INTERVAL,
Pankaj Berde99fcee12013-03-18 09:41:53 -070083 TimeUnit.SECONDS);
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070084 }
85 }
86
87 @Override
88 public void controlChanged(long dpid, boolean hasControl) {
89 // TODO Auto-generated method stub
90
91 if (hasControl) {
Pankaj Berde99fcee12013-03-18 09:41:53 -070092 log.debug("got control to set inactive sw {}", HexString.toHexString(dpid));
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070093 swStore.update(HexString.toHexString(dpid),SwitchState.INACTIVE, DM_OPERATION.UPDATE);
94 registryService.releaseControl(dpid);
95 }
96 }
97 }
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070098
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070099 protected void switchCleanup() {
Toshio Koide70ba38b2013-06-13 14:05:05 -0700100 op.close();
101 Iterable<ISwitchObject> switches = op.getActiveSwitches();
Jonathan Hartf02a0932013-03-18 18:30:48 -0700102
103 log.debug("Checking for inactive switches");
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700104 // For each switch check if a controller exists in controller registry
105 for (ISwitchObject sw: switches) {
Jonathan Hartf02a0932013-03-18 18:30:48 -0700106 //log.debug("checking if switch is inactive: {}", sw.getDPID());
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700107 try {
108 long dpid = HexString.toLong(sw.getDPID());
109 String controller = registryService.getControllerForSwitch(dpid);
110 if (controller == null) {
Pankaj Berde99fcee12013-03-18 09:41:53 -0700111 log.debug("request Control to set inactive sw {}", HexString.toHexString(dpid));
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700112 registryService.requestControl(dpid, new SwitchCleanup());
Umesh Krishnaswamy255b9882013-04-02 19:55:43 -0700113 //} else {
114 // log.debug("sw {} is controlled by controller: {}",HexString.toHexString(dpid),controller);
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700115 }
116 } catch (NumberFormatException e) {
117 // TODO Auto-generated catch block
118 e.printStackTrace();
119 } catch (RegistryException e) {
Jonathan Hart4baf3be2013-03-21 18:26:13 -0700120 log.debug("Caught RegistryException trying to requestControl in cleanup thread");
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700121 e.printStackTrace();
122 }
123 }
Toshio Koide70ba38b2013-06-13 14:05:05 -0700124 op.close();
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700125 }
Pankaj Berdeda809572013-02-22 15:31:20 -0800126
127 @Override
128 public void linkDiscoveryUpdate(LDUpdate update) {
129 // TODO Auto-generated method stub
Pankaj Berde00e90882013-06-10 21:25:05 -0700130 Link lt = new Link(update.getSrc(),update.getSrcPort(),update.getDst(),update.getDstPort());
131 log.debug("{}:LinkDicoveryUpdate(): Updating Link {}",this.getClass(), lt);
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700132 switch (update.getOperation()) {
133
134 case LINK_REMOVED:
Pankaj Berde00e90882013-06-10 21:25:05 -0700135 linkStore.update(lt, DM_OPERATION.DELETE);
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700136 // TODO: Move network map link removal here
137 // reconcile paths here
138// IPortObject srcPort = conn.utils().searchPort(conn, HexString.toHexString(update.getSrc()), update.getSrcPort());
139 break;
Pankaj Berde00e90882013-06-10 21:25:05 -0700140 case LINK_UPDATED:
141 linkStore.update(lt, DM_OPERATION.UPDATE);
142 break;
143 case LINK_ADDED:
144 linkStore.update(lt, DM_OPERATION.INSERT);
145 break;
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700146
147 default:
148 break;
149 }
Pankaj Berdeda809572013-02-22 15:31:20 -0800150
151 }
152
153 @Override
154 public void addedSwitch(IOFSwitch sw) {
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700155
156 if (registryService.hasControl(sw.getId())) {
157 swStore.update(sw.getStringId(), SwitchState.ACTIVE, DM_OPERATION.UPDATE);
158 for (OFPhysicalPort port: sw.getPorts()) {
159 swStore.addPort(sw.getStringId(), port);
160 }
161 }
Pankaj Berdeda809572013-02-22 15:31:20 -0800162
163 }
164
165 @Override
166 public void removedSwitch(IOFSwitch sw) {
167 // TODO Auto-generated method stub
168
169 }
170
171 @Override
172 public void switchPortChanged(Long switchId) {
173 // TODO Auto-generated method stub
174
175 }
176
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700177
178 @Override
179 public void switchPortAdded(Long switchId, OFPhysicalPort port) {
180 // TODO Auto-generated method stub
181 swStore.addPort(HexString.toHexString(switchId), port);
182 }
183
184 @Override
185 public void switchPortRemoved(Long switchId, OFPhysicalPort port) {
186 // TODO Auto-generated method stub
187 swStore.deletePort(HexString.toHexString(switchId), port.getPortNumber());
188 }
189
Pankaj Berdeda809572013-02-22 15:31:20 -0800190 @Override
191 public String getName() {
192 return "OnosPublisher";
193 }
194
195 @Override
196 public void deviceAdded(IDevice device) {
197 // TODO Auto-generated method stub
198 log.debug("{}:deviceAdded(): Adding device {}",this.getClass(),device.getMACAddressString());
199 devStore.addDevice(device);
200 }
201
202 @Override
203 public void deviceRemoved(IDevice device) {
204 // TODO Auto-generated method stub
205
206 }
207
208 @Override
209 public void deviceMoved(IDevice device) {
210 // TODO Auto-generated method stub
211 devStore.changeDeviceAttachments(device);
212
213 }
214
215 @Override
216 public void deviceIPV4AddrChanged(IDevice device) {
217 // TODO Auto-generated method stub
218 devStore.changeDeviceIPv4Address(device);
219
220 }
221
222 @Override
223 public void deviceVlanChanged(IDevice device) {
224 // TODO Auto-generated method stub
225 }
226
227
228 @Override
229 public Collection<Class<? extends IFloodlightService>> getModuleServices() {
230 // TODO Auto-generated method stub
231 return null;
232 }
233
234 @Override
235 public Map<Class<? extends IFloodlightService>, IFloodlightService> getServiceImpls() {
236 // TODO Auto-generated method stub
237 return null;
238 }
239
240 @Override
241 public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
242 Collection<Class<? extends IFloodlightService>> l =
243 new ArrayList<Class<? extends IFloodlightService>>();
244 l.add(IFloodlightProviderService.class);
245 l.add(IDeviceService.class);
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700246 l.add(IThreadPoolService.class);
Pankaj Berdeda809572013-02-22 15:31:20 -0800247 return l;
248 }
249
250 @Override
251 public void init(FloodlightModuleContext context)
252 throws FloodlightModuleException {
253 // TODO Auto-generated method stub
254 Map<String, String> configMap = context.getConfigParams(this);
255 String conf = configMap.get(DBConfigFile);
Toshio Koide70ba38b2013-06-13 14:05:05 -0700256 op = new GraphDBOperation(GraphDBConnection.getInstance(conf));
Pankaj Berdeda809572013-02-22 15:31:20 -0800257
258 log = LoggerFactory.getLogger(OnosPublisher.class);
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700259 floodlightProvider =
260 context.getServiceImpl(IFloodlightProviderService.class);
Pankaj Berdeda809572013-02-22 15:31:20 -0800261 deviceService = context.getServiceImpl(IDeviceService.class);
Pankaj Berde00e90882013-06-10 21:25:05 -0700262 linkDiscovery = context.getServiceImpl(ILinkDiscoveryService.class);
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700263 threadPool = context.getServiceImpl(IThreadPoolService.class);
264 registryService = context.getServiceImpl(IControllerRegistryService.class);
Pankaj Berdeda809572013-02-22 15:31:20 -0800265
Pankaj Berdeda809572013-02-22 15:31:20 -0800266 devStore = new DeviceStorageImpl();
267 devStore.init(conf);
268
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700269 swStore = new SwitchStorageImpl();
270 swStore.init(conf);
Pankaj Berde00e90882013-06-10 21:25:05 -0700271
272 linkStore = new LinkStorageImpl();
273 linkStore.init(conf);
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700274
Pankaj Berdeda809572013-02-22 15:31:20 -0800275 log.debug("Initializing OnosPublisher module with {}", conf);
276
277 }
278
279 @Override
280 public void startUp(FloodlightModuleContext context) {
281 // TODO Auto-generated method stub
Pankaj Berde1e3e5ba2013-03-15 13:17:53 -0700282 Map<String, String> configMap = context.getConfigParams(this);
283 String cleanupNeeded = configMap.get(CleanupEnabled);
284
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700285 deviceService.addListener(this);
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700286 floodlightProvider.addOFSwitchListener(this);
Pankaj Berde00e90882013-06-10 21:25:05 -0700287 linkDiscovery.addListener(this);
Pankaj Berde9d6b5072013-04-03 11:51:23 -0700288
289 log.debug("Adding EventListener");
Toshio Koide70ba38b2013-06-13 14:05:05 -0700290 IDBConnection conn = op.getDBConnection();
291 conn.addEventListener(new LocalTopologyEventListener((GraphDBConnection) conn));
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700292 // Setup the Cleanup task.
Pankaj Berde99fcee12013-03-18 09:41:53 -0700293 if (cleanupNeeded == null || !cleanupNeeded.equals("False")) {
Pankaj Berde1e3e5ba2013-03-15 13:17:53 -0700294 ScheduledExecutorService ses = threadPool.getScheduledExecutor();
295 cleanupTask = new SingletonTask(ses, new SwitchCleanup());
Pankaj Berde99fcee12013-03-18 09:41:53 -0700296 cleanupTask.reschedule(CLEANUP_TASK_INTERVAL, TimeUnit.SECONDS);
Pankaj Berde1e3e5ba2013-03-15 13:17:53 -0700297 }
Pankaj Berdeda809572013-02-22 15:31:20 -0800298 }
299
300}