blob: d35a4f869ceccfeb3ee8531f5119bbd551c13469 [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 Berdef08d5ff2013-03-14 17:03:07 -070035import net.floodlightcontroller.threadpool.IThreadPoolService;
36import net.onrc.onos.registry.controller.IControllerRegistryService;
37import net.onrc.onos.registry.controller.IControllerRegistryService.ControlChangeCallback;
38import net.onrc.onos.registry.controller.RegistryException;
Pankaj Berde9d6b5072013-04-03 11:51:23 -070039import net.onrc.onos.util.GraphDBConnection;
40import net.onrc.onos.util.LocalTopologyEventListener;
Pankaj Berdeda809572013-02-22 15:31:20 -080041
42public class OnosPublisher implements IDeviceListener, IOFSwitchListener,
43 ILinkDiscoveryListener, IFloodlightModule {
44
45 protected IDeviceStorage devStore;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070046 protected ISwitchStorage swStore;
Pankaj Berdeda809572013-02-22 15:31:20 -080047 protected static Logger log;
48 protected IDeviceService deviceService;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070049 protected IControllerRegistryService registryService;
Pankaj Berde9d6b5072013-04-03 11:51:23 -070050 protected GraphDBConnection conn;
Pankaj Berdeda809572013-02-22 15:31:20 -080051
52 protected static final String DBConfigFile = "dbconf";
Pankaj Berde1e3e5ba2013-03-15 13:17:53 -070053 protected static final String CleanupEnabled = "EnableCleanup";
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070054 protected IThreadPoolService threadPool;
Pankaj Berde465ac7c2013-05-23 13:47:49 -070055 protected IFloodlightProviderService floodlightProvider;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070056
Pankaj Berde62016142013-04-09 15:35:50 -070057 protected final int CLEANUP_TASK_INTERVAL = 60; // 1 min
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070058 protected SingletonTask cleanupTask;
59
60 /**
61 * Cleanup and synch switch state from registry
62 */
63 protected class SwitchCleanup implements ControlChangeCallback, Runnable {
64 @Override
65 public void run() {
66 try {
67 log.debug("Running cleanup thread");
68 switchCleanup();
69 }
70 catch (Exception e) {
71 log.error("Error in cleanup thread", e);
72 } finally {
Pankaj Berdea2e14a92013-04-15 11:59:15 -070073 conn.close();
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070074 cleanupTask.reschedule(CLEANUP_TASK_INTERVAL,
Pankaj Berde99fcee12013-03-18 09:41:53 -070075 TimeUnit.SECONDS);
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070076 }
77 }
78
79 @Override
80 public void controlChanged(long dpid, boolean hasControl) {
81 // TODO Auto-generated method stub
82
83 if (hasControl) {
Pankaj Berde99fcee12013-03-18 09:41:53 -070084 log.debug("got control to set inactive sw {}", HexString.toHexString(dpid));
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070085 swStore.update(HexString.toHexString(dpid),SwitchState.INACTIVE, DM_OPERATION.UPDATE);
86 registryService.releaseControl(dpid);
87 }
88 }
89 }
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070090
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070091 protected void switchCleanup() {
Pankaj Berdea2e14a92013-04-15 11:59:15 -070092 conn.close();
93 Iterable<ISwitchObject> switches = conn.utils().getActiveSwitches(conn);
Jonathan Hartf02a0932013-03-18 18:30:48 -070094
95 log.debug("Checking for inactive switches");
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070096 // For each switch check if a controller exists in controller registry
97 for (ISwitchObject sw: switches) {
Jonathan Hartf02a0932013-03-18 18:30:48 -070098 //log.debug("checking if switch is inactive: {}", sw.getDPID());
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070099 try {
100 long dpid = HexString.toLong(sw.getDPID());
101 String controller = registryService.getControllerForSwitch(dpid);
102 if (controller == null) {
Pankaj Berde99fcee12013-03-18 09:41:53 -0700103 log.debug("request Control to set inactive sw {}", HexString.toHexString(dpid));
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700104 registryService.requestControl(dpid, new SwitchCleanup());
Umesh Krishnaswamy255b9882013-04-02 19:55:43 -0700105 //} else {
106 // log.debug("sw {} is controlled by controller: {}",HexString.toHexString(dpid),controller);
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700107 }
108 } catch (NumberFormatException e) {
109 // TODO Auto-generated catch block
110 e.printStackTrace();
111 } catch (RegistryException e) {
Jonathan Hart4baf3be2013-03-21 18:26:13 -0700112 log.debug("Caught RegistryException trying to requestControl in cleanup thread");
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700113 e.printStackTrace();
114 }
115 }
Pankaj Berdea2e14a92013-04-15 11:59:15 -0700116 conn.close();
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700117 }
Pankaj Berdeda809572013-02-22 15:31:20 -0800118
119 @Override
120 public void linkDiscoveryUpdate(LDUpdate update) {
121 // TODO Auto-generated method stub
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700122 switch (update.getOperation()) {
123
124 case LINK_REMOVED:
125 // TODO: Move network map link removal here
126 // reconcile paths here
127// IPortObject srcPort = conn.utils().searchPort(conn, HexString.toHexString(update.getSrc()), update.getSrcPort());
128 break;
129
130 default:
131 break;
132 }
Pankaj Berdeda809572013-02-22 15:31:20 -0800133
134 }
135
136 @Override
137 public void addedSwitch(IOFSwitch sw) {
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700138
139 if (registryService.hasControl(sw.getId())) {
140 swStore.update(sw.getStringId(), SwitchState.ACTIVE, DM_OPERATION.UPDATE);
141 for (OFPhysicalPort port: sw.getPorts()) {
142 swStore.addPort(sw.getStringId(), port);
143 }
144 }
Pankaj Berdeda809572013-02-22 15:31:20 -0800145
146 }
147
148 @Override
149 public void removedSwitch(IOFSwitch sw) {
150 // TODO Auto-generated method stub
151
152 }
153
154 @Override
155 public void switchPortChanged(Long switchId) {
156 // TODO Auto-generated method stub
157
158 }
159
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700160
161 @Override
162 public void switchPortAdded(Long switchId, OFPhysicalPort port) {
163 // TODO Auto-generated method stub
164 swStore.addPort(HexString.toHexString(switchId), port);
165 }
166
167 @Override
168 public void switchPortRemoved(Long switchId, OFPhysicalPort port) {
169 // TODO Auto-generated method stub
170 swStore.deletePort(HexString.toHexString(switchId), port.getPortNumber());
171 }
172
Pankaj Berdeda809572013-02-22 15:31:20 -0800173 @Override
174 public String getName() {
175 return "OnosPublisher";
176 }
177
178 @Override
179 public void deviceAdded(IDevice device) {
180 // TODO Auto-generated method stub
181 log.debug("{}:deviceAdded(): Adding device {}",this.getClass(),device.getMACAddressString());
182 devStore.addDevice(device);
183 }
184
185 @Override
186 public void deviceRemoved(IDevice device) {
187 // TODO Auto-generated method stub
188
189 }
190
191 @Override
192 public void deviceMoved(IDevice device) {
193 // TODO Auto-generated method stub
194 devStore.changeDeviceAttachments(device);
195
196 }
197
198 @Override
199 public void deviceIPV4AddrChanged(IDevice device) {
200 // TODO Auto-generated method stub
201 devStore.changeDeviceIPv4Address(device);
202
203 }
204
205 @Override
206 public void deviceVlanChanged(IDevice device) {
207 // TODO Auto-generated method stub
208 }
209
210
211 @Override
212 public Collection<Class<? extends IFloodlightService>> getModuleServices() {
213 // TODO Auto-generated method stub
214 return null;
215 }
216
217 @Override
218 public Map<Class<? extends IFloodlightService>, IFloodlightService> getServiceImpls() {
219 // TODO Auto-generated method stub
220 return null;
221 }
222
223 @Override
224 public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
225 Collection<Class<? extends IFloodlightService>> l =
226 new ArrayList<Class<? extends IFloodlightService>>();
227 l.add(IFloodlightProviderService.class);
228 l.add(IDeviceService.class);
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700229 l.add(IThreadPoolService.class);
Pankaj Berdeda809572013-02-22 15:31:20 -0800230 return l;
231 }
232
233 @Override
234 public void init(FloodlightModuleContext context)
235 throws FloodlightModuleException {
236 // TODO Auto-generated method stub
237 Map<String, String> configMap = context.getConfigParams(this);
238 String conf = configMap.get(DBConfigFile);
Pankaj Berde9d6b5072013-04-03 11:51:23 -0700239 conn = GraphDBConnection.getInstance(conf);
Pankaj Berdeda809572013-02-22 15:31:20 -0800240
241 log = LoggerFactory.getLogger(OnosPublisher.class);
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700242 floodlightProvider =
243 context.getServiceImpl(IFloodlightProviderService.class);
Pankaj Berdeda809572013-02-22 15:31:20 -0800244 deviceService = context.getServiceImpl(IDeviceService.class);
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700245 threadPool = context.getServiceImpl(IThreadPoolService.class);
246 registryService = context.getServiceImpl(IControllerRegistryService.class);
Pankaj Berdeda809572013-02-22 15:31:20 -0800247
Pankaj Berdeda809572013-02-22 15:31:20 -0800248 devStore = new DeviceStorageImpl();
249 devStore.init(conf);
250
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700251 swStore = new SwitchStorageImpl();
252 swStore.init(conf);
253
Pankaj Berdeda809572013-02-22 15:31:20 -0800254 log.debug("Initializing OnosPublisher module with {}", conf);
255
256 }
257
258 @Override
259 public void startUp(FloodlightModuleContext context) {
260 // TODO Auto-generated method stub
Pankaj Berde1e3e5ba2013-03-15 13:17:53 -0700261 Map<String, String> configMap = context.getConfigParams(this);
262 String cleanupNeeded = configMap.get(CleanupEnabled);
263
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700264 deviceService.addListener(this);
Pankaj Berde465ac7c2013-05-23 13:47:49 -0700265 floodlightProvider.addOFSwitchListener(this);
Pankaj Berde9d6b5072013-04-03 11:51:23 -0700266
267 log.debug("Adding EventListener");
268 conn.addEventListener(new LocalTopologyEventListener(conn));
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700269 // Setup the Cleanup task.
Pankaj Berde99fcee12013-03-18 09:41:53 -0700270 if (cleanupNeeded == null || !cleanupNeeded.equals("False")) {
Pankaj Berde1e3e5ba2013-03-15 13:17:53 -0700271 ScheduledExecutorService ses = threadPool.getScheduledExecutor();
272 cleanupTask = new SingletonTask(ses, new SwitchCleanup());
Pankaj Berde99fcee12013-03-18 09:41:53 -0700273 cleanupTask.reschedule(CLEANUP_TASK_INTERVAL, TimeUnit.SECONDS);
Pankaj Berde1e3e5ba2013-03-15 13:17:53 -0700274 }
Pankaj Berdeda809572013-02-22 15:31:20 -0800275 }
276
277}