blob: 591b70a9139bfce3fea2f771ba9125134ec6f4e6 [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 Berdef08d5ff2013-03-14 17:03:07 -07009import org.openflow.util.HexString;
Pankaj Berdeda809572013-02-22 15:31:20 -080010import org.slf4j.Logger;
11import org.slf4j.LoggerFactory;
12
13import net.floodlightcontroller.core.IFloodlightProviderService;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070014import net.floodlightcontroller.core.INetMapStorage.DM_OPERATION;
15import net.floodlightcontroller.core.INetMapTopologyObjects.ISwitchObject;
16import net.floodlightcontroller.core.ISwitchStorage.SwitchState;
Pankaj Berdeda809572013-02-22 15:31:20 -080017import net.floodlightcontroller.core.IOFSwitch;
18import net.floodlightcontroller.core.IOFSwitchListener;
19import net.floodlightcontroller.core.ISwitchStorage;
20import net.floodlightcontroller.core.internal.SwitchStorageImpl;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070021import net.floodlightcontroller.core.internal.TopoSwitchServiceImpl;
Pankaj Berdeda809572013-02-22 15:31:20 -080022import net.floodlightcontroller.core.module.FloodlightModuleContext;
23import net.floodlightcontroller.core.module.FloodlightModuleException;
24import net.floodlightcontroller.core.module.IFloodlightModule;
25import net.floodlightcontroller.core.module.IFloodlightService;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070026import net.floodlightcontroller.core.util.SingletonTask;
Pankaj Berdeda809572013-02-22 15:31:20 -080027import net.floodlightcontroller.devicemanager.IDevice;
28import net.floodlightcontroller.devicemanager.IDeviceListener;
29import net.floodlightcontroller.devicemanager.IDeviceService;
30import net.floodlightcontroller.devicemanager.IDeviceStorage;
31import net.floodlightcontroller.devicemanager.internal.DeviceStorageImpl;
32import net.floodlightcontroller.linkdiscovery.ILinkDiscoveryListener;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070033import net.floodlightcontroller.threadpool.IThreadPoolService;
34import net.onrc.onos.registry.controller.IControllerRegistryService;
35import net.onrc.onos.registry.controller.IControllerRegistryService.ControlChangeCallback;
36import net.onrc.onos.registry.controller.RegistryException;
Pankaj Berdeda809572013-02-22 15:31:20 -080037
38public class OnosPublisher implements IDeviceListener, IOFSwitchListener,
39 ILinkDiscoveryListener, IFloodlightModule {
40
41 protected IDeviceStorage devStore;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070042 protected ISwitchStorage swStore;
Pankaj Berdeda809572013-02-22 15:31:20 -080043 protected static Logger log;
44 protected IDeviceService deviceService;
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070045 protected IControllerRegistryService registryService;
Pankaj Berdeda809572013-02-22 15:31:20 -080046
47 protected static final String DBConfigFile = "dbconf";
Pankaj Berde1e3e5ba2013-03-15 13:17:53 -070048 protected static final String CleanupEnabled = "EnableCleanup";
Pankaj Berdef08d5ff2013-03-14 17:03:07 -070049 protected IThreadPoolService threadPool;
50
51 protected final int CLEANUP_TASK_INTERVAL = 999; // 999 ms
52 protected SingletonTask cleanupTask;
53
54 /**
55 * Cleanup and synch switch state from registry
56 */
57 protected class SwitchCleanup implements ControlChangeCallback, Runnable {
58 @Override
59 public void run() {
60 try {
61 log.debug("Running cleanup thread");
62 switchCleanup();
63 }
64 catch (Exception e) {
65 log.error("Error in cleanup thread", e);
66 } finally {
67 cleanupTask.reschedule(CLEANUP_TASK_INTERVAL,
68 TimeUnit.MILLISECONDS);
69 }
70 }
71
72 @Override
73 public void controlChanged(long dpid, boolean hasControl) {
74 // TODO Auto-generated method stub
75
76 if (hasControl) {
77 log.debug("got control to set inactive sw {}", dpid);
78 swStore.update(HexString.toHexString(dpid),SwitchState.INACTIVE, DM_OPERATION.UPDATE);
79 registryService.releaseControl(dpid);
80 }
81 }
82 }
83
84
85
86 protected void switchCleanup() {
87
88 TopoSwitchServiceImpl impl = new TopoSwitchServiceImpl();
89 Iterable<ISwitchObject> switches = impl.getActiveSwitches();
90 // For each switch check if a controller exists in controller registry
91 for (ISwitchObject sw: switches) {
92 log.debug("checking if switch is inactive: {}", sw.getDPID());
93 try {
94 long dpid = HexString.toLong(sw.getDPID());
95 String controller = registryService.getControllerForSwitch(dpid);
96 if (controller == null) {
97 log.debug("request Control to set inactive sw {}", dpid);
98 registryService.requestControl(dpid, new SwitchCleanup());
99 } else {
100 log.debug("sw {} is controlled by controller: {}",dpid,controller);
101 }
102 } catch (NumberFormatException e) {
103 // TODO Auto-generated catch block
104 e.printStackTrace();
105 } catch (RegistryException e) {
106 // TODO Auto-generated catch block
107 e.printStackTrace();
108 }
109 }
110 }
Pankaj Berdeda809572013-02-22 15:31:20 -0800111
112 @Override
113 public void linkDiscoveryUpdate(LDUpdate update) {
114 // TODO Auto-generated method stub
115
116 }
117
118 @Override
119 public void addedSwitch(IOFSwitch sw) {
120 // TODO Auto-generated method stub
121
122 }
123
124 @Override
125 public void removedSwitch(IOFSwitch sw) {
126 // TODO Auto-generated method stub
127
128 }
129
130 @Override
131 public void switchPortChanged(Long switchId) {
132 // TODO Auto-generated method stub
133
134 }
135
136 @Override
137 public String getName() {
138 return "OnosPublisher";
139 }
140
141 @Override
142 public void deviceAdded(IDevice device) {
143 // TODO Auto-generated method stub
144 log.debug("{}:deviceAdded(): Adding device {}",this.getClass(),device.getMACAddressString());
145 devStore.addDevice(device);
146 }
147
148 @Override
149 public void deviceRemoved(IDevice device) {
150 // TODO Auto-generated method stub
151
152 }
153
154 @Override
155 public void deviceMoved(IDevice device) {
156 // TODO Auto-generated method stub
157 devStore.changeDeviceAttachments(device);
158
159 }
160
161 @Override
162 public void deviceIPV4AddrChanged(IDevice device) {
163 // TODO Auto-generated method stub
164 devStore.changeDeviceIPv4Address(device);
165
166 }
167
168 @Override
169 public void deviceVlanChanged(IDevice device) {
170 // TODO Auto-generated method stub
171 }
172
173
174 @Override
175 public Collection<Class<? extends IFloodlightService>> getModuleServices() {
176 // TODO Auto-generated method stub
177 return null;
178 }
179
180 @Override
181 public Map<Class<? extends IFloodlightService>, IFloodlightService> getServiceImpls() {
182 // TODO Auto-generated method stub
183 return null;
184 }
185
186 @Override
187 public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
188 Collection<Class<? extends IFloodlightService>> l =
189 new ArrayList<Class<? extends IFloodlightService>>();
190 l.add(IFloodlightProviderService.class);
191 l.add(IDeviceService.class);
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700192 l.add(IThreadPoolService.class);
Pankaj Berdeda809572013-02-22 15:31:20 -0800193 return l;
194 }
195
196 @Override
197 public void init(FloodlightModuleContext context)
198 throws FloodlightModuleException {
199 // TODO Auto-generated method stub
200 Map<String, String> configMap = context.getConfigParams(this);
201 String conf = configMap.get(DBConfigFile);
202
203 log = LoggerFactory.getLogger(OnosPublisher.class);
204 deviceService = context.getServiceImpl(IDeviceService.class);
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700205 threadPool = context.getServiceImpl(IThreadPoolService.class);
206 registryService = context.getServiceImpl(IControllerRegistryService.class);
Pankaj Berdeda809572013-02-22 15:31:20 -0800207
Pankaj Berdeda809572013-02-22 15:31:20 -0800208 devStore = new DeviceStorageImpl();
209 devStore.init(conf);
210
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700211 swStore = new SwitchStorageImpl();
212 swStore.init(conf);
213
Pankaj Berdeda809572013-02-22 15:31:20 -0800214 log.debug("Initializing OnosPublisher module with {}", conf);
215
216 }
217
218 @Override
219 public void startUp(FloodlightModuleContext context) {
220 // TODO Auto-generated method stub
Pankaj Berde1e3e5ba2013-03-15 13:17:53 -0700221 Map<String, String> configMap = context.getConfigParams(this);
222 String cleanupNeeded = configMap.get(CleanupEnabled);
223
Pankaj Berdef08d5ff2013-03-14 17:03:07 -0700224 deviceService.addListener(this);
225 // Setup the Cleanup task.
Pankaj Berde1e3e5ba2013-03-15 13:17:53 -0700226 if (cleanupNeeded.equals("True")) {
227 ScheduledExecutorService ses = threadPool.getScheduledExecutor();
228 cleanupTask = new SingletonTask(ses, new SwitchCleanup());
229 cleanupTask.reschedule(CLEANUP_TASK_INTERVAL, TimeUnit.MILLISECONDS);
230 }
Pankaj Berdeda809572013-02-22 15:31:20 -0800231 }
232
233}