gaurav
Committed by Gerrit Code Review

changes for cord-488 and addressed comments

Change-Id: Ic51923f7d5860d9120acadc5ca3716cf5f143dcc
...@@ -47,6 +47,14 @@ ...@@ -47,6 +47,14 @@
47 47
48 <dependency> 48 <dependency>
49 <groupId>org.onosproject</groupId> 49 <groupId>org.onosproject</groupId>
50 + <artifactId>onos-incubator-api</artifactId>
51 + <version>${project.version}</version>
52 + <scope>test</scope>
53 + <classifier>tests</classifier>
54 + </dependency>
55 +
56 + <dependency>
57 + <groupId>org.onosproject</groupId>
50 <artifactId>onos-cli</artifactId> 58 <artifactId>onos-cli</artifactId>
51 <version>${project.version}</version> 59 <version>${project.version}</version>
52 </dependency> 60 </dependency>
......
...@@ -37,6 +37,8 @@ import org.onosproject.cfg.ComponentConfigService; ...@@ -37,6 +37,8 @@ import org.onosproject.cfg.ComponentConfigService;
37 import org.onosproject.core.ApplicationId; 37 import org.onosproject.core.ApplicationId;
38 import org.onosproject.core.CoreService; 38 import org.onosproject.core.CoreService;
39 import org.onosproject.incubator.net.intf.Interface; 39 import org.onosproject.incubator.net.intf.Interface;
40 +import org.onosproject.incubator.net.intf.InterfaceEvent;
41 +import org.onosproject.incubator.net.intf.InterfaceListener;
40 import org.onosproject.incubator.net.intf.InterfaceService; 42 import org.onosproject.incubator.net.intf.InterfaceService;
41 import org.onosproject.net.ConnectPoint; 43 import org.onosproject.net.ConnectPoint;
42 import org.onosproject.net.DeviceId; 44 import org.onosproject.net.DeviceId;
...@@ -139,6 +141,8 @@ public class SingleSwitchFibInstaller { ...@@ -139,6 +141,8 @@ public class SingleSwitchFibInstaller {
139 // Stores FIB updates that are waiting for groups to be set up 141 // Stores FIB updates that are waiting for groups to be set up
140 private final Multimap<NextHopGroupKey, FibEntry> pendingUpdates = HashMultimap.create(); 142 private final Multimap<NextHopGroupKey, FibEntry> pendingUpdates = HashMultimap.create();
141 143
144 + //interface object for event
145 + private InternalInterfaceListener internalInterfaceList = new InternalInterfaceListener();
142 146
143 @Activate 147 @Activate
144 protected void activate(ComponentContext context) { 148 protected void activate(ComponentContext context) {
...@@ -150,6 +154,8 @@ public class SingleSwitchFibInstaller { ...@@ -150,6 +154,8 @@ public class SingleSwitchFibInstaller {
150 deviceListener = new InternalDeviceListener(); 154 deviceListener = new InternalDeviceListener();
151 deviceService.addListener(deviceListener); 155 deviceService.addListener(deviceListener);
152 156
157 + interfaceService.addListener(internalInterfaceList);
158 +
153 routingService.addFibListener(new InternalFibListener()); 159 routingService.addFibListener(new InternalFibListener());
154 routingService.start(); 160 routingService.start();
155 161
...@@ -164,6 +170,8 @@ public class SingleSwitchFibInstaller { ...@@ -164,6 +170,8 @@ public class SingleSwitchFibInstaller {
164 170
165 deviceService.removeListener(deviceListener); 171 deviceService.removeListener(deviceListener);
166 172
173 + interfaceService.removeListener(internalInterfaceList);
174 +
167 //processIntfFilters(false, configService.getInterfaces()); //TODO necessary? 175 //processIntfFilters(false, configService.getInterfaces()); //TODO necessary?
168 176
169 componentConfigService.unregisterProperties(getClass(), false); 177 componentConfigService.unregisterProperties(getClass(), false);
...@@ -393,47 +401,84 @@ public class SingleSwitchFibInstaller { ...@@ -393,47 +401,84 @@ public class SingleSwitchFibInstaller {
393 continue; 401 continue;
394 } 402 }
395 403
396 - FilteringObjective.Builder fob = DefaultFilteringObjective.builder(); 404 + createFilteringObjective(install, intf);
397 - // first add filter for the interface 405 + }
398 - fob.withKey(Criteria.matchInPort(intf.connectPoint().port())) 406 + }
399 - .addCondition(Criteria.matchEthDst(intf.mac()))
400 - .addCondition(Criteria.matchVlanId(intf.vlan()));
401 - fob.withPriority(PRIORITY_OFFSET);
402 - if (intf.vlan() == VlanId.NONE) {
403 - TrafficTreatment tt = DefaultTrafficTreatment.builder()
404 - .pushVlan().setVlanId(VlanId.vlanId(ASSIGNED_VLAN)).build();
405 - fob.withMeta(tt);
406 - }
407 407
408 - fob.permit().fromApp(routerAppId); 408 + //process filtering objective for interface add/remove.
409 + private void processIntfFilter(boolean install, Interface intf) {
410 +
411 + if (!intf.connectPoint().deviceId().equals(deviceId)) {
412 + // Ignore interfaces if they are not on the router switch
413 + return;
414 + }
415 +
416 + createFilteringObjective(install, intf);
417 + }
418 +
419 + //create filtering objective for interface
420 + private void createFilteringObjective(boolean install, Interface intf) {
421 +
422 + FilteringObjective.Builder fob = DefaultFilteringObjective.builder();
423 + // first add filter for the interface
424 + fob.withKey(Criteria.matchInPort(intf.connectPoint().port()))
425 + .addCondition(Criteria.matchEthDst(intf.mac()))
426 + .addCondition(Criteria.matchVlanId(intf.vlan()));
427 + fob.withPriority(PRIORITY_OFFSET);
428 + if (intf.vlan() == VlanId.NONE) {
429 + TrafficTreatment tt = DefaultTrafficTreatment.builder()
430 + .pushVlan().setVlanId(VlanId.vlanId(ASSIGNED_VLAN)).build();
431 + fob.withMeta(tt);
432 + }
433 +
434 + fob.permit().fromApp(routerAppId);
435 + sendFilteringObjective(install, fob, intf);
436 + if (controlPlaneConnectPoint != null) {
437 + // then add the same mac/vlan filters for control-plane connect point
438 + fob.withKey(Criteria.matchInPort(controlPlaneConnectPoint.port()));
409 sendFilteringObjective(install, fob, intf); 439 sendFilteringObjective(install, fob, intf);
410 - if (controlPlaneConnectPoint != null) {
411 - // then add the same mac/vlan filters for control-plane connect point
412 - fob.withKey(Criteria.matchInPort(controlPlaneConnectPoint.port()));
413 - sendFilteringObjective(install, fob, intf);
414 - }
415 } 440 }
416 } 441 }
417 442
418 private void sendFilteringObjective(boolean install, FilteringObjective.Builder fob, 443 private void sendFilteringObjective(boolean install, FilteringObjective.Builder fob,
419 Interface intf) { 444 Interface intf) {
420 - flowObjectiveService.filter( 445 + if (install) {
421 - deviceId, 446 + flowObjectiveService.filter(
422 - fob.add(new ObjectiveContext() { 447 + deviceId,
423 - @Override 448 + fob.add(new ObjectiveContext() {
424 - public void onSuccess(Objective objective) { 449 + @Override
425 - log.info("Successfully installed interface based " 450 + public void onSuccess(Objective objective) {
426 - + "filtering objectives for intf {}", intf); 451 + log.info("Successfully installed interface based "
427 - } 452 + + "filtering objectives for intf {}", intf);
453 + }
428 454
429 - @Override 455 + @Override
430 - public void onError(Objective objective, 456 + public void onError(Objective objective,
431 - ObjectiveError error) { 457 + ObjectiveError error) {
432 - log.error("Failed to install interface filters for intf {}: {}", 458 + log.error("Failed to install interface filters for intf {}: {}",
433 - intf, error); 459 + intf, error);
434 - // TODO something more than just logging 460 + // TODO something more than just logging
435 - } 461 + }
462 + }));
463 + } else {
464 + flowObjectiveService.filter(
465 + deviceId,
466 + fob.remove(new ObjectiveContext() {
467 + @Override
468 + public void onSuccess(Objective objective) {
469 + log.info("Successfully removed interface based "
470 + + "filtering objectives for intf {}", intf);
471 + }
472 +
473 + @Override
474 + public void onError(Objective objective,
475 + ObjectiveError error) {
476 + log.error("Failed to install interface filters for intf {}: {}",
477 + intf, error);
478 + // TODO something more than just logging
479 + }
436 })); 480 }));
481 + }
437 } 482 }
438 483
439 private class InternalFibListener implements FibListener { 484 private class InternalFibListener implements FibListener {
...@@ -497,4 +542,28 @@ public class SingleSwitchFibInstaller { ...@@ -497,4 +542,28 @@ public class SingleSwitchFibInstaller {
497 } 542 }
498 } 543 }
499 } 544 }
545 +
546 + private class InternalInterfaceListener implements InterfaceListener {
547 +
548 + @Override
549 + public void event(InterfaceEvent event) {
550 + Interface intf = event.subject();
551 + switch (event.type()) {
552 + case INTERFACE_ADDED:
553 + if (intf != null) {
554 + processIntfFilter(true, intf);
555 + }
556 + break;
557 + case INTERFACE_UPDATED:
558 + break;
559 + case INTERFACE_REMOVED:
560 + if (intf != null) {
561 + processIntfFilter(false, intf);
562 + }
563 + break;
564 + default:
565 + break;
566 + }
567 + }
568 + }
500 } 569 }
......
...@@ -25,6 +25,7 @@ import static org.easymock.EasyMock.verify; ...@@ -25,6 +25,7 @@ import static org.easymock.EasyMock.verify;
25 import java.util.ArrayList; 25 import java.util.ArrayList;
26 import java.util.Collections; 26 import java.util.Collections;
27 import java.util.Dictionary; 27 import java.util.Dictionary;
28 +import java.util.HashSet;
28 import java.util.List; 29 import java.util.List;
29 import java.util.Set; 30 import java.util.Set;
30 31
...@@ -45,7 +46,9 @@ import org.onosproject.core.CoreServiceAdapter; ...@@ -45,7 +46,9 @@ import org.onosproject.core.CoreServiceAdapter;
45 import org.osgi.service.component.ComponentContext; 46 import org.osgi.service.component.ComponentContext;
46 import org.onosproject.cfg.ComponentConfigService; 47 import org.onosproject.cfg.ComponentConfigService;
47 import org.onosproject.incubator.net.intf.Interface; 48 import org.onosproject.incubator.net.intf.Interface;
49 +import org.onosproject.incubator.net.intf.InterfaceListener;
48 import org.onosproject.incubator.net.intf.InterfaceService; 50 import org.onosproject.incubator.net.intf.InterfaceService;
51 +import org.onosproject.incubator.net.intf.InterfaceServiceAdapter;
49 import org.onosproject.net.ConnectPoint; 52 import org.onosproject.net.ConnectPoint;
50 import org.onosproject.net.DeviceId; 53 import org.onosproject.net.DeviceId;
51 import org.onosproject.net.PortNumber; 54 import org.onosproject.net.PortNumber;
...@@ -70,7 +73,6 @@ import org.onosproject.routing.FibUpdate; ...@@ -70,7 +73,6 @@ import org.onosproject.routing.FibUpdate;
70 import org.onosproject.routing.RoutingService; 73 import org.onosproject.routing.RoutingService;
71 import org.onosproject.routing.RoutingServiceAdapter; 74 import org.onosproject.routing.RoutingServiceAdapter;
72 import org.onosproject.routing.config.RouterConfig; 75 import org.onosproject.routing.config.RouterConfig;
73 -
74 import com.google.common.collect.ImmutableSet; 76 import com.google.common.collect.ImmutableSet;
75 import com.google.common.collect.Sets; 77 import com.google.common.collect.Sets;
76 78
...@@ -108,7 +110,8 @@ public class SingleSwitchFibInstallerTest extends AbstractIntentTest { ...@@ -108,7 +110,8 @@ public class SingleSwitchFibInstallerTest extends AbstractIntentTest {
108 private CoreService coreService; 110 private CoreService coreService;
109 private RouterConfig routerConfig; 111 private RouterConfig routerConfig;
110 private RoutingService routingService; 112 private RoutingService routingService;
111 - SingleSwitchFibInstaller sSfibInstaller; 113 + private SingleSwitchFibInstaller sSfibInstaller;
114 + private InterfaceListener interfaceListener;
112 115
113 @Before 116 @Before
114 public void setUp() throws Exception { 117 public void setUp() throws Exception {
...@@ -135,7 +138,8 @@ public class SingleSwitchFibInstallerTest extends AbstractIntentTest { ...@@ -135,7 +138,8 @@ public class SingleSwitchFibInstallerTest extends AbstractIntentTest {
135 coreService = new TestCoreService(); 138 coreService = new TestCoreService();
136 routingService = new TestRoutingService(); 139 routingService = new TestRoutingService();
137 routerConfig = new TestRouterConfig(); 140 routerConfig = new TestRouterConfig();
138 - interfaceService = createMock(InterfaceService.class); 141 + //interfaceService = createMock(InterfaceService.class);
142 + interfaceService = new TestInterfaceService();
139 networkConfigService = createMock(NetworkConfigService.class); 143 networkConfigService = createMock(NetworkConfigService.class);
140 flowObjectiveService = createMock(FlowObjectiveService.class); 144 flowObjectiveService = createMock(FlowObjectiveService.class);
141 deviceService = new TestDeviceService(); 145 deviceService = new TestDeviceService();
...@@ -158,7 +162,7 @@ public class SingleSwitchFibInstallerTest extends AbstractIntentTest { ...@@ -158,7 +162,7 @@ public class SingleSwitchFibInstallerTest extends AbstractIntentTest {
158 private void setUpInterfaceService() { 162 private void setUpInterfaceService() {
159 Set<InterfaceIpAddress> interfaceIpAddresses1 = Sets.newHashSet(); 163 Set<InterfaceIpAddress> interfaceIpAddresses1 = Sets.newHashSet();
160 interfaceIpAddresses1.add(new InterfaceIpAddress( 164 interfaceIpAddresses1.add(new InterfaceIpAddress(
161 - IpAddress.valueOf("192.168.10.101"), 165 + IpAddress.valueOf("192.168.10.1"),
162 IpPrefix.valueOf("192.168.10.0/24"))); 166 IpPrefix.valueOf("192.168.10.0/24")));
163 Interface sw1Eth1 = new Interface(SW1_ETH1.deviceId().toString(), SW1_ETH1, 167 Interface sw1Eth1 = new Interface(SW1_ETH1.deviceId().toString(), SW1_ETH1,
164 interfaceIpAddresses1, MacAddress.valueOf("00:00:00:00:00:01"), 168 interfaceIpAddresses1, MacAddress.valueOf("00:00:00:00:00:01"),
...@@ -166,7 +170,7 @@ public class SingleSwitchFibInstallerTest extends AbstractIntentTest { ...@@ -166,7 +170,7 @@ public class SingleSwitchFibInstallerTest extends AbstractIntentTest {
166 interfaces.add(sw1Eth1); 170 interfaces.add(sw1Eth1);
167 171
168 Set<InterfaceIpAddress> interfaceIpAddresses2 = Sets.newHashSet(); 172 Set<InterfaceIpAddress> interfaceIpAddresses2 = Sets.newHashSet();
169 - interfaceIpAddresses2.add(new InterfaceIpAddress(IpAddress.valueOf("192.168.20.101"), 173 + interfaceIpAddresses2.add(new InterfaceIpAddress(IpAddress.valueOf("192.168.20.1"),
170 IpPrefix.valueOf("192.168.20.0/24"))); 174 IpPrefix.valueOf("192.168.20.0/24")));
171 Interface sw2Eth1 = new Interface(SW2_ETH1.deviceId().toString(), SW2_ETH1, 175 Interface sw2Eth1 = new Interface(SW2_ETH1.deviceId().toString(), SW2_ETH1,
172 interfaceIpAddresses2, MacAddress.valueOf("00:00:00:00:00:02"), 176 interfaceIpAddresses2, MacAddress.valueOf("00:00:00:00:00:02"),
...@@ -182,35 +186,14 @@ public class SingleSwitchFibInstallerTest extends AbstractIntentTest { ...@@ -182,35 +186,14 @@ public class SingleSwitchFibInstallerTest extends AbstractIntentTest {
182 interfaces.add(sw3Eth1); 186 interfaces.add(sw3Eth1);
183 187
184 InterfaceIpAddress interfaceIpAddress4 = 188 InterfaceIpAddress interfaceIpAddress4 =
185 - new InterfaceIpAddress(IpAddress.valueOf("192.168.40.101"), 189 + new InterfaceIpAddress(IpAddress.valueOf("192.168.40.1"),
186 IpPrefix.valueOf("192.168.40.0/24")); 190 IpPrefix.valueOf("192.168.40.0/24"));
187 191
188 Interface sw4Eth1 = new Interface(SW4_ETH1.deviceId().toString(), SW4_ETH1, 192 Interface sw4Eth1 = new Interface(SW4_ETH1.deviceId().toString(), SW4_ETH1,
189 Sets.newHashSet(interfaceIpAddress4), 193 Sets.newHashSet(interfaceIpAddress4),
190 MacAddress.valueOf("00:00:00:00:00:04"), 194 MacAddress.valueOf("00:00:00:00:00:04"),
191 VlanId.vlanId((short) 1)); 195 VlanId.vlanId((short) 1));
192 -
193 - expect(interfaceService.getInterfacesByPort(SW4_ETH1)).andReturn(
194 - Collections.singleton(sw4Eth1)).anyTimes();
195 - expect(interfaceService.getMatchingInterface(Ip4Address.valueOf("192.168.40.1")))
196 - .andReturn(sw4Eth1).anyTimes();
197 -
198 interfaces.add(sw4Eth1); 196 interfaces.add(sw4Eth1);
199 -
200 - expect(interfaceService.getInterfacesByPort(SW1_ETH1)).andReturn(
201 - Collections.singleton(sw1Eth1)).anyTimes();
202 - expect(interfaceService.getMatchingInterface(Ip4Address.valueOf("192.168.10.1")))
203 - .andReturn(sw1Eth1).anyTimes();
204 - expect(interfaceService.getInterfacesByPort(SW2_ETH1)).andReturn(
205 - Collections.singleton(sw2Eth1)).anyTimes();
206 - expect(interfaceService.getMatchingInterface(Ip4Address.valueOf("192.168.20.1")))
207 - .andReturn(sw2Eth1).anyTimes();
208 - expect(interfaceService.getInterfacesByPort(SW3_ETH1)).andReturn(
209 - Collections.singleton(sw3Eth1)).anyTimes();
210 - expect(interfaceService.getMatchingInterface(Ip4Address.valueOf("192.168.30.1")))
211 - .andReturn(sw3Eth1).anyTimes();
212 - expect(interfaceService.getInterfaces()).andReturn(interfaces).anyTimes();
213 - replay(interfaceService);
214 } 197 }
215 198
216 /* 199 /*
...@@ -482,6 +465,47 @@ public class SingleSwitchFibInstallerTest extends AbstractIntentTest { ...@@ -482,6 +465,47 @@ public class SingleSwitchFibInstallerTest extends AbstractIntentTest {
482 verify(flowObjectiveService); 465 verify(flowObjectiveService);
483 } 466 }
484 467
468 + private class TestInterfaceService extends InterfaceServiceAdapter {
469 +
470 + @Override
471 + public void addListener(InterfaceListener listener) {
472 + SingleSwitchFibInstallerTest.this.interfaceListener = listener;
473 + }
474 +
475 + @Override
476 + public Set<Interface> getInterfaces() {
477 + return interfaces;
478 + }
479 +
480 + @Override
481 + public Set<Interface> getInterfacesByPort(ConnectPoint port) {
482 +
483 + Set<Interface> setIntf = new HashSet<Interface>();
484 + for (Interface intf : interfaces) {
485 + if (intf.connectPoint().equals(port)) {
486 + setIntf.add(intf);
487 +
488 + }
489 + }
490 + return setIntf;
491 + }
492 +
493 + @Override
494 + public Interface getMatchingInterface(IpAddress ip) {
495 + Interface intff = null;
496 + for (Interface intf : interfaces) {
497 + for (InterfaceIpAddress address : intf.ipAddresses()) {
498 + if (address.ipAddress().equals(ip)) {
499 + intff = intf;
500 + break;
501 + }
502 + }
503 + }
504 +
505 + return intff;
506 + }
507 + }
508 +
485 private class TestCoreService extends CoreServiceAdapter { 509 private class TestCoreService extends CoreServiceAdapter {
486 510
487 @Override 511 @Override
......