blob: e8cf82c5bcf3c712c8dc321d2f8c22c4d6d2ce61 [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;
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;
25import net.floodlightcontroller.devicemanager.IDeviceStorage;
26import net.floodlightcontroller.devicemanager.internal.DeviceStorageImpl;
27import net.floodlightcontroller.linkdiscovery.ILinkDiscoveryListener;
Pankaj Berde00e90882013-06-10 21:25:05 -070028import net.floodlightcontroller.linkdiscovery.ILinkDiscoveryService;
29import net.floodlightcontroller.linkdiscovery.ILinkStorage;
30import net.floodlightcontroller.linkdiscovery.internal.LinkStorageImpl;
31import net.floodlightcontroller.routing.Link;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070032import net.floodlightcontroller.threadpool.IThreadPoolService;
HIGUCHI Yuta20514902013-06-12 11:24:16 -070033import net.onrc.onos.ofcontroller.core.ISwitchStorage;
34import net.onrc.onos.ofcontroller.core.INetMapStorage.DM_OPERATION;
35import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IPortObject;
36import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
37import net.onrc.onos.ofcontroller.core.ISwitchStorage.SwitchState;
HIGUCHI Yutaed49ef72013-06-12 11:34:10 -070038import net.onrc.onos.ofcontroller.core.internal.SwitchStorageImpl;
39import net.onrc.onos.ofcontroller.core.internal.TopoSwitchServiceImpl;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070040import 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;
44import net.onrc.onos.util.LocalTopologyEventListener;
Pankaj Berdeda809572013-02-22 15:31:20 -080045
46public class OnosPublisher implements IDeviceListener, IOFSwitchListener,
47 ILinkDiscoveryListener, IFloodlightModule {
48
49 protected IDeviceStorage devStore;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070050 protected ISwitchStorage swStore;
Pankaj Berde00e90882013-06-10 21:25:05 -070051 protected ILinkStorage linkStore;
Pankaj Berdeda809572013-02-22 15:31:20 -080052 protected static Logger log;
53 protected IDeviceService deviceService;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070054 protected IControllerRegistryService registryService;
Pankaj Berde9d6b5072013-04-03 11:51:23 -070055 protected GraphDBConnection conn;
Pankaj Berdeda809572013-02-22 15:31:20 -080056
57 protected static final String DBConfigFile = "dbconf";
Pankaj Berde1e3e5ba2013-03-15 13:17:53 -070058 protected static final String CleanupEnabled = "EnableCleanup";
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070059 protected IThreadPoolService threadPool;
Pankaj Berde465ac7c2013-05-23 13:47:49 -070060 protected IFloodlightProviderService floodlightProvider;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070061
Pankaj Berde62016142013-04-09 15:35:50 -070062 protected final int CLEANUP_TASK_INTERVAL = 60; // 1 min
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070063 protected SingletonTask cleanupTask;
Pankaj Berde00e90882013-06-10 21:25:05 -070064 protected ILinkDiscoveryService linkDiscovery;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070065
66 /**
67 * Cleanup and synch switch state from registry
68 */
69 protected class SwitchCleanup implements ControlChangeCallback, Runnable {
70 @Override
71 public void run() {
72 try {
73 log.debug("Running cleanup thread");
74 switchCleanup();
75 }
76 catch (Exception e) {
77 log.error("Error in cleanup thread", e);
78 } finally {
Pankaj Berdea2e14a92013-04-15 11:59:15 -070079 conn.close();
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070080 cleanupTask.reschedule(CLEANUP_TASK_INTERVAL,
Pankaj Berde99fcee12013-03-18 09:41:53 -070081 TimeUnit.SECONDS);
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070082 }
83 }
84
85 @Override
86 public void controlChanged(long dpid, boolean hasControl) {
87 // TODO Auto-generated method stub
88
89 if (hasControl) {
Pankaj Berde99fcee12013-03-18 09:41:53 -070090 log.debug("got control to set inactive sw {}", HexString.toHexString(dpid));
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070091 swStore.update(HexString.toHexString(dpid),SwitchState.INACTIVE, DM_OPERATION.UPDATE);
92 registryService.releaseControl(dpid);
93 }
94 }
95 }
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070096
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070097 protected void switchCleanup() {
Pankaj Berdea2e14a92013-04-15 11:59:15 -070098 conn.close();
99 Iterable<ISwitchObject> switches = conn.utils().getActiveSwitches(conn);
Jonathan Hartf02a0932013-03-18 18:30:48 -0700100
101 log.debug("Checking for inactive switches");
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700102 // For each switch check if a controller exists in controller registry
103 for (ISwitchObject sw: switches) {
Jonathan Hartf02a0932013-03-18 18:30:48 -0700104 //log.debug("checking if switch is inactive: {}", sw.getDPID());
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700105 try {
106 long dpid = HexString.toLong(sw.getDPID());
107 String controller = registryService.getControllerForSwitch(dpid);
108 if (controller == null) {
Pankaj Berde99fcee12013-03-18 09:41:53 -0700109 log.debug("request Control to set inactive sw {}", HexString.toHexString(dpid));
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700110 registryService.requestControl(dpid, new SwitchCleanup());
Umesh Krishnaswamy255b9882013-04-02 19:55:43 -0700111 //} else {
112 // log.debug("sw {} is controlled by controller: {}",HexString.toHexString(dpid),controller);
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700113 }
114 } catch (NumberFormatException e) {
115 // TODO Auto-generated catch block
116 e.printStackTrace();
117 } catch (RegistryException e) {
Jonathan Hart4baf3be2013-03-21 18:26:13 -0700118 log.debug("Caught RegistryException trying to requestControl in cleanup thread");
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700119 e.printStackTrace();
120 }
121 }
Pankaj Berdea2e14a92013-04-15 11:59:15 -0700122 conn.close();
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700123 }
Pankaj Berdeda809572013-02-22 15:31:20 -0800124
125 @Override
126 public void linkDiscoveryUpdate(LDUpdate update) {
127 // TODO Auto-generated method stub
Pankaj Berde00e90882013-06-10 21:25:05 -0700128 Link lt = new Link(update.getSrc(),update.getSrcPort(),update.getDst(),update.getDstPort());
129 log.debug("{}:LinkDicoveryUpdate(): Updating Link {}",this.getClass(), lt);
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700130 switch (update.getOperation()) {
131
132 case LINK_REMOVED:
Pankaj Berde00e90882013-06-10 21:25:05 -0700133 linkStore.update(lt, DM_OPERATION.DELETE);
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700134 // TODO: Move network map link removal here
135 // reconcile paths here
136// IPortObject srcPort = conn.utils().searchPort(conn, HexString.toHexString(update.getSrc()), update.getSrcPort());
137 break;
Pankaj Berde00e90882013-06-10 21:25:05 -0700138 case LINK_UPDATED:
139 linkStore.update(lt, DM_OPERATION.UPDATE);
140 break;
141 case LINK_ADDED:
142 linkStore.update(lt, DM_OPERATION.INSERT);
143 break;
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700144
145 default:
146 break;
147 }
Pankaj Berdeda809572013-02-22 15:31:20 -0800148
149 }
150
151 @Override
152 public void addedSwitch(IOFSwitch sw) {
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700153
154 if (registryService.hasControl(sw.getId())) {
155 swStore.update(sw.getStringId(), SwitchState.ACTIVE, DM_OPERATION.UPDATE);
156 for (OFPhysicalPort port: sw.getPorts()) {
157 swStore.addPort(sw.getStringId(), port);
158 }
159 }
Pankaj Berdeda809572013-02-22 15:31:20 -0800160
161 }
162
163 @Override
164 public void removedSwitch(IOFSwitch sw) {
165 // TODO Auto-generated method stub
166
167 }
168
169 @Override
170 public void switchPortChanged(Long switchId) {
171 // TODO Auto-generated method stub
172
173 }
174
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700175
176 @Override
177 public void switchPortAdded(Long switchId, OFPhysicalPort port) {
178 // TODO Auto-generated method stub
179 swStore.addPort(HexString.toHexString(switchId), port);
180 }
181
182 @Override
183 public void switchPortRemoved(Long switchId, OFPhysicalPort port) {
184 // TODO Auto-generated method stub
185 swStore.deletePort(HexString.toHexString(switchId), port.getPortNumber());
186 }
187
Pankaj Berdeda809572013-02-22 15:31:20 -0800188 @Override
189 public String getName() {
190 return "OnosPublisher";
191 }
192
193 @Override
194 public void deviceAdded(IDevice device) {
195 // TODO Auto-generated method stub
196 log.debug("{}:deviceAdded(): Adding device {}",this.getClass(),device.getMACAddressString());
197 devStore.addDevice(device);
198 }
199
200 @Override
201 public void deviceRemoved(IDevice device) {
202 // TODO Auto-generated method stub
203
204 }
205
206 @Override
207 public void deviceMoved(IDevice device) {
208 // TODO Auto-generated method stub
209 devStore.changeDeviceAttachments(device);
210
211 }
212
213 @Override
214 public void deviceIPV4AddrChanged(IDevice device) {
215 // TODO Auto-generated method stub
216 devStore.changeDeviceIPv4Address(device);
217
218 }
219
220 @Override
221 public void deviceVlanChanged(IDevice device) {
222 // TODO Auto-generated method stub
223 }
224
225
226 @Override
227 public Collection<Class<? extends IFloodlightService>> getModuleServices() {
228 // TODO Auto-generated method stub
229 return null;
230 }
231
232 @Override
233 public Map<Class<? extends IFloodlightService>, IFloodlightService> getServiceImpls() {
234 // TODO Auto-generated method stub
235 return null;
236 }
237
238 @Override
239 public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
240 Collection<Class<? extends IFloodlightService>> l =
241 new ArrayList<Class<? extends IFloodlightService>>();
242 l.add(IFloodlightProviderService.class);
243 l.add(IDeviceService.class);
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700244 l.add(IThreadPoolService.class);
Pankaj Berdeda809572013-02-22 15:31:20 -0800245 return l;
246 }
247
248 @Override
249 public void init(FloodlightModuleContext context)
250 throws FloodlightModuleException {
251 // TODO Auto-generated method stub
252 Map<String, String> configMap = context.getConfigParams(this);
253 String conf = configMap.get(DBConfigFile);
Pankaj Berde9d6b5072013-04-03 11:51:23 -0700254 conn = GraphDBConnection.getInstance(conf);
Pankaj Berdeda809572013-02-22 15:31:20 -0800255
256 log = LoggerFactory.getLogger(OnosPublisher.class);
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700257 floodlightProvider =
258 context.getServiceImpl(IFloodlightProviderService.class);
Pankaj Berdeda809572013-02-22 15:31:20 -0800259 deviceService = context.getServiceImpl(IDeviceService.class);
Pankaj Berde00e90882013-06-10 21:25:05 -0700260 linkDiscovery = context.getServiceImpl(ILinkDiscoveryService.class);
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700261 threadPool = context.getServiceImpl(IThreadPoolService.class);
262 registryService = context.getServiceImpl(IControllerRegistryService.class);
Pankaj Berdeda809572013-02-22 15:31:20 -0800263
Pankaj Berdeda809572013-02-22 15:31:20 -0800264 devStore = new DeviceStorageImpl();
265 devStore.init(conf);
266
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700267 swStore = new SwitchStorageImpl();
268 swStore.init(conf);
Pankaj Berde00e90882013-06-10 21:25:05 -0700269
270 linkStore = new LinkStorageImpl();
271 linkStore.init(conf);
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700272
Pankaj Berdeda809572013-02-22 15:31:20 -0800273 log.debug("Initializing OnosPublisher module with {}", conf);
274
275 }
276
277 @Override
278 public void startUp(FloodlightModuleContext context) {
279 // TODO Auto-generated method stub
Pankaj Berde1e3e5ba2013-03-15 13:17:53 -0700280 Map<String, String> configMap = context.getConfigParams(this);
281 String cleanupNeeded = configMap.get(CleanupEnabled);
282
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700283 deviceService.addListener(this);
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700284 floodlightProvider.addOFSwitchListener(this);
Pankaj Berde00e90882013-06-10 21:25:05 -0700285 linkDiscovery.addListener(this);
Pankaj Berde9d6b5072013-04-03 11:51:23 -0700286
287 log.debug("Adding EventListener");
288 conn.addEventListener(new LocalTopologyEventListener(conn));
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700289 // Setup the Cleanup task.
Pankaj Berde99fcee12013-03-18 09:41:53 -0700290 if (cleanupNeeded == null || !cleanupNeeded.equals("False")) {
Pankaj Berde1e3e5ba2013-03-15 13:17:53 -0700291 ScheduledExecutorService ses = threadPool.getScheduledExecutor();
292 cleanupTask = new SingletonTask(ses, new SwitchCleanup());
Pankaj Berde99fcee12013-03-18 09:41:53 -0700293 cleanupTask.reschedule(CLEANUP_TASK_INTERVAL, TimeUnit.SECONDS);
Pankaj Berde1e3e5ba2013-03-15 13:17:53 -0700294 }
Pankaj Berdeda809572013-02-22 15:31:20 -0800295 }
296
297}