blob: 3f44a016ee38a6ae466c733fe8716d834e116319 [file] [log] [blame]
Jonathan Hart9a426f82015-09-03 15:43:13 +02001/*
Brian O'Connor0a4e6742016-09-15 23:03:10 -07002 * Copyright 2016-present Open Networking Laboratory
Jonathan Hart9a426f82015-09-03 15:43:13 +02003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package org.onosproject.sdnip;
18
Jonathan Hart00cddda2016-02-16 10:30:37 -080019import com.google.common.collect.Lists;
Jonathan Hart9a426f82015-09-03 15:43:13 +020020import com.google.common.collect.Sets;
21import org.junit.Before;
22import org.junit.Test;
23import org.onlab.packet.Ethernet;
24import org.onlab.packet.Ip4Address;
25import org.onlab.packet.Ip4Prefix;
Jonathan Hart9a426f82015-09-03 15:43:13 +020026import org.onlab.packet.IpPrefix;
27import org.onlab.packet.MacAddress;
28import org.onlab.packet.VlanId;
29import org.onosproject.TestApplicationId;
30import org.onosproject.core.ApplicationId;
Jonathan Hart365335e2015-12-10 11:09:53 -080031import org.onosproject.core.CoreServiceAdapter;
Jonathan Hart9a426f82015-09-03 15:43:13 +020032import org.onosproject.incubator.net.intf.Interface;
Jonathan Hartb14221c2016-03-07 09:55:50 -080033import org.onosproject.incubator.net.intf.InterfaceEvent;
34import org.onosproject.incubator.net.intf.InterfaceListener;
Jonathan Hart9a426f82015-09-03 15:43:13 +020035import org.onosproject.incubator.net.intf.InterfaceService;
Jonathan Hartb14221c2016-03-07 09:55:50 -080036import org.onosproject.incubator.net.intf.InterfaceServiceAdapter;
Jonathan Harta2eb9ff2016-04-13 21:27:06 -070037import org.onosproject.incubator.net.routing.ResolvedRoute;
38import org.onosproject.incubator.net.routing.RouteEvent;
39import org.onosproject.incubator.net.routing.RouteListener;
40import org.onosproject.incubator.net.routing.RouteServiceAdapter;
Jonathan Hart9a426f82015-09-03 15:43:13 +020041import org.onosproject.net.ConnectPoint;
42import org.onosproject.net.DeviceId;
43import org.onosproject.net.PortNumber;
44import org.onosproject.net.flow.DefaultTrafficSelector;
45import org.onosproject.net.flow.DefaultTrafficTreatment;
46import org.onosproject.net.flow.TrafficSelector;
47import org.onosproject.net.flow.TrafficTreatment;
48import org.onosproject.net.host.InterfaceIpAddress;
49import org.onosproject.net.intent.AbstractIntentTest;
50import org.onosproject.net.intent.Key;
51import org.onosproject.net.intent.MultiPointToSinglePointIntent;
Jonathan Hart9a426f82015-09-03 15:43:13 +020052import org.onosproject.routing.IntentSynchronizationService;
Jonathan Hart9a426f82015-09-03 15:43:13 +020053
54import java.util.Collections;
Jonathan Hart9a426f82015-09-03 15:43:13 +020055import java.util.HashSet;
Jonathan Hart00cddda2016-02-16 10:30:37 -080056import java.util.List;
Jonathan Hart9a426f82015-09-03 15:43:13 +020057import java.util.Set;
58
Jonathan Hartb14221c2016-03-07 09:55:50 -080059import static org.easymock.EasyMock.anyObject;
Jonathan Hart9a426f82015-09-03 15:43:13 +020060import static org.easymock.EasyMock.createMock;
61import static org.easymock.EasyMock.expect;
Jonathan Hartb14221c2016-03-07 09:55:50 -080062import static org.easymock.EasyMock.expectLastCall;
Jonathan Hart9a426f82015-09-03 15:43:13 +020063import static org.easymock.EasyMock.replay;
64import static org.easymock.EasyMock.reset;
65import static org.easymock.EasyMock.verify;
Jonathan Hart33b81f22016-02-05 09:25:50 -080066import static org.onosproject.routing.TestIntentServiceHelper.eqExceptId;
Jonathan Hart9a426f82015-09-03 15:43:13 +020067
68/**
69 * Unit tests for SdnIpFib.
70 */
Luca Preted814e212016-05-23 10:06:01 -070071public class SdnIpFibNoVlansTest extends AbstractIntentTest {
Jonathan Hart9a426f82015-09-03 15:43:13 +020072
Jonathan Hart9a426f82015-09-03 15:43:13 +020073 private InterfaceService interfaceService;
74
75 private static final ConnectPoint SW1_ETH1 = new ConnectPoint(
76 DeviceId.deviceId("of:0000000000000001"),
77 PortNumber.portNumber(1));
78
79 private static final ConnectPoint SW2_ETH1 = new ConnectPoint(
80 DeviceId.deviceId("of:0000000000000002"),
81 PortNumber.portNumber(1));
82
Luca Pretee9511512016-05-13 10:30:19 -070083 private static final ConnectPoint SW3_ETH1 = new ConnectPoint(
84 DeviceId.deviceId("of:0000000000000003"),
Jonathan Hart9a426f82015-09-03 15:43:13 +020085 PortNumber.portNumber(1));
86
Luca Pretee9511512016-05-13 10:30:19 -070087 private static final ConnectPoint SW4_ETH1 = new ConnectPoint(
88 DeviceId.deviceId("of:0000000000000004"),
Jonathan Hartb14221c2016-03-07 09:55:50 -080089 PortNumber.portNumber(1));
90
Jonathan Harta2eb9ff2016-04-13 21:27:06 -070091 private static final IpPrefix PREFIX1 = Ip4Prefix.valueOf("1.1.1.0/24");
92
Jonathan Hart9a426f82015-09-03 15:43:13 +020093 private SdnIpFib sdnipFib;
94 private IntentSynchronizationService intentSynchronizer;
95 private final Set<Interface> interfaces = Sets.newHashSet();
96
97 private static final ApplicationId APPID = TestApplicationId.create("SDNIP");
98
Jonathan Harta2eb9ff2016-04-13 21:27:06 -070099 private RouteListener routeListener;
Jonathan Hartb14221c2016-03-07 09:55:50 -0800100 private InterfaceListener interfaceListener;
Jonathan Hart365335e2015-12-10 11:09:53 -0800101
Jonathan Hart9a426f82015-09-03 15:43:13 +0200102 @Before
103 public void setUp() throws Exception {
104 super.setUp();
105
Jonathan Hart9a426f82015-09-03 15:43:13 +0200106 interfaceService = createMock(InterfaceService.class);
Luca Pretee9511512016-05-13 10:30:19 -0700107
Jonathan Hartb14221c2016-03-07 09:55:50 -0800108 interfaceService.addListener(anyObject(InterfaceListener.class));
109 expectLastCall().andDelegateTo(new InterfaceServiceDelegate());
Jonathan Hart9a426f82015-09-03 15:43:13 +0200110
111 // These will set expectations on routingConfig and interfaceService
112 setUpInterfaceService();
Jonathan Hart9a426f82015-09-03 15:43:13 +0200113
Jonathan Hart9a426f82015-09-03 15:43:13 +0200114 replay(interfaceService);
115
116 intentSynchronizer = createMock(IntentSynchronizationService.class);
117
Jonathan Hart365335e2015-12-10 11:09:53 -0800118 sdnipFib = new SdnIpFib();
Jonathan Harta2eb9ff2016-04-13 21:27:06 -0700119 sdnipFib.routeService = new TestRouteService();
Jonathan Hart365335e2015-12-10 11:09:53 -0800120 sdnipFib.coreService = new TestCoreService();
121 sdnipFib.interfaceService = interfaceService;
122 sdnipFib.intentSynchronizer = intentSynchronizer;
123
124 sdnipFib.activate();
Jonathan Hart9a426f82015-09-03 15:43:13 +0200125 }
126
127 /**
Luca Pretee9511512016-05-13 10:30:19 -0700128 * Sets up the interface service.
Jonathan Hart9a426f82015-09-03 15:43:13 +0200129 */
130 private void setUpInterfaceService() {
Jonathan Hart00cddda2016-02-16 10:30:37 -0800131 List<InterfaceIpAddress> interfaceIpAddresses1 = Lists.newArrayList();
Jonathan Harta2eb9ff2016-04-13 21:27:06 -0700132 interfaceIpAddresses1.add(InterfaceIpAddress.valueOf("192.168.10.101/24"));
Jonathan Hartb14221c2016-03-07 09:55:50 -0800133 Interface sw1Eth1 = new Interface("sw1-eth1", SW1_ETH1,
Luca Pretee9511512016-05-13 10:30:19 -0700134 interfaceIpAddresses1, MacAddress.valueOf("00:00:00:00:00:01"),
135 VlanId.NONE);
Jonathan Hart9a426f82015-09-03 15:43:13 +0200136 interfaces.add(sw1Eth1);
137
Jonathan Hart00cddda2016-02-16 10:30:37 -0800138 List<InterfaceIpAddress> interfaceIpAddresses2 = Lists.newArrayList();
Jonathan Harta2eb9ff2016-04-13 21:27:06 -0700139 interfaceIpAddresses2.add(InterfaceIpAddress.valueOf("192.168.20.101/24"));
Jonathan Hartb14221c2016-03-07 09:55:50 -0800140 Interface sw2Eth1 = new Interface("sw2-eth1", SW2_ETH1,
Luca Pretee9511512016-05-13 10:30:19 -0700141 interfaceIpAddresses2, MacAddress.valueOf("00:00:00:00:00:02"),
142 VlanId.NONE);
Jonathan Hart9a426f82015-09-03 15:43:13 +0200143 interfaces.add(sw2Eth1);
144
Luca Pretee9511512016-05-13 10:30:19 -0700145 InterfaceIpAddress interfaceIpAddress3 = InterfaceIpAddress.valueOf("192.168.30.101/24");
146 Interface sw3Eth1 = new Interface("sw3-eth1", SW3_ETH1,
147 Lists.newArrayList(interfaceIpAddress3),
148 MacAddress.valueOf("00:00:00:00:00:03"),
149 VlanId.NONE);
150 interfaces.add(sw3Eth1);
Jonathan Hart9a426f82015-09-03 15:43:13 +0200151
152 expect(interfaceService.getInterfacesByPort(SW1_ETH1)).andReturn(
153 Collections.singleton(sw1Eth1)).anyTimes();
154 expect(interfaceService.getMatchingInterface(Ip4Address.valueOf("192.168.10.1")))
155 .andReturn(sw1Eth1).anyTimes();
156 expect(interfaceService.getInterfacesByPort(SW2_ETH1)).andReturn(
157 Collections.singleton(sw2Eth1)).anyTimes();
158 expect(interfaceService.getMatchingInterface(Ip4Address.valueOf("192.168.20.1")))
159 .andReturn(sw2Eth1).anyTimes();
Luca Pretee9511512016-05-13 10:30:19 -0700160 expect(interfaceService.getInterfacesByPort(SW3_ETH1)).andReturn(
161 Collections.singleton(sw3Eth1)).anyTimes();
162 expect(interfaceService.getMatchingInterface(Ip4Address.valueOf("192.168.30.1")))
163 .andReturn(sw3Eth1).anyTimes();
Jonathan Hart9a426f82015-09-03 15:43:13 +0200164 expect(interfaceService.getInterfaces()).andReturn(interfaces).anyTimes();
165 }
166
167 /**
Luca Pretee9511512016-05-13 10:30:19 -0700168 * Tests adding a route. All interfaces have no VLAN Ids configured.
Jonathan Hart9a426f82015-09-03 15:43:13 +0200169 *
170 * We verify that the synchronizer records the correct state and that the
171 * correct intent is submitted to the IntentService.
172 */
173 @Test
Luca Pretee9511512016-05-13 10:30:19 -0700174 public void testRouteAddNoVlans() {
Jonathan Harta2eb9ff2016-04-13 21:27:06 -0700175 ResolvedRoute route = new ResolvedRoute(PREFIX1,
Luca Pretee9511512016-05-13 10:30:19 -0700176 Ip4Address.valueOf("192.168.30.1"),
177 MacAddress.valueOf("00:00:00:00:00:03"));
Jonathan Hart9a426f82015-09-03 15:43:13 +0200178
179 // Construct a MultiPointToSinglePointIntent intent
180 TrafficSelector.Builder selectorBuilder =
181 DefaultTrafficSelector.builder();
Jonathan Harta2eb9ff2016-04-13 21:27:06 -0700182 selectorBuilder.matchEthType(Ethernet.TYPE_IPV4).matchIPDst(PREFIX1);
Jonathan Hart9a426f82015-09-03 15:43:13 +0200183
184 TrafficTreatment.Builder treatmentBuilder =
185 DefaultTrafficTreatment.builder();
Luca Pretee9511512016-05-13 10:30:19 -0700186 treatmentBuilder.setEthDst(MacAddress.valueOf("00:00:00:00:00:03"));
Jonathan Hart9a426f82015-09-03 15:43:13 +0200187
188 Set<ConnectPoint> ingressPoints = new HashSet<>();
189 ingressPoints.add(SW1_ETH1);
190 ingressPoints.add(SW2_ETH1);
Jonathan Hart9a426f82015-09-03 15:43:13 +0200191
192 MultiPointToSinglePointIntent intent =
193 MultiPointToSinglePointIntent.builder()
194 .appId(APPID)
Jonathan Harta2eb9ff2016-04-13 21:27:06 -0700195 .key(Key.of(PREFIX1.toString(), APPID))
Jonathan Hart9a426f82015-09-03 15:43:13 +0200196 .selector(selectorBuilder.build())
197 .treatment(treatmentBuilder.build())
198 .ingressPoints(ingressPoints)
Luca Pretee9511512016-05-13 10:30:19 -0700199 .egressPoint(SW3_ETH1)
Jonathan Hart9a426f82015-09-03 15:43:13 +0200200 .constraints(SdnIpFib.CONSTRAINTS)
201 .build();
202
203 // Setup the expected intents
204 intentSynchronizer.submit(eqExceptId(intent));
Jonathan Hart9a426f82015-09-03 15:43:13 +0200205 replay(intentSynchronizer);
206
Jonathan Harta2eb9ff2016-04-13 21:27:06 -0700207 // Send in the added event
208 routeListener.event(new RouteEvent(RouteEvent.Type.ROUTE_ADDED, route));
Jonathan Hart9a426f82015-09-03 15:43:13 +0200209
210 verify(intentSynchronizer);
211 }
212
213 /**
Jonathan Harta2eb9ff2016-04-13 21:27:06 -0700214 * Tests updating a route.
Jonathan Hart9a426f82015-09-03 15:43:13 +0200215 *
216 * We verify that the synchronizer records the correct state and that the
217 * correct intent is submitted to the IntentService.
218 */
219 @Test
Jonathan Harta2eb9ff2016-04-13 21:27:06 -0700220 public void testRouteUpdate() {
Luca Pretee9511512016-05-13 10:30:19 -0700221 // Add a route first
222 testRouteAddNoVlans();
Jonathan Hart9a426f82015-09-03 15:43:13 +0200223
224 // Start to construct a new route entry and new intent
Jonathan Harta2eb9ff2016-04-13 21:27:06 -0700225 ResolvedRoute route = new ResolvedRoute(PREFIX1,
Jonathan Hart9a426f82015-09-03 15:43:13 +0200226 Ip4Address.valueOf("192.168.20.1"),
227 MacAddress.valueOf("00:00:00:00:00:02"));
228
229 // Construct a new MultiPointToSinglePointIntent intent
230 TrafficSelector.Builder selectorBuilderNew =
231 DefaultTrafficSelector.builder();
Jonathan Harta2eb9ff2016-04-13 21:27:06 -0700232 selectorBuilderNew.matchEthType(Ethernet.TYPE_IPV4).matchIPDst(PREFIX1);
Jonathan Hart9a426f82015-09-03 15:43:13 +0200233
234 TrafficTreatment.Builder treatmentBuilderNew =
235 DefaultTrafficTreatment.builder();
236 treatmentBuilderNew.setEthDst(MacAddress.valueOf("00:00:00:00:00:02"));
237
238 Set<ConnectPoint> ingressPointsNew = new HashSet<>();
239 ingressPointsNew.add(SW1_ETH1);
Luca Pretee9511512016-05-13 10:30:19 -0700240 ingressPointsNew.add(SW3_ETH1);
Jonathan Hart9a426f82015-09-03 15:43:13 +0200241
242 MultiPointToSinglePointIntent intentNew =
243 MultiPointToSinglePointIntent.builder()
244 .appId(APPID)
Jonathan Harta2eb9ff2016-04-13 21:27:06 -0700245 .key(Key.of(PREFIX1.toString(), APPID))
Jonathan Hart9a426f82015-09-03 15:43:13 +0200246 .selector(selectorBuilderNew.build())
247 .treatment(treatmentBuilderNew.build())
248 .ingressPoints(ingressPointsNew)
249 .egressPoint(SW2_ETH1)
250 .constraints(SdnIpFib.CONSTRAINTS)
251 .build();
252
253 // Set up test expectation
254 reset(intentSynchronizer);
255
256 // Setup the expected intents
257 intentSynchronizer.submit(eqExceptId(intentNew));
258 replay(intentSynchronizer);
259
Jonathan Harta2eb9ff2016-04-13 21:27:06 -0700260 // Send in the update event
261 routeListener.event(new RouteEvent(RouteEvent.Type.ROUTE_UPDATED, route));
Jonathan Hart9a426f82015-09-03 15:43:13 +0200262
263 verify(intentSynchronizer);
264 }
265
266 /**
Jonathan Harta2eb9ff2016-04-13 21:27:06 -0700267 * Tests deleting a route.
Jonathan Hart9a426f82015-09-03 15:43:13 +0200268 *
269 * We verify that the synchronizer records the correct state and that the
270 * correct intent is withdrawn from the IntentService.
271 */
272 @Test
Jonathan Harta2eb9ff2016-04-13 21:27:06 -0700273 public void testRouteDelete() {
Luca Pretee9511512016-05-13 10:30:19 -0700274 // Add a route first
275 testRouteAddNoVlans();
Jonathan Hart9a426f82015-09-03 15:43:13 +0200276
277 // Construct the existing route entry
Jonathan Harta2eb9ff2016-04-13 21:27:06 -0700278 ResolvedRoute route = new ResolvedRoute(PREFIX1, null, null);
Jonathan Hart9a426f82015-09-03 15:43:13 +0200279
280 // Construct the existing MultiPointToSinglePoint intent
281 TrafficSelector.Builder selectorBuilder =
282 DefaultTrafficSelector.builder();
Jonathan Harta2eb9ff2016-04-13 21:27:06 -0700283 selectorBuilder.matchEthType(Ethernet.TYPE_IPV4).matchIPDst(PREFIX1);
Jonathan Hart9a426f82015-09-03 15:43:13 +0200284
285 TrafficTreatment.Builder treatmentBuilder =
286 DefaultTrafficTreatment.builder();
Luca Pretee9511512016-05-13 10:30:19 -0700287 treatmentBuilder.setEthDst(MacAddress.valueOf("00:00:00:00:00:03"));
Jonathan Hart9a426f82015-09-03 15:43:13 +0200288
289 Set<ConnectPoint> ingressPoints = new HashSet<>();
Luca Pretee9511512016-05-13 10:30:19 -0700290 ingressPoints.add(SW1_ETH1);
Jonathan Hart9a426f82015-09-03 15:43:13 +0200291 ingressPoints.add(SW2_ETH1);
Jonathan Hart9a426f82015-09-03 15:43:13 +0200292
293 MultiPointToSinglePointIntent addedIntent =
294 MultiPointToSinglePointIntent.builder()
295 .appId(APPID)
Jonathan Harta2eb9ff2016-04-13 21:27:06 -0700296 .key(Key.of(PREFIX1.toString(), APPID))
Jonathan Hart9a426f82015-09-03 15:43:13 +0200297 .selector(selectorBuilder.build())
298 .treatment(treatmentBuilder.build())
299 .ingressPoints(ingressPoints)
Luca Pretee9511512016-05-13 10:30:19 -0700300 .egressPoint(SW3_ETH1)
Jonathan Hart9a426f82015-09-03 15:43:13 +0200301 .constraints(SdnIpFib.CONSTRAINTS)
302 .build();
303
304 // Set up expectation
305 reset(intentSynchronizer);
306 // Setup the expected intents
307 intentSynchronizer.withdraw(eqExceptId(addedIntent));
308 replay(intentSynchronizer);
309
Jonathan Harta2eb9ff2016-04-13 21:27:06 -0700310 // Send in the removed event
311 routeListener.event(new RouteEvent(RouteEvent.Type.ROUTE_REMOVED, route));
Jonathan Hart9a426f82015-09-03 15:43:13 +0200312
313 verify(intentSynchronizer);
314 }
Jonathan Hart365335e2015-12-10 11:09:53 -0800315
Jonathan Hartb14221c2016-03-07 09:55:50 -0800316 @Test
317 public void testAddInterface() {
Luca Pretee9511512016-05-13 10:30:19 -0700318 // Add a route first
319 testRouteAddNoVlans();
Jonathan Hartb14221c2016-03-07 09:55:50 -0800320
321 // Construct the existing MultiPointToSinglePoint intent
322 TrafficSelector.Builder selectorBuilder =
323 DefaultTrafficSelector.builder();
Jonathan Harta2eb9ff2016-04-13 21:27:06 -0700324 selectorBuilder.matchEthType(Ethernet.TYPE_IPV4).matchIPDst(PREFIX1);
Jonathan Hartb14221c2016-03-07 09:55:50 -0800325
326 TrafficTreatment.Builder treatmentBuilder =
327 DefaultTrafficTreatment.builder();
Luca Pretee9511512016-05-13 10:30:19 -0700328 treatmentBuilder.setEthDst(MacAddress.valueOf("00:00:00:00:00:03"));
Jonathan Hartb14221c2016-03-07 09:55:50 -0800329
330 Set<ConnectPoint> ingressPoints = new HashSet<>();
Luca Pretee9511512016-05-13 10:30:19 -0700331 ingressPoints.add(SW1_ETH1);
Jonathan Hartb14221c2016-03-07 09:55:50 -0800332 ingressPoints.add(SW2_ETH1);
Jonathan Hartb14221c2016-03-07 09:55:50 -0800333 ingressPoints.add(SW4_ETH1);
Jonathan Hartb14221c2016-03-07 09:55:50 -0800334
335 MultiPointToSinglePointIntent addedIntent =
336 MultiPointToSinglePointIntent.builder()
337 .appId(APPID)
Jonathan Harta2eb9ff2016-04-13 21:27:06 -0700338 .key(Key.of(PREFIX1.toString(), APPID))
Jonathan Hartb14221c2016-03-07 09:55:50 -0800339 .selector(selectorBuilder.build())
340 .treatment(treatmentBuilder.build())
341 .ingressPoints(ingressPoints)
Luca Pretee9511512016-05-13 10:30:19 -0700342 .egressPoint(SW3_ETH1)
Jonathan Hartb14221c2016-03-07 09:55:50 -0800343 .constraints(SdnIpFib.CONSTRAINTS)
344 .build();
345
346 reset(intentSynchronizer);
347
348 intentSynchronizer.submit(eqExceptId(addedIntent));
349 expectLastCall().once();
350
351 replay(intentSynchronizer);
352
Luca Pretee9511512016-05-13 10:30:19 -0700353 Interface intf = new Interface("sw4-eth1", SW4_ETH1,
354 Collections.singletonList(InterfaceIpAddress.valueOf("192.168.40.101/24")),
355 MacAddress.valueOf("00:00:00:00:00:04"), VlanId.NONE);
Jonathan Hartb14221c2016-03-07 09:55:50 -0800356 InterfaceEvent intfEvent = new InterfaceEvent(InterfaceEvent.Type.INTERFACE_ADDED, intf);
357 interfaceListener.event(intfEvent);
358
359 verify(intentSynchronizer);
360 }
361
362 @Test
363 public void testRemoveInterface() {
Luca Pretee9511512016-05-13 10:30:19 -0700364 // Add a route first
365 testRouteAddNoVlans();
Jonathan Hartb14221c2016-03-07 09:55:50 -0800366
367 // Construct the existing MultiPointToSinglePoint intent
368 TrafficSelector.Builder selectorBuilder =
369 DefaultTrafficSelector.builder();
Jonathan Harta2eb9ff2016-04-13 21:27:06 -0700370 selectorBuilder.matchEthType(Ethernet.TYPE_IPV4).matchIPDst(PREFIX1);
Jonathan Hartb14221c2016-03-07 09:55:50 -0800371
372 TrafficTreatment.Builder treatmentBuilder =
373 DefaultTrafficTreatment.builder();
Luca Pretee9511512016-05-13 10:30:19 -0700374 treatmentBuilder.setEthDst(MacAddress.valueOf("00:00:00:00:00:03"));
Jonathan Hartb14221c2016-03-07 09:55:50 -0800375
376 Set<ConnectPoint> ingressPoints = new HashSet<>();
377 ingressPoints.add(SW2_ETH1);
Jonathan Hartb14221c2016-03-07 09:55:50 -0800378
379 MultiPointToSinglePointIntent addedIntent =
380 MultiPointToSinglePointIntent.builder()
381 .appId(APPID)
Jonathan Harta2eb9ff2016-04-13 21:27:06 -0700382 .key(Key.of(PREFIX1.toString(), APPID))
Jonathan Hartb14221c2016-03-07 09:55:50 -0800383 .selector(selectorBuilder.build())
384 .treatment(treatmentBuilder.build())
385 .ingressPoints(ingressPoints)
Luca Pretee9511512016-05-13 10:30:19 -0700386 .egressPoint(SW3_ETH1)
Jonathan Hartb14221c2016-03-07 09:55:50 -0800387 .constraints(SdnIpFib.CONSTRAINTS)
388 .build();
389
390 reset(intentSynchronizer);
391
392 intentSynchronizer.submit(eqExceptId(addedIntent));
393 expectLastCall().once();
394
395 replay(intentSynchronizer);
396
Luca Pretee9511512016-05-13 10:30:19 -0700397 Interface intf = new Interface("sw1-eth1", SW1_ETH1,
398 Collections.singletonList(InterfaceIpAddress.valueOf("192.168.10.101/24")),
399 MacAddress.valueOf("00:00:00:00:00:01"), VlanId.NONE);
Jonathan Hartb14221c2016-03-07 09:55:50 -0800400 InterfaceEvent intfEvent = new InterfaceEvent(InterfaceEvent.Type.INTERFACE_REMOVED, intf);
401 interfaceListener.event(intfEvent);
402
403 verify(intentSynchronizer);
404 }
405
Jonathan Hart365335e2015-12-10 11:09:53 -0800406 private class TestCoreService extends CoreServiceAdapter {
407 @Override
408 public ApplicationId getAppId(String name) {
409 return APPID;
410 }
411 }
412
Jonathan Harta2eb9ff2016-04-13 21:27:06 -0700413 private class TestRouteService extends RouteServiceAdapter {
Jonathan Hart365335e2015-12-10 11:09:53 -0800414 @Override
Jonathan Harta2eb9ff2016-04-13 21:27:06 -0700415 public void addListener(RouteListener routeListener) {
Luca Preted814e212016-05-23 10:06:01 -0700416 SdnIpFibNoVlansTest.this.routeListener = routeListener;
Jonathan Hart365335e2015-12-10 11:09:53 -0800417 }
418 }
Jonathan Hartb14221c2016-03-07 09:55:50 -0800419
420 private class InterfaceServiceDelegate extends InterfaceServiceAdapter {
Jonathan Hartb14221c2016-03-07 09:55:50 -0800421 @Override
422 public void addListener(InterfaceListener listener) {
Luca Preted814e212016-05-23 10:06:01 -0700423 SdnIpFibNoVlansTest.this.interfaceListener = listener;
Jonathan Hartb14221c2016-03-07 09:55:50 -0800424 }
425 }
Jonathan Hart9a426f82015-09-03 15:43:13 +0200426}