blob: f11c06db7c0c7190cea6e8e436eca220aa2f2fd0 [file] [log] [blame]
Jonathan Hart472062d2014-04-03 10:56:48 -07001package net.onrc.onos.core.topology;
Jonathan Hart4b5bbb52014-02-06 10:09:31 -08002
3import java.util.ArrayList;
4import java.util.Collection;
Jonathan Hart369875b2014-02-13 10:00:31 -08005import java.util.List;
Jonathan Hart4b5bbb52014-02-06 10:09:31 -08006import java.util.Map;
Jonathan Hart369875b2014-02-13 10:00:31 -08007import java.util.concurrent.TimeUnit;
Jonathan Hart4b5bbb52014-02-06 10:09:31 -08008
9import net.floodlightcontroller.core.IFloodlightProviderService;
10import net.floodlightcontroller.core.IOFSwitch;
11import net.floodlightcontroller.core.module.FloodlightModuleContext;
12import net.floodlightcontroller.core.module.FloodlightModuleException;
13import net.floodlightcontroller.core.module.IFloodlightModule;
14import net.floodlightcontroller.core.module.IFloodlightService;
Jonathan Hart369875b2014-02-13 10:00:31 -080015import net.floodlightcontroller.core.util.SingletonTask;
16import net.floodlightcontroller.threadpool.IThreadPoolService;
Jonathan Hart03102132014-07-01 23:22:04 -070017import net.onrc.onos.core.hostmanager.Host;
18import net.onrc.onos.core.hostmanager.IHostListener;
19import net.onrc.onos.core.hostmanager.IHostService;
Jonathan Hart23701d12014-04-03 10:45:48 -070020import net.onrc.onos.core.linkdiscovery.ILinkDiscoveryListener;
21import net.onrc.onos.core.linkdiscovery.ILinkDiscoveryService;
Jonathan Hart284e70f2014-07-05 12:32:51 -070022import net.onrc.onos.core.linkdiscovery.Link;
Jonathan Hart51f6f5b2014-04-03 10:32:10 -070023import net.onrc.onos.core.main.IOFSwitchPortListener;
Jonathan Hartdeda0ba2014-04-03 11:14:12 -070024import net.onrc.onos.core.registry.IControllerRegistryService;
Jonathan Hartdeda0ba2014-04-03 11:14:12 -070025import net.onrc.onos.core.registry.IControllerRegistryService.ControlChangeCallback;
Jonathan Harta99ec672014-04-03 11:30:34 -070026import net.onrc.onos.core.registry.RegistryException;
Yuta HIGUCHI5bbbaca2014-06-09 16:39:08 -070027import net.onrc.onos.core.util.Dpid;
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -070028import net.onrc.onos.core.util.PortNumber;
Yuta HIGUCHI5c8cbeb2014-06-27 11:13:48 -070029import net.onrc.onos.core.util.SwitchPort;
Jonathan Hart4b5bbb52014-02-06 10:09:31 -080030
31import org.openflow.protocol.OFPhysicalPort;
Jonathan Hart369875b2014-02-13 10:00:31 -080032import org.openflow.util.HexString;
Toshio Koide2f570c12014-02-06 16:55:32 -080033import org.slf4j.Logger;
34import org.slf4j.LoggerFactory;
Jonathan Hart4b5bbb52014-02-06 10:09:31 -080035
Jonathan Hart88770672014-04-02 18:08:30 -070036/**
Jonathan Harte37e4e22014-05-13 19:12:02 -070037 * The TopologyPublisher subscribes to topology network events from the
38 * discovery modules. These events are reformatted and relayed to the in-memory
39 * topology instance.
Jonathan Hart88770672014-04-02 18:08:30 -070040 */
Jonathan Harte37e4e22014-05-13 19:12:02 -070041public class TopologyPublisher implements /*IOFSwitchListener,*/
Ray Milkey269ffb92014-04-03 14:43:30 -070042 IOFSwitchPortListener,
43 ILinkDiscoveryListener,
44 IFloodlightModule,
Jonathan Hart03102132014-07-01 23:22:04 -070045 IHostListener {
Jonathan Hart88770672014-04-02 18:08:30 -070046 private static final Logger log =
Jonathan Harte37e4e22014-05-13 19:12:02 -070047 LoggerFactory.getLogger(TopologyPublisher.class);
Yuta HIGUCHIcb951982014-02-11 13:31:44 -080048
Jonathan Hart88770672014-04-02 18:08:30 -070049 private IFloodlightProviderService floodlightProvider;
50 private ILinkDiscoveryService linkDiscovery;
51 private IControllerRegistryService registryService;
Jonathan Harte37e4e22014-05-13 19:12:02 -070052 private ITopologyService topologyService;
Toshio Koide2f570c12014-02-06 16:55:32 -080053
Jonathan Hart03102132014-07-01 23:22:04 -070054 private IHostService hostService;
Jonathan Hartb3e1b052014-04-02 16:01:12 -070055
Jonathan Harte37e4e22014-05-13 19:12:02 -070056 private Topology topology;
57 private TopologyDiscoveryInterface topologyDiscoveryInterface;
Jonathan Hartb3e1b052014-04-02 16:01:12 -070058
Jonathan Hart88770672014-04-02 18:08:30 -070059 private static final String ENABLE_CLEANUP_PROPERTY = "EnableCleanup";
60 private boolean cleanupEnabled = true;
61 private static final int CLEANUP_TASK_INTERVAL = 60; // in seconds
62 private SingletonTask cleanupTask;
Toshio Koide2f570c12014-02-06 16:55:32 -080063
Jonathan Hart369875b2014-02-13 10:00:31 -080064 /**
Jonathan Harte37e4e22014-05-13 19:12:02 -070065 * Cleanup old switches from the topology. Old switches are those
Jonathan Hart88770672014-04-02 18:08:30 -070066 * which have no controller in the registry.
Jonathan Hart369875b2014-02-13 10:00:31 -080067 */
68 private class SwitchCleanup implements ControlChangeCallback, Runnable {
69 @Override
70 public void run() {
71 String old = Thread.currentThread().getName();
72 Thread.currentThread().setName("SwitchCleanup@" + old);
Jonathan Hartb3e1b052014-04-02 16:01:12 -070073
Jonathan Hart369875b2014-02-13 10:00:31 -080074 try {
Jonathan Hart88770672014-04-02 18:08:30 -070075 if (log.isTraceEnabled()) {
76 log.trace("Running cleanup thread");
77 }
Jonathan Hart369875b2014-02-13 10:00:31 -080078 switchCleanup();
Jonathan Hart369875b2014-02-13 10:00:31 -080079 } finally {
80 cleanupTask.reschedule(CLEANUP_TASK_INTERVAL,
Jonathan Hart88770672014-04-02 18:08:30 -070081 TimeUnit.SECONDS);
Jonathan Hart369875b2014-02-13 10:00:31 -080082 Thread.currentThread().setName(old);
83 }
84 }
Jonathan Hartb3e1b052014-04-02 16:01:12 -070085
Jonathan Hart88770672014-04-02 18:08:30 -070086 /**
87 * First half of the switch cleanup operation. This method will attempt
88 * to get control of any switch it sees without a controller via the
89 * registry.
90 */
Jonathan Hart369875b2014-02-13 10:00:31 -080091 private void switchCleanup() {
Jonathan Harte37e4e22014-05-13 19:12:02 -070092 Iterable<Switch> switches = topology.getSwitches();
Jonathan Hart369875b2014-02-13 10:00:31 -080093
Jonathan Hart88770672014-04-02 18:08:30 -070094 if (log.isTraceEnabled()) {
95 log.trace("Checking for inactive switches");
96 }
97 // For each switch check if a controller exists in controller registry
Ray Milkey269ffb92014-04-03 14:43:30 -070098 for (Switch sw : switches) {
Jonathan Hart88770672014-04-02 18:08:30 -070099 try {
100 String controller =
Yuta HIGUCHI8f3dfa32014-06-25 00:14:25 -0700101 registryService.getControllerForSwitch(sw.getDpid().value());
Jonathan Hart88770672014-04-02 18:08:30 -0700102 if (controller == null) {
103 log.debug("Requesting control to set switch {} INACTIVE",
Yuta HIGUCHI8f3dfa32014-06-25 00:14:25 -0700104 sw.getDpid());
105 registryService.requestControl(sw.getDpid().value(), this);
Jonathan Hart88770672014-04-02 18:08:30 -0700106 }
107 } catch (RegistryException e) {
108 log.error("Caught RegistryException in cleanup thread", e);
109 }
110 }
Jonathan Hart369875b2014-02-13 10:00:31 -0800111 }
112
Jonathan Hart88770672014-04-02 18:08:30 -0700113 /**
114 * Second half of the switch cleanup operation. If the registry grants
115 * control of a switch, we can be sure no other instance is writing
Jonathan Harte37e4e22014-05-13 19:12:02 -0700116 * this switch to the topology, so we can remove it now.
Ray Milkey269ffb92014-04-03 14:43:30 -0700117 *
118 * @param dpid the dpid of the switch we requested control for
Jonathan Hart88770672014-04-02 18:08:30 -0700119 * @param hasControl whether we got control or not
120 */
121 @Override
122 public void controlChanged(long dpid, boolean hasControl) {
123 if (hasControl) {
124 log.debug("Got control to set switch {} INACTIVE",
125 HexString.toHexString(dpid));
Jonathan Harte02cf542014-04-02 16:24:44 -0700126
Yuta HIGUCHIe2a4e172014-07-03 10:50:39 -0700127 SwitchEvent switchEvent = new SwitchEvent(new Dpid(dpid));
Jonathan Harte37e4e22014-05-13 19:12:02 -0700128 topologyDiscoveryInterface.
Jonathan Hart88770672014-04-02 18:08:30 -0700129 removeSwitchDiscoveryEvent(switchEvent);
130 registryService.releaseControl(dpid);
131 }
132 }
Jonathan Hart369875b2014-02-13 10:00:31 -0800133 }
Jonathan Hart4b5bbb52014-02-06 10:09:31 -0800134
Jonathan Hart88770672014-04-02 18:08:30 -0700135 @Override
Jonathan Hart284e70f2014-07-05 12:32:51 -0700136 public void linkAdded(Link link) {
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -0700137 LinkEvent linkEvent = new LinkEvent(
Jonathan Hart284e70f2014-07-05 12:32:51 -0700138 new SwitchPort(link.getSrc(), link.getSrcPort()),
139 new SwitchPort(link.getDst(), link.getDstPort()));
140
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -0700141 // FIXME should be merging, with existing attrs, etc..
142 // TODO define attr name as constant somewhere.
143 // TODO populate appropriate attributes.
Yuta HIGUCHI1222ac52014-07-09 16:50:28 -0700144 linkEvent.createStringAttribute(TopologyElement.TYPE,
Yuta HIGUCHIdbc33122014-07-10 13:32:32 -0700145 TopologyElement.TYPE_PACKET_LAYER);
Praseed Balakrishnan2aa6c0b2014-07-17 11:42:05 -0700146 linkEvent.createStringAttribute(TopologyElement.ELEMENT_CONFIG_STATE,
147 ConfigState.NOT_CONFIGURED.toString());
148 linkEvent.createStringAttribute(TopologyElement.ELEMENT_ADMIN_STATUS,
149 AdminStatus.ACTIVE.toString());
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -0700150 linkEvent.freeze();
Jonathan Hartb3e1b052014-04-02 16:01:12 -0700151
Jonathan Hart284e70f2014-07-05 12:32:51 -0700152 if (!registryService.hasControl(link.getDst())) {
153 // Don't process or send a link event if we're not master for the
154 // destination switch
155 log.debug("Not the master for dst switch {}. Suppressed link add event {}.",
156 link.getDst(), linkEvent);
157 return;
Jonathan Hart88770672014-04-02 18:08:30 -0700158 }
Jonathan Hart284e70f2014-07-05 12:32:51 -0700159 topologyDiscoveryInterface.putLinkDiscoveryEvent(linkEvent);
160 }
161
162 @Override
163 public void linkRemoved(Link link) {
164 LinkEvent linkEvent = new LinkEvent(
165 new SwitchPort(link.getSrc(), link.getSrcPort()),
166 new SwitchPort(link.getDst(), link.getDstPort()));
167
168 // FIXME should be merging, with existing attrs, etc..
169 // TODO define attr name as constant somewhere.
170 // TODO populate appropriate attributes.
Yuta HIGUCHI1222ac52014-07-09 16:50:28 -0700171 linkEvent.createStringAttribute(TopologyElement.TYPE,
Yuta HIGUCHIdbc33122014-07-10 13:32:32 -0700172 TopologyElement.TYPE_PACKET_LAYER);
Jonathan Hart284e70f2014-07-05 12:32:51 -0700173 linkEvent.freeze();
174
175 if (!registryService.hasControl(link.getDst())) {
176 // Don't process or send a link event if we're not master for the
177 // destination switch
178 log.debug("Not the master for dst switch {}. Suppressed link remove event {}.",
179 link.getDst(), linkEvent);
180 return;
181 }
182 topologyDiscoveryInterface.removeLinkDiscoveryEvent(linkEvent);
Jonathan Hart88770672014-04-02 18:08:30 -0700183 }
Jonathan Hart4b5bbb52014-02-06 10:09:31 -0800184
Jonathan Hart88770672014-04-02 18:08:30 -0700185 @Override
186 public void switchPortAdded(Long switchId, OFPhysicalPort port) {
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -0700187 final Dpid dpid = new Dpid(switchId);
188 PortEvent portEvent = new PortEvent(dpid, new PortNumber(port.getPortNumber()));
189 // FIXME should be merging, with existing attrs, etc..
190 // TODO define attr name as constant somewhere.
191 // TODO populate appropriate attributes.
Yuta HIGUCHI1222ac52014-07-09 16:50:28 -0700192 portEvent.createStringAttribute(TopologyElement.TYPE,
Yuta HIGUCHIdbc33122014-07-10 13:32:32 -0700193 TopologyElement.TYPE_PACKET_LAYER);
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -0700194 portEvent.createStringAttribute("name", port.getName());
Yuta HIGUCHI5bbbaca2014-06-09 16:39:08 -0700195
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -0700196 portEvent.freeze();
197
Jonathan Hart67b6cba2014-05-30 22:36:37 -0700198 if (registryService.hasControl(switchId)) {
Jonathan Hart67b6cba2014-05-30 22:36:37 -0700199 topologyDiscoveryInterface.putPortDiscoveryEvent(portEvent);
Jonathan Hart284e70f2014-07-05 12:32:51 -0700200 linkDiscovery.enableDiscoveryOnPort(switchId, port.getPortNumber());
Yuta HIGUCHI5bbbaca2014-06-09 16:39:08 -0700201 } else {
202 log.debug("Not the master for switch {}. Suppressed port add event {}.",
203 new Dpid(switchId), portEvent);
Jonathan Hart67b6cba2014-05-30 22:36:37 -0700204 }
Jonathan Hart88770672014-04-02 18:08:30 -0700205 }
Jonathan Hart4b5bbb52014-02-06 10:09:31 -0800206
Jonathan Hart88770672014-04-02 18:08:30 -0700207 @Override
208 public void switchPortRemoved(Long switchId, OFPhysicalPort port) {
Yuta HIGUCHIe2a4e172014-07-03 10:50:39 -0700209 final Dpid dpid = new Dpid(switchId);
Yuta HIGUCHI5bbbaca2014-06-09 16:39:08 -0700210
Yuta HIGUCHIe2a4e172014-07-03 10:50:39 -0700211 PortEvent portEvent = new PortEvent(dpid, new PortNumber(port.getPortNumber()));
Yuta HIGUCHI1222ac52014-07-09 16:50:28 -0700212 // FIXME should be merging, with existing attrs, etc..
213 // TODO define attr name as constant somewhere.
214 // TODO populate appropriate attributes.
215 portEvent.createStringAttribute(TopologyElement.TYPE,
Yuta HIGUCHIdbc33122014-07-10 13:32:32 -0700216 TopologyElement.TYPE_PACKET_LAYER);
Yuta HIGUCHI1222ac52014-07-09 16:50:28 -0700217 portEvent.createStringAttribute("name", port.getName());
218
219 portEvent.freeze();
220
Jonathan Hart67b6cba2014-05-30 22:36:37 -0700221 if (registryService.hasControl(switchId)) {
Jonathan Hart67b6cba2014-05-30 22:36:37 -0700222 topologyDiscoveryInterface.removePortDiscoveryEvent(portEvent);
Yuta HIGUCHI5bbbaca2014-06-09 16:39:08 -0700223 } else {
224 log.debug("Not the master for switch {}. Suppressed port del event {}.",
Yuta HIGUCHIe2a4e172014-07-03 10:50:39 -0700225 dpid, portEvent);
Jonathan Hart67b6cba2014-05-30 22:36:37 -0700226 }
Jonathan Hart88770672014-04-02 18:08:30 -0700227 }
Jonathan Hart4b5bbb52014-02-06 10:09:31 -0800228
Jonathan Hart88770672014-04-02 18:08:30 -0700229 @Override
230 public void addedSwitch(IOFSwitch sw) {
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -0700231 final Dpid dpid = new Dpid(sw.getId());
232 SwitchEvent switchEvent = new SwitchEvent(dpid);
233 // FIXME should be merging, with existing attrs, etc..
234 // TODO define attr name as constant somewhere.
235 // TODO populate appropriate attributes.
Yuta HIGUCHI1222ac52014-07-09 16:50:28 -0700236 switchEvent.createStringAttribute(TopologyElement.TYPE,
Yuta HIGUCHIdbc33122014-07-10 13:32:32 -0700237 TopologyElement.TYPE_PACKET_LAYER);
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -0700238 switchEvent.createStringAttribute("ConnectedSince",
239 sw.getConnectedSince().toString());
Praseed Balakrishnan2aa6c0b2014-07-17 11:42:05 -0700240 switchEvent.createStringAttribute(TopologyElement.ELEMENT_CONFIG_STATE,
241 ConfigState.NOT_CONFIGURED.toString());
242 switchEvent.createStringAttribute(TopologyElement.ELEMENT_ADMIN_STATUS,
243 AdminStatus.ACTIVE.toString());
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -0700244 switchEvent.freeze();
Jonathan Hartb3e1b052014-04-02 16:01:12 -0700245
Yuta HIGUCHI5bbbaca2014-06-09 16:39:08 -0700246 // TODO Not very robust
247 if (!registryService.hasControl(sw.getId())) {
248 log.debug("Not the master for switch {}. Suppressed switch add event {}.",
Yuta HIGUCHIe2a4e172014-07-03 10:50:39 -0700249 dpid, switchEvent);
Yuta HIGUCHI5bbbaca2014-06-09 16:39:08 -0700250 return;
251 }
252
Jonathan Hart88770672014-04-02 18:08:30 -0700253 List<PortEvent> portEvents = new ArrayList<PortEvent>();
254 for (OFPhysicalPort port : sw.getPorts()) {
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -0700255 PortEvent portEvent = new PortEvent(dpid, new PortNumber(port.getPortNumber()));
256 // FIXME should be merging, with existing attrs, etc..
257 // TODO define attr name as constant somewhere.
258 // TODO populate appropriate attributes.
259 portEvent.createStringAttribute("name", port.getName());
Yuta HIGUCHI1222ac52014-07-09 16:50:28 -0700260 portEvent.createStringAttribute(TopologyElement.TYPE,
Yuta HIGUCHIdbc33122014-07-10 13:32:32 -0700261 TopologyElement.TYPE_PACKET_LAYER);
Praseed Balakrishnan2aa6c0b2014-07-17 11:42:05 -0700262 portEvent.createStringAttribute(TopologyElement.ELEMENT_CONFIG_STATE,
263 ConfigState.NOT_CONFIGURED.toString());
264 portEvent.createStringAttribute(TopologyElement.ELEMENT_ADMIN_STATUS,
265 AdminStatus.ACTIVE.toString());
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -0700266
267 portEvent.freeze();
268 portEvents.add(portEvent);
Jonathan Hart88770672014-04-02 18:08:30 -0700269 }
Jonathan Harte37e4e22014-05-13 19:12:02 -0700270 topologyDiscoveryInterface
Ray Milkey269ffb92014-04-03 14:43:30 -0700271 .putSwitchDiscoveryEvent(switchEvent, portEvents);
Toshio Koide2f570c12014-02-06 16:55:32 -0800272
Jonathan Hart88770672014-04-02 18:08:30 -0700273 for (OFPhysicalPort port : sw.getPorts()) {
274 // Allow links to be discovered on this port now that it's
275 // in the database
Jonathan Hart284e70f2014-07-05 12:32:51 -0700276 linkDiscovery.enableDiscoveryOnPort(sw.getId(), port.getPortNumber());
Jonathan Hart88770672014-04-02 18:08:30 -0700277 }
278 }
Jonathan Hart4b5bbb52014-02-06 10:09:31 -0800279
Jonathan Hart88770672014-04-02 18:08:30 -0700280 @Override
281 public void removedSwitch(IOFSwitch sw) {
282 // We don't use this event - switch remove is done by cleanup thread
283 }
Jonathan Hart4b5bbb52014-02-06 10:09:31 -0800284
Jonathan Hart88770672014-04-02 18:08:30 -0700285 @Override
286 public void switchPortChanged(Long switchId) {
287 // We don't use this event
288 }
Jonathan Hart4b5bbb52014-02-06 10:09:31 -0800289
Jonathan Hart88770672014-04-02 18:08:30 -0700290 @Override
291 public String getName() {
292 // TODO Auto-generated method stub
293 return null;
294 }
Jonathan Hart4b5bbb52014-02-06 10:09:31 -0800295
Jonathan Hart88770672014-04-02 18:08:30 -0700296 /* *****************
297 * IFloodlightModule
298 * *****************/
Toshio Koide2f570c12014-02-06 16:55:32 -0800299
Jonathan Hart88770672014-04-02 18:08:30 -0700300 @Override
301 public Collection<Class<? extends IFloodlightService>> getModuleServices() {
302 return null;
303 }
Jonathan Hart4b5bbb52014-02-06 10:09:31 -0800304
Jonathan Hart88770672014-04-02 18:08:30 -0700305 @Override
306 public Map<Class<? extends IFloodlightService>, IFloodlightService>
307 getServiceImpls() {
308 return null;
309 }
Jonathan Hart4b5bbb52014-02-06 10:09:31 -0800310
Jonathan Hart88770672014-04-02 18:08:30 -0700311 @Override
312 public Collection<Class<? extends IFloodlightService>>
Ray Milkey269ffb92014-04-03 14:43:30 -0700313 getModuleDependencies() {
Jonathan Hart88770672014-04-02 18:08:30 -0700314 Collection<Class<? extends IFloodlightService>> l =
315 new ArrayList<Class<? extends IFloodlightService>>();
Jonathan Hart4b5bbb52014-02-06 10:09:31 -0800316 l.add(IFloodlightProviderService.class);
317 l.add(ILinkDiscoveryService.class);
Jonathan Hart369875b2014-02-13 10:00:31 -0800318 l.add(IThreadPoolService.class);
Jonathan Hart4b5bbb52014-02-06 10:09:31 -0800319 l.add(IControllerRegistryService.class);
Jonathan Harte37e4e22014-05-13 19:12:02 -0700320 l.add(ITopologyService.class);
Jonathan Hart03102132014-07-01 23:22:04 -0700321 l.add(IHostService.class);
Jonathan Hart4b5bbb52014-02-06 10:09:31 -0800322 return l;
Jonathan Hart88770672014-04-02 18:08:30 -0700323 }
Jonathan Hart4b5bbb52014-02-06 10:09:31 -0800324
Jonathan Hart88770672014-04-02 18:08:30 -0700325 @Override
326 public void init(FloodlightModuleContext context)
327 throws FloodlightModuleException {
328 floodlightProvider = context.getServiceImpl(IFloodlightProviderService.class);
329 linkDiscovery = context.getServiceImpl(ILinkDiscoveryService.class);
330 registryService = context.getServiceImpl(IControllerRegistryService.class);
Jonathan Hart03102132014-07-01 23:22:04 -0700331 hostService = context.getServiceImpl(IHostService.class);
Toshio Koide2f570c12014-02-06 16:55:32 -0800332
Jonathan Harte37e4e22014-05-13 19:12:02 -0700333 topologyService = context.getServiceImpl(ITopologyService.class);
Jonathan Hart88770672014-04-02 18:08:30 -0700334 }
Jonathan Hart4b5bbb52014-02-06 10:09:31 -0800335
Jonathan Hart88770672014-04-02 18:08:30 -0700336 @Override
337 public void startUp(FloodlightModuleContext context) {
338 floodlightProvider.addOFSwitchListener(this);
339 linkDiscovery.addListener(this);
Jonathan Hart03102132014-07-01 23:22:04 -0700340 hostService.addHostListener(this);
Toshio Koide2f570c12014-02-06 16:55:32 -0800341
Jonathan Harte37e4e22014-05-13 19:12:02 -0700342 topology = topologyService.getTopology();
343 topologyDiscoveryInterface =
344 topologyService.getTopologyDiscoveryInterface();
Jonathan Hartb3e1b052014-04-02 16:01:12 -0700345
Jonathan Hart88770672014-04-02 18:08:30 -0700346 // Run the cleanup thread
347 String enableCleanup =
348 context.getConfigParams(this).get(ENABLE_CLEANUP_PROPERTY);
349 if (enableCleanup != null
350 && enableCleanup.equalsIgnoreCase("false")) {
351 cleanupEnabled = false;
352 }
Jonathan Hartb3e1b052014-04-02 16:01:12 -0700353
Jonathan Hart88770672014-04-02 18:08:30 -0700354 log.debug("Cleanup thread is {}enabled", (cleanupEnabled) ? "" : "not ");
Jonathan Hartb3e1b052014-04-02 16:01:12 -0700355
Jonathan Hart88770672014-04-02 18:08:30 -0700356 if (cleanupEnabled) {
357 IThreadPoolService threadPool =
358 context.getServiceImpl(IThreadPoolService.class);
359 cleanupTask = new SingletonTask(threadPool.getScheduledExecutor(),
360 new SwitchCleanup());
361 // Run the cleanup task immediately on startup
362 cleanupTask.reschedule(0, TimeUnit.SECONDS);
363 }
364 }
Jonathan Hartb3e1b052014-04-02 16:01:12 -0700365
Jonathan Hart88770672014-04-02 18:08:30 -0700366 @Override
Jonathan Hart03102132014-07-01 23:22:04 -0700367 public void hostAdded(Host host) {
368 log.debug("Called onosDeviceAdded mac {}", host.getMacAddress());
TeruUd1c5b652014-03-24 13:58:46 -0700369
Jonathan Hart03102132014-07-01 23:22:04 -0700370 SwitchPort sp = new SwitchPort(host.getSwitchDPID(), host.getSwitchPort());
Jonathan Hart88770672014-04-02 18:08:30 -0700371 List<SwitchPort> spLists = new ArrayList<SwitchPort>();
372 spLists.add(sp);
Yuta HIGUCHIbfc77f02014-07-14 22:50:25 -0700373 HostEvent event = new HostEvent(host.getMacAddress());
Jonathan Hart88770672014-04-02 18:08:30 -0700374 event.setAttachmentPoints(spLists);
Jonathan Hart03102132014-07-01 23:22:04 -0700375 event.setLastSeenTime(host.getLastSeenTimestamp().getTime());
Jonathan Hart88770672014-04-02 18:08:30 -0700376 // Does not use vlan info now.
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -0700377 event.freeze();
Jonathan Hartb3e1b052014-04-02 16:01:12 -0700378
Yuta HIGUCHIbfc77f02014-07-14 22:50:25 -0700379 topologyDiscoveryInterface.putHostDiscoveryEvent(event);
Jonathan Hart88770672014-04-02 18:08:30 -0700380 }
TeruUd1c5b652014-03-24 13:58:46 -0700381
Jonathan Hart88770672014-04-02 18:08:30 -0700382 @Override
Jonathan Hart03102132014-07-01 23:22:04 -0700383 public void hostRemoved(Host host) {
Jonathan Hart88770672014-04-02 18:08:30 -0700384 log.debug("Called onosDeviceRemoved");
Yuta HIGUCHIbfc77f02014-07-14 22:50:25 -0700385 HostEvent event = new HostEvent(host.getMacAddress());
Jonathan Hart03102132014-07-01 23:22:04 -0700386 //XXX shouldn't we be setting attachment points?
Yuta HIGUCHIbf0a8712014-06-30 18:59:46 -0700387 event.freeze();
Yuta HIGUCHIbfc77f02014-07-14 22:50:25 -0700388 topologyDiscoveryInterface.removeHostDiscoveryEvent(event);
Jonathan Hart88770672014-04-02 18:08:30 -0700389 }
Jonathan Hart4b5bbb52014-02-06 10:09:31 -0800390}