gaurav
Committed by Gerrit Code Review

clean up the SingleSwitchFibInstaller, added the predeactivate hook and modified unit test CORD-663

Change-Id: I8bf9dd4c7a6e9c42833a6f631bfceb85b7f3ddef
...@@ -32,6 +32,7 @@ import org.onlab.packet.IpPrefix; ...@@ -32,6 +32,7 @@ import org.onlab.packet.IpPrefix;
32 import org.onlab.packet.MacAddress; 32 import org.onlab.packet.MacAddress;
33 import org.onlab.packet.VlanId; 33 import org.onlab.packet.VlanId;
34 import org.onlab.util.Tools; 34 import org.onlab.util.Tools;
35 +import org.onosproject.app.ApplicationService;
35 import org.onosproject.cfg.ComponentConfigService; 36 import org.onosproject.cfg.ComponentConfigService;
36 import org.onosproject.core.ApplicationId; 37 import org.onosproject.core.ApplicationId;
37 import org.onosproject.core.CoreService; 38 import org.onosproject.core.CoreService;
...@@ -88,6 +89,7 @@ import java.util.stream.Collectors; ...@@ -88,6 +89,7 @@ import java.util.stream.Collectors;
88 public class SingleSwitchFibInstaller { 89 public class SingleSwitchFibInstaller {
89 90
90 private final Logger log = LoggerFactory.getLogger(getClass()); 91 private final Logger log = LoggerFactory.getLogger(getClass());
92 + private static final String APP_NAME = "org.onosproject.vrouter";
91 93
92 private static final int PRIORITY_OFFSET = 100; 94 private static final int PRIORITY_OFFSET = 100;
93 private static final int PRIORITY_MULTIPLIER = 5; 95 private static final int PRIORITY_MULTIPLIER = 5;
...@@ -118,6 +120,9 @@ public class SingleSwitchFibInstaller { ...@@ -118,6 +120,9 @@ public class SingleSwitchFibInstaller {
118 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 120 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
119 protected DeviceService deviceService; 121 protected DeviceService deviceService;
120 122
123 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
124 + protected ApplicationService applicationService;
125 +
121 @Property(name = "routeToNextHop", boolValue = false, 126 @Property(name = "routeToNextHop", boolValue = false,
122 label = "Install a /32 route to each next hop") 127 label = "Install a /32 route to each next hop")
123 private boolean routeToNextHop = false; 128 private boolean routeToNextHop = false;
...@@ -133,6 +138,7 @@ public class SingleSwitchFibInstaller { ...@@ -133,6 +138,7 @@ public class SingleSwitchFibInstaller {
133 138
134 private ApplicationId coreAppId; 139 private ApplicationId coreAppId;
135 private ApplicationId routerAppId; 140 private ApplicationId routerAppId;
141 + private ApplicationId vrouterAppId;
136 142
137 // Reference count for how many times a next hop is used by a route 143 // Reference count for how many times a next hop is used by a route
138 private final Multiset<IpAddress> nextHopsCount = ConcurrentHashMultiset.create(); 144 private final Multiset<IpAddress> nextHopsCount = ConcurrentHashMultiset.create();
...@@ -163,6 +169,7 @@ public class SingleSwitchFibInstaller { ...@@ -163,6 +169,7 @@ public class SingleSwitchFibInstaller {
163 169
164 coreAppId = coreService.registerApplication(CoreService.CORE_APP_NAME); 170 coreAppId = coreService.registerApplication(CoreService.CORE_APP_NAME);
165 routerAppId = coreService.registerApplication(RoutingService.ROUTER_APP_ID); 171 routerAppId = coreService.registerApplication(RoutingService.ROUTER_APP_ID);
172 + vrouterAppId = coreService.registerApplication(APP_NAME);
166 173
167 networkConfigRegistry.registerConfigFactory(mcastConfigFactory); 174 networkConfigRegistry.registerConfigFactory(mcastConfigFactory);
168 175
...@@ -173,6 +180,10 @@ public class SingleSwitchFibInstaller { ...@@ -173,6 +180,10 @@ public class SingleSwitchFibInstaller {
173 180
174 updateConfig(); 181 updateConfig();
175 182
183 + applicationService.registerDeactivateHook(vrouterAppId, () -> {
184 + this.cleanUp();
185 + });
186 +
176 log.info("Started"); 187 log.info("Started");
177 } 188 }
178 189
...@@ -202,6 +213,17 @@ public class SingleSwitchFibInstaller { ...@@ -202,6 +213,17 @@ public class SingleSwitchFibInstaller {
202 log.info("routeToNextHop set to {}", routeToNextHop); 213 log.info("routeToNextHop set to {}", routeToNextHop);
203 } 214 }
204 215
216 + //remove filtering objectives and routes before deactivate.
217 + private void cleanUp() {
218 + //clean up the routes.
219 + for (Map.Entry<IpPrefix, IpAddress> routes: prefixToNextHop.entrySet()) {
220 + deleteRoute(new ResolvedRoute(routes.getKey(), null, null));
221 + }
222 + //clean up the filtering objective for interfaces.
223 + Set<Interface> intfs = getInterfaces();
224 + processIntfFilters(false, intfs);
225 + }
226 +
205 private void updateConfig() { 227 private void updateConfig() {
206 RouterConfig routerConfig = 228 RouterConfig routerConfig =
207 networkConfigService.getConfig(routerAppId, RoutingService.ROUTER_CONFIG_CLASS); 229 networkConfigService.getConfig(routerAppId, RoutingService.ROUTER_CONFIG_CLASS);
...@@ -226,22 +248,25 @@ public class SingleSwitchFibInstaller { ...@@ -226,22 +248,25 @@ public class SingleSwitchFibInstaller {
226 248
227 private void updateDevice() { 249 private void updateDevice() {
228 if (deviceId != null && deviceService.isAvailable(deviceId)) { 250 if (deviceId != null && deviceService.isAvailable(deviceId)) {
229 - 251 + Set<Interface> intfs = getInterfaces();
230 - Set<Interface> intfs;
231 - if (interfaces.isEmpty()) {
232 - intfs = interfaceService.getInterfaces();
233 - } else {
234 - // TODO need to fix by making interface names globally unique
235 - intfs = interfaceService.getInterfaces().stream()
236 - .filter(intf -> intf.connectPoint().deviceId().equals(deviceId))
237 - .filter(intf -> interfaces.contains(intf.name()))
238 - .collect(Collectors.toSet());
239 - }
240 -
241 processIntfFilters(true, intfs); 252 processIntfFilters(true, intfs);
242 } 253 }
243 } 254 }
244 255
256 + private Set<Interface> getInterfaces() {
257 + Set<Interface> intfs;
258 + if (interfaces.isEmpty()) {
259 + intfs = interfaceService.getInterfaces();
260 + } else {
261 + // TODO need to fix by making interface names globally unique
262 + intfs = interfaceService.getInterfaces().stream()
263 + .filter(intf -> intf.connectPoint().deviceId().equals(deviceId))
264 + .filter(intf -> interfaces.contains(intf.name()))
265 + .collect(Collectors.toSet());
266 + }
267 + return intfs;
268 + }
269 +
245 private void updateRoute(ResolvedRoute route) { 270 private void updateRoute(ResolvedRoute route) {
246 addNextHop(route); 271 addNextHop(route);
247 272
......
...@@ -26,6 +26,7 @@ import org.onlab.packet.IpPrefix; ...@@ -26,6 +26,7 @@ import org.onlab.packet.IpPrefix;
26 import org.onlab.packet.MacAddress; 26 import org.onlab.packet.MacAddress;
27 import org.onlab.packet.VlanId; 27 import org.onlab.packet.VlanId;
28 import org.onosproject.TestApplicationId; 28 import org.onosproject.TestApplicationId;
29 +import org.onosproject.app.ApplicationService;
29 import org.onosproject.cfg.ComponentConfigService; 30 import org.onosproject.cfg.ComponentConfigService;
30 import org.onosproject.core.ApplicationId; 31 import org.onosproject.core.ApplicationId;
31 import org.onosproject.core.CoreService; 32 import org.onosproject.core.CoreService;
...@@ -102,12 +103,12 @@ public class SingleSwitchFibInstallerTest { ...@@ -102,12 +103,12 @@ public class SingleSwitchFibInstallerTest {
102 private static final InterfaceIpAddress INTF2 = 103 private static final InterfaceIpAddress INTF2 =
103 InterfaceIpAddress.valueOf("192.168.20.2/24"); 104 InterfaceIpAddress.valueOf("192.168.20.2/24");
104 105
105 -
106 private final Set<Interface> interfaces = Sets.newHashSet(); 106 private final Set<Interface> interfaces = Sets.newHashSet();
107 private InterfaceService interfaceService; 107 private InterfaceService interfaceService;
108 private NetworkConfigService networkConfigService; 108 private NetworkConfigService networkConfigService;
109 private NetworkConfigRegistry networkConfigRegistry; 109 private NetworkConfigRegistry networkConfigRegistry;
110 private FlowObjectiveService flowObjectiveService; 110 private FlowObjectiveService flowObjectiveService;
111 + private ApplicationService applicationService;
111 private DeviceService deviceService; 112 private DeviceService deviceService;
112 private static final ApplicationId APPID = TestApplicationId.create("foo"); 113 private static final ApplicationId APPID = TestApplicationId.create("foo");
113 114
...@@ -132,6 +133,8 @@ public class SingleSwitchFibInstallerTest { ...@@ -132,6 +133,8 @@ public class SingleSwitchFibInstallerTest {
132 networkConfigService = createMock(NetworkConfigService.class); 133 networkConfigService = createMock(NetworkConfigService.class);
133 networkConfigRegistry = createMock(NetworkConfigRegistry.class); 134 networkConfigRegistry = createMock(NetworkConfigRegistry.class);
134 flowObjectiveService = createMock(FlowObjectiveService.class); 135 flowObjectiveService = createMock(FlowObjectiveService.class);
136 + applicationService = createNiceMock(ApplicationService.class);
137 + replay(applicationService);
135 deviceService = new TestDeviceService(); 138 deviceService = new TestDeviceService();
136 CoreService coreService = createNiceMock(CoreService.class); 139 CoreService coreService = createNiceMock(CoreService.class);
137 expect(coreService.registerApplication(anyString())).andReturn(APPID).anyTimes(); 140 expect(coreService.registerApplication(anyString())).andReturn(APPID).anyTimes();
...@@ -141,6 +144,7 @@ public class SingleSwitchFibInstallerTest { ...@@ -141,6 +144,7 @@ public class SingleSwitchFibInstallerTest {
141 sSfibInstaller.networkConfigRegistry = networkConfigRegistry; 144 sSfibInstaller.networkConfigRegistry = networkConfigRegistry;
142 sSfibInstaller.interfaceService = interfaceService; 145 sSfibInstaller.interfaceService = interfaceService;
143 sSfibInstaller.flowObjectiveService = flowObjectiveService; 146 sSfibInstaller.flowObjectiveService = flowObjectiveService;
147 + sSfibInstaller.applicationService = applicationService;
144 sSfibInstaller.coreService = coreService; 148 sSfibInstaller.coreService = coreService;
145 sSfibInstaller.routeService = new TestRouteService(); 149 sSfibInstaller.routeService = new TestRouteService();
146 sSfibInstaller.deviceService = deviceService; 150 sSfibInstaller.deviceService = deviceService;
......