Disconnect switch when Device was admin removed.
Change-Id: I8d55eda686d29b43540f5467739983564afde5af
Showing
2 changed files
with
56 additions
and
0 deletions
... | @@ -28,6 +28,10 @@ import org.apache.felix.scr.annotations.ReferenceCardinality; | ... | @@ -28,6 +28,10 @@ import org.apache.felix.scr.annotations.ReferenceCardinality; |
28 | import org.apache.felix.scr.annotations.Service; | 28 | import org.apache.felix.scr.annotations.Service; |
29 | import org.onosproject.cfg.ComponentConfigService; | 29 | import org.onosproject.cfg.ComponentConfigService; |
30 | import org.onosproject.core.CoreService; | 30 | import org.onosproject.core.CoreService; |
31 | +import org.onosproject.net.device.DeviceEvent; | ||
32 | +import org.onosproject.net.device.DeviceEvent.Type; | ||
33 | +import org.onosproject.net.device.DeviceListener; | ||
34 | +import org.onosproject.net.device.DeviceService; | ||
31 | import org.onosproject.net.driver.DefaultDriverProviderService; | 35 | import org.onosproject.net.driver.DefaultDriverProviderService; |
32 | import org.onosproject.net.driver.DriverService; | 36 | import org.onosproject.net.driver.DriverService; |
33 | import org.onosproject.openflow.controller.DefaultOpenFlowPacketContext; | 37 | import org.onosproject.openflow.controller.DefaultOpenFlowPacketContext; |
... | @@ -72,6 +76,7 @@ import java.util.Collection; | ... | @@ -72,6 +76,7 @@ import java.util.Collection; |
72 | import java.util.Collections; | 76 | import java.util.Collections; |
73 | import java.util.LinkedList; | 77 | import java.util.LinkedList; |
74 | import java.util.List; | 78 | import java.util.List; |
79 | +import java.util.Optional; | ||
75 | import java.util.Set; | 80 | import java.util.Set; |
76 | import java.util.concurrent.ConcurrentHashMap; | 81 | import java.util.concurrent.ConcurrentHashMap; |
77 | import java.util.concurrent.ConcurrentMap; | 82 | import java.util.concurrent.ConcurrentMap; |
... | @@ -82,6 +87,7 @@ import java.util.concurrent.locks.Lock; | ... | @@ -82,6 +87,7 @@ import java.util.concurrent.locks.Lock; |
82 | import java.util.concurrent.locks.ReentrantLock; | 87 | import java.util.concurrent.locks.ReentrantLock; |
83 | 88 | ||
84 | import static org.onlab.util.Tools.groupedThreads; | 89 | import static org.onlab.util.Tools.groupedThreads; |
90 | +import static org.onosproject.openflow.controller.Dpid.dpid; | ||
85 | 91 | ||
86 | @Component(immediate = true) | 92 | @Component(immediate = true) |
87 | @Service | 93 | @Service |
... | @@ -106,6 +112,10 @@ public class OpenFlowControllerImpl implements OpenFlowController { | ... | @@ -106,6 +112,10 @@ public class OpenFlowControllerImpl implements OpenFlowController { |
106 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 112 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
107 | protected ComponentConfigService cfgService; | 113 | protected ComponentConfigService cfgService; |
108 | 114 | ||
115 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
116 | + protected DeviceService deviceService; | ||
117 | + | ||
118 | + | ||
109 | @Property(name = "openflowPorts", value = DEFAULT_OFPORT, | 119 | @Property(name = "openflowPorts", value = DEFAULT_OFPORT, |
110 | label = "Port numbers (comma separated) used by OpenFlow protocol; default is 6633,6653") | 120 | label = "Port numbers (comma separated) used by OpenFlow protocol; default is 6633,6653") |
111 | private String openflowPorts = DEFAULT_OFPORT; | 121 | private String openflowPorts = DEFAULT_OFPORT; |
... | @@ -161,11 +171,13 @@ public class OpenFlowControllerImpl implements OpenFlowController { | ... | @@ -161,11 +171,13 @@ public class OpenFlowControllerImpl implements OpenFlowController { |
161 | ArrayListMultimap.create(); | 171 | ArrayListMultimap.create(); |
162 | 172 | ||
163 | private final Controller ctrl = new Controller(); | 173 | private final Controller ctrl = new Controller(); |
174 | + private InternalDeviceListener listener = new InternalDeviceListener(); | ||
164 | 175 | ||
165 | @Activate | 176 | @Activate |
166 | public void activate(ComponentContext context) { | 177 | public void activate(ComponentContext context) { |
167 | coreService.registerApplication(APP_ID, this::cleanup); | 178 | coreService.registerApplication(APP_ID, this::cleanup); |
168 | cfgService.registerProperties(getClass()); | 179 | cfgService.registerProperties(getClass()); |
180 | + deviceService.addListener(listener); | ||
169 | ctrl.setConfigParams(context.getProperties()); | 181 | ctrl.setConfigParams(context.getProperties()); |
170 | ctrl.start(agent, driverService); | 182 | ctrl.start(agent, driverService); |
171 | } | 183 | } |
... | @@ -182,6 +194,7 @@ public class OpenFlowControllerImpl implements OpenFlowController { | ... | @@ -182,6 +194,7 @@ public class OpenFlowControllerImpl implements OpenFlowController { |
182 | 194 | ||
183 | @Deactivate | 195 | @Deactivate |
184 | public void deactivate() { | 196 | public void deactivate() { |
197 | + deviceService.removeListener(listener); | ||
185 | cleanup(); | 198 | cleanup(); |
186 | cfgService.unregisterProperties(getClass(), false); | 199 | cfgService.unregisterProperties(getClass(), false); |
187 | } | 200 | } |
... | @@ -521,6 +534,46 @@ public class OpenFlowControllerImpl implements OpenFlowController { | ... | @@ -521,6 +534,46 @@ public class OpenFlowControllerImpl implements OpenFlowController { |
521 | sw.setRole(role); | 534 | sw.setRole(role); |
522 | } | 535 | } |
523 | 536 | ||
537 | + class InternalDeviceListener implements DeviceListener { | ||
538 | + | ||
539 | + @Override | ||
540 | + public boolean isRelevant(DeviceEvent event) { | ||
541 | + return event.type() == Type.DEVICE_REMOVED; | ||
542 | + } | ||
543 | + | ||
544 | + @Override | ||
545 | + public void event(DeviceEvent event) { | ||
546 | + switch (event.type()) { | ||
547 | + case DEVICE_ADDED: | ||
548 | + break; | ||
549 | + case DEVICE_AVAILABILITY_CHANGED: | ||
550 | + break; | ||
551 | + case DEVICE_REMOVED: | ||
552 | + // Device administratively removed, disconnect | ||
553 | + Optional.ofNullable(getSwitch(dpid(event.subject().id().uri()))) | ||
554 | + .ifPresent(OpenFlowSwitch::disconnectSwitch); | ||
555 | + break; | ||
556 | + case DEVICE_SUSPENDED: | ||
557 | + break; | ||
558 | + case DEVICE_UPDATED: | ||
559 | + break; | ||
560 | + case PORT_ADDED: | ||
561 | + break; | ||
562 | + case PORT_REMOVED: | ||
563 | + break; | ||
564 | + case PORT_STATS_UPDATED: | ||
565 | + break; | ||
566 | + case PORT_UPDATED: | ||
567 | + break; | ||
568 | + default: | ||
569 | + break; | ||
570 | + | ||
571 | + } | ||
572 | + | ||
573 | + } | ||
574 | + | ||
575 | + } | ||
576 | + | ||
524 | /** | 577 | /** |
525 | * Implementation of an OpenFlow Agent which is responsible for | 578 | * Implementation of an OpenFlow Agent which is responsible for |
526 | * keeping track of connected switches and the state in which | 579 | * keeping track of connected switches and the state in which | ... | ... |
... | @@ -33,6 +33,7 @@ import org.junit.Test; | ... | @@ -33,6 +33,7 @@ import org.junit.Test; |
33 | import org.onlab.junit.TestTools; | 33 | import org.onlab.junit.TestTools; |
34 | import org.onosproject.cfg.ComponentConfigService; | 34 | import org.onosproject.cfg.ComponentConfigService; |
35 | import org.onosproject.core.CoreService; | 35 | import org.onosproject.core.CoreService; |
36 | +import org.onosproject.net.device.DeviceServiceAdapter; | ||
36 | import org.onosproject.openflow.OpenflowSwitchDriverAdapter; | 37 | import org.onosproject.openflow.OpenflowSwitchDriverAdapter; |
37 | import org.onosproject.openflow.controller.Dpid; | 38 | import org.onosproject.openflow.controller.Dpid; |
38 | import org.onosproject.openflow.controller.OpenFlowSwitch; | 39 | import org.onosproject.openflow.controller.OpenFlowSwitch; |
... | @@ -143,6 +144,8 @@ public class OpenFlowControllerImplTest { | ... | @@ -143,6 +144,8 @@ public class OpenFlowControllerImplTest { |
143 | controller.cfgService = mockConfigService; | 144 | controller.cfgService = mockConfigService; |
144 | replay(mockConfigService); | 145 | replay(mockConfigService); |
145 | 146 | ||
147 | + controller.deviceService = new DeviceServiceAdapter(); | ||
148 | + | ||
146 | ComponentContext mockContext = EasyMock.createMock(ComponentContext.class); | 149 | ComponentContext mockContext = EasyMock.createMock(ComponentContext.class); |
147 | Dictionary<String, Object> properties = new Hashtable<>(); | 150 | Dictionary<String, Object> properties = new Hashtable<>(); |
148 | properties.put("openflowPorts", | 151 | properties.put("openflowPorts", | ... | ... |
-
Please register or login to post a comment