blob: 54cb16b3ca370630cf1bd2750ea92d1d488f60c1 [file] [log] [blame]
Thomas Vachuska781d18b2014-10-27 10:31:25 -07001/*
Ray Milkey34c95902015-04-15 09:47:53 -07002 * Copyright 2014-2015 Open Networking Laboratory
Thomas Vachuska781d18b2014-10-27 10:31:25 -07003 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07004 * 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
Thomas Vachuska781d18b2014-10-27 10:31:25 -07007 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07008 * 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.
Thomas Vachuska781d18b2014-10-27 10:31:25 -070015 */
Brian O'Connorabafb502014-12-02 22:26:20 -080016package org.onosproject.sdnip;
Jonathan Hartce430a42014-10-16 20:44:29 -070017
Jonathan Harte30fcda2015-08-06 16:22:34 -070018import com.google.common.collect.Sets;
Jonathan Hartce430a42014-10-16 20:44:29 -070019import org.junit.Before;
Jonathan Hartce430a42014-10-16 20:44:29 -070020import org.junit.Test;
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -080021import org.onlab.junit.TestUtils.TestUtilsException;
Jonathan Hart51372182014-12-03 21:32:34 -080022import org.onlab.packet.Ethernet;
23import org.onlab.packet.IPv4;
24import org.onlab.packet.IpAddress;
25import org.onlab.packet.IpPrefix;
26import org.onlab.packet.MacAddress;
Hyunsun Mooncf732fb2015-08-22 21:04:23 -070027import org.onlab.packet.TpPort;
Jonathan Hart6cd2f352015-01-13 17:44:45 -080028import org.onlab.packet.VlanId;
Jonathan Hart9a426f82015-09-03 15:43:13 +020029import org.onosproject.TestApplicationId;
Brian O'Connorabafb502014-12-02 22:26:20 -080030import org.onosproject.core.ApplicationId;
Jonathan Hart4cb39882015-08-12 23:50:55 -040031import org.onosproject.incubator.net.intf.Interface;
Jonathan Hartb14221c2016-03-07 09:55:50 -080032import org.onosproject.incubator.net.intf.InterfaceListener;
Jonathan Hart4cb39882015-08-12 23:50:55 -040033import org.onosproject.incubator.net.intf.InterfaceService;
Brian O'Connorabafb502014-12-02 22:26:20 -080034import org.onosproject.net.ConnectPoint;
35import org.onosproject.net.DeviceId;
36import org.onosproject.net.PortNumber;
Jonathan Hart08105be2015-10-10 18:31:06 -070037import org.onosproject.net.config.NetworkConfigListener;
Jonathan Hart9a426f82015-09-03 15:43:13 +020038import org.onosproject.net.config.NetworkConfigService;
Brian O'Connorabafb502014-12-02 22:26:20 -080039import org.onosproject.net.flow.DefaultTrafficSelector;
40import org.onosproject.net.flow.DefaultTrafficTreatment;
41import org.onosproject.net.flow.TrafficSelector;
42import org.onosproject.net.flow.TrafficTreatment;
43import org.onosproject.net.host.InterfaceIpAddress;
44import org.onosproject.net.intent.AbstractIntentTest;
45import org.onosproject.net.intent.Intent;
Jonathan Hart9a426f82015-09-03 15:43:13 +020046import org.onosproject.net.intent.Key;
Brian O'Connorabafb502014-12-02 22:26:20 -080047import org.onosproject.net.intent.PointToPointIntent;
Jonathan Hart9a426f82015-09-03 15:43:13 +020048import org.onosproject.routing.IntentSynchronizationService;
Jonathan Hart4cb39882015-08-12 23:50:55 -040049import org.onosproject.routing.config.BgpConfig;
Jonathan Hart2da1e602015-02-18 19:09:24 -080050import org.onosproject.routing.config.BgpPeer;
Jonathan Hartce430a42014-10-16 20:44:29 -070051
Jonathan Harte30fcda2015-08-06 16:22:34 -070052import java.util.ArrayList;
53import java.util.Collections;
54import java.util.HashMap;
Jonathan Harte30fcda2015-08-06 16:22:34 -070055import java.util.List;
56import java.util.Map;
Jonathan Harta8625482015-09-08 16:14:56 -070057import java.util.Optional;
Jonathan Hart4cb39882015-08-12 23:50:55 -040058import java.util.Set;
Jonathan Hart552e31f2015-02-06 11:11:59 -080059
Jonathan Hart08105be2015-10-10 18:31:06 -070060import static org.easymock.EasyMock.anyObject;
Ray Milkey3e3ec5f2015-03-17 17:00:38 -070061import static org.easymock.EasyMock.createMock;
62import static org.easymock.EasyMock.expect;
Jonathan Hart08105be2015-10-10 18:31:06 -070063import static org.easymock.EasyMock.expectLastCall;
Ray Milkey3e3ec5f2015-03-17 17:00:38 -070064import static org.easymock.EasyMock.replay;
65import static org.easymock.EasyMock.reset;
66import static org.easymock.EasyMock.verify;
Jonathan Hart33b81f22016-02-05 09:25:50 -080067import static org.onosproject.routing.TestIntentServiceHelper.eqExceptId;
Jonathan Hartce430a42014-10-16 20:44:29 -070068
69/**
Jonathan Hart51372182014-12-03 21:32:34 -080070 * Unit tests for PeerConnectivityManager.
Jonathan Hartce430a42014-10-16 20:44:29 -070071 */
Brian O'Connor520c0522014-11-23 23:50:47 -080072public class PeerConnectivityManagerTest extends AbstractIntentTest {
Jonathan Hartce430a42014-10-16 20:44:29 -070073
Jonathan Hart9a426f82015-09-03 15:43:13 +020074 private static final ApplicationId APPID = TestApplicationId.create("foo");
Thomas Vachuskab97cf282014-10-20 23:31:12 -070075
Jonathan Hart4cb39882015-08-12 23:50:55 -040076 private static final ApplicationId CONFIG_APP_ID = APPID;
77
Jonathan Hartce430a42014-10-16 20:44:29 -070078 private PeerConnectivityManager peerConnectivityManager;
Jonathan Hart9a426f82015-09-03 15:43:13 +020079 private IntentSynchronizationService intentSynchronizer;
Jonathan Hart4cb39882015-08-12 23:50:55 -040080 private InterfaceService interfaceService;
81 private NetworkConfigService networkConfigService;
Jonathan Hartce430a42014-10-16 20:44:29 -070082
Jonathan Hart4cb39882015-08-12 23:50:55 -040083 private Set<BgpConfig.BgpSpeakerConfig> bgpSpeakers;
Jonathan Hartce430a42014-10-16 20:44:29 -070084 private Map<String, Interface> interfaces;
85 private Map<IpAddress, BgpPeer> peers;
86
Jonathan Hart4cb39882015-08-12 23:50:55 -040087 private BgpConfig bgpConfig;
88
Jonathan Hartce430a42014-10-16 20:44:29 -070089 private List<PointToPointIntent> intentList;
90
91 private final String dpid1 = "00:00:00:00:00:00:00:01";
92 private final String dpid2 = "00:00:00:00:00:00:00:02";
93
94 private final DeviceId deviceId1 =
95 DeviceId.deviceId(SdnIp.dpidToUri(dpid1));
96 private final DeviceId deviceId2 =
97 DeviceId.deviceId(SdnIp.dpidToUri(dpid2));
98
99 // Interfaces connected to BGP speakers
100 private final ConnectPoint s1Eth100 =
101 new ConnectPoint(deviceId1, PortNumber.portNumber(100));
Jonathan Hartce430a42014-10-16 20:44:29 -0700102
103 // Interfaces connected to BGP peers
104 private final ConnectPoint s1Eth1 =
105 new ConnectPoint(deviceId1, PortNumber.portNumber(1));
106 private final ConnectPoint s2Eth1 =
107 new ConnectPoint(deviceId2, PortNumber.portNumber(1));
108
Jonathan Hartce430a42014-10-16 20:44:29 -0700109 private final TrafficTreatment noTreatment =
Brian O'Connor6b528132015-03-10 16:39:52 -0700110 DefaultTrafficTreatment.emptyTreatment();
Jonathan Hartce430a42014-10-16 20:44:29 -0700111
112 @Before
113 public void setUp() throws Exception {
Brian O'Connor520c0522014-11-23 23:50:47 -0800114 super.setUp();
Jonathan Hartb14221c2016-03-07 09:55:50 -0800115
Jonathan Hart4cb39882015-08-12 23:50:55 -0400116 interfaceService = createMock(InterfaceService.class);
Jonathan Hartb14221c2016-03-07 09:55:50 -0800117 interfaceService.addListener(anyObject(InterfaceListener.class));
118 expectLastCall().anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400119 networkConfigService = createMock(NetworkConfigService.class);
Jonathan Hart08105be2015-10-10 18:31:06 -0700120 networkConfigService.addListener(anyObject(NetworkConfigListener.class));
121 expectLastCall().anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400122 bgpConfig = createMock(BgpConfig.class);
Jonathan Hart90a02c22015-02-13 11:52:07 -0800123
Jonathan Hart4cb39882015-08-12 23:50:55 -0400124 // These will set expectations on routingConfig and interfaceService
125 bgpSpeakers = setUpBgpSpeakers();
Jonathan Hartce430a42014-10-16 20:44:29 -0700126 interfaces = Collections.unmodifiableMap(setUpInterfaces());
Jonathan Hart9a426f82015-09-03 15:43:13 +0200127 peers = setUpPeers();
Jonathan Hartce430a42014-10-16 20:44:29 -0700128
129 initPeerConnectivity();
130 intentList = setUpIntentList();
131 }
132
133 /**
134 * Sets up BGP speakers.
135 *
136 * @return configured BGP speakers as a map from speaker name to speaker
137 */
Jonathan Hart4cb39882015-08-12 23:50:55 -0400138 private Set<BgpConfig.BgpSpeakerConfig> setUpBgpSpeakers() {
Jonathan Hartce430a42014-10-16 20:44:29 -0700139
Jonathan Hart4cb39882015-08-12 23:50:55 -0400140 BgpConfig.BgpSpeakerConfig speaker1 = new BgpConfig.BgpSpeakerConfig(
Jonathan Harta8625482015-09-08 16:14:56 -0700141 Optional.empty(),
Jonathan Hart4cb39882015-08-12 23:50:55 -0400142 s1Eth100, Collections.singleton(IpAddress.valueOf("192.168.10.1")));
Jonathan Hartce430a42014-10-16 20:44:29 -0700143
Jonathan Hart4cb39882015-08-12 23:50:55 -0400144 BgpConfig.BgpSpeakerConfig speaker2 = new BgpConfig.BgpSpeakerConfig(
Jonathan Harta8625482015-09-08 16:14:56 -0700145 Optional.empty(),
Jonathan Hart4cb39882015-08-12 23:50:55 -0400146 s1Eth100, Sets.newHashSet(IpAddress.valueOf("192.168.20.1"),
147 IpAddress.valueOf("192.168.30.1")));
Jonathan Hartce430a42014-10-16 20:44:29 -0700148
Jonathan Hart4cb39882015-08-12 23:50:55 -0400149 Set<BgpConfig.BgpSpeakerConfig> bgpSpeakers = Sets.newHashSet();
150 bgpSpeakers.add(speaker1);
151 bgpSpeakers.add(speaker2);
Jonathan Hartce430a42014-10-16 20:44:29 -0700152
Jonathan Hart4cb39882015-08-12 23:50:55 -0400153 return bgpSpeakers;
Jonathan Hartce430a42014-10-16 20:44:29 -0700154 }
155
156 /**
157 * Sets up logical interfaces, which emulate the configured interfaces
158 * in SDN-IP application.
159 *
Jonathan Hart9a426f82015-09-03 15:43:13 +0200160 * @return configured interfaces as a map from interface name to Interface
Jonathan Hartce430a42014-10-16 20:44:29 -0700161 */
162 private Map<String, Interface> setUpInterfaces() {
163
Jonathan Hart9a426f82015-09-03 15:43:13 +0200164 Map<String, Interface> configuredInterfaces = new HashMap<>();
Jonathan Hartce430a42014-10-16 20:44:29 -0700165
166 String interfaceSw1Eth1 = "s1-eth1";
Pavlin Radoslavov76b0ae22014-10-27 15:33:19 -0700167 InterfaceIpAddress ia1 =
Jonathan Harte30fcda2015-08-06 16:22:34 -0700168 new InterfaceIpAddress(IpAddress.valueOf("192.168.10.101"),
Pavlin Radoslavov76b0ae22014-10-27 15:33:19 -0700169 IpPrefix.valueOf("192.168.10.0/24"));
Jonathan Hartb14221c2016-03-07 09:55:50 -0800170 Interface intfsw1eth1 = new Interface(interfaceSw1Eth1, s1Eth1,
Jonathan Hart00cddda2016-02-16 10:30:37 -0800171 Collections.singletonList(ia1),
Jonathan Hart6cd2f352015-01-13 17:44:45 -0800172 MacAddress.valueOf("00:00:00:00:00:01"),
173 VlanId.NONE);
Jonathan Hartce430a42014-10-16 20:44:29 -0700174
175 configuredInterfaces.put(interfaceSw1Eth1, intfsw1eth1);
176 String interfaceSw2Eth1 = "s2-eth1";
Pavlin Radoslavov76b0ae22014-10-27 15:33:19 -0700177 InterfaceIpAddress ia2 =
Jonathan Harte30fcda2015-08-06 16:22:34 -0700178 new InterfaceIpAddress(IpAddress.valueOf("192.168.20.101"),
Pavlin Radoslavov76b0ae22014-10-27 15:33:19 -0700179 IpPrefix.valueOf("192.168.20.0/24"));
Jonathan Hartb14221c2016-03-07 09:55:50 -0800180 Interface intfsw2eth1 = new Interface(interfaceSw2Eth1, s2Eth1,
Jonathan Hart00cddda2016-02-16 10:30:37 -0800181 Collections.singletonList(ia2),
Jonathan Hart6cd2f352015-01-13 17:44:45 -0800182 MacAddress.valueOf("00:00:00:00:00:02"),
183 VlanId.NONE);
Jonathan Hartce430a42014-10-16 20:44:29 -0700184 configuredInterfaces.put(interfaceSw2Eth1, intfsw2eth1);
185
Jonathan Harte30fcda2015-08-06 16:22:34 -0700186 String interfaceSw2Eth1intf2 = "s2-eth1_2";
187 InterfaceIpAddress ia3 =
188 new InterfaceIpAddress(IpAddress.valueOf("192.168.30.101"),
189 IpPrefix.valueOf("192.168.30.0/24"));
Jonathan Hartb14221c2016-03-07 09:55:50 -0800190 Interface intfsw2eth1intf2 = new Interface(interfaceSw2Eth1intf2, s2Eth1,
Jonathan Hart00cddda2016-02-16 10:30:37 -0800191 Collections.singletonList(ia3),
Jonathan Harte30fcda2015-08-06 16:22:34 -0700192 MacAddress.valueOf("00:00:00:00:00:03"),
193 VlanId.NONE);
194 configuredInterfaces.put(interfaceSw2Eth1intf2, intfsw2eth1intf2);
195
Jonathan Hart4cb39882015-08-12 23:50:55 -0400196 expect(interfaceService.getInterfacesByPort(s1Eth1))
197 .andReturn(Collections.singleton(intfsw1eth1)).anyTimes();
198 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.10.101")))
199 .andReturn(Collections.singleton(intfsw1eth1)).anyTimes();
200 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.10.1")))
Jonathan Hartce430a42014-10-16 20:44:29 -0700201 .andReturn(intfsw1eth1).anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400202 expect(interfaceService.getInterfacesByPort(s2Eth1))
203 .andReturn(Collections.singleton(intfsw2eth1)).anyTimes();
204 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.20.101")))
205 .andReturn(Collections.singleton(intfsw2eth1)).anyTimes();
206 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.20.1")))
Jonathan Hartce430a42014-10-16 20:44:29 -0700207 .andReturn(intfsw2eth1).anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400208
209 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.30.101")))
210 .andReturn(Collections.singleton(intfsw2eth1intf2)).anyTimes();
211 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.30.1")))
Jonathan Harte30fcda2015-08-06 16:22:34 -0700212 .andReturn(intfsw2eth1intf2).anyTimes();
Jonathan Hartce430a42014-10-16 20:44:29 -0700213
214 // Non-existent interface used during one of the tests
Jonathan Hart4cb39882015-08-12 23:50:55 -0400215 expect(interfaceService.getInterfacesByPort(new ConnectPoint(
216 DeviceId.deviceId(SdnIp.dpidToUri("00:00:00:00:00:00:01:00")),
217 PortNumber.portNumber(1))))
Jonathan Hartce430a42014-10-16 20:44:29 -0700218 .andReturn(null).anyTimes();
219
Jonathan Hart4cb39882015-08-12 23:50:55 -0400220 expect(interfaceService.getInterfaces()).andReturn(
Jonathan Hartce430a42014-10-16 20:44:29 -0700221 Sets.newHashSet(configuredInterfaces.values())).anyTimes();
Jonathan Hartce430a42014-10-16 20:44:29 -0700222
223 return configuredInterfaces;
224 }
225
226 /**
227 * Sets up BGP daemon peers.
228 *
229 * @return configured BGP peers as a MAP from peer IP address to BgpPeer
230 */
231 private Map<IpAddress, BgpPeer> setUpPeers() {
232
Jonathan Hart9a426f82015-09-03 15:43:13 +0200233 Map<IpAddress, BgpPeer> configuredPeers = new HashMap<>();
Jonathan Hartce430a42014-10-16 20:44:29 -0700234
235 String peerSw1Eth1 = "192.168.10.1";
236 configuredPeers.put(IpAddress.valueOf(peerSw1Eth1),
237 new BgpPeer(dpid1, 1, peerSw1Eth1));
238
239 // Two BGP peers are connected to switch 2 port 1.
240 String peer1Sw2Eth1 = "192.168.20.1";
241 configuredPeers.put(IpAddress.valueOf(peer1Sw2Eth1),
242 new BgpPeer(dpid2, 1, peer1Sw2Eth1));
243
Jonathan Harte30fcda2015-08-06 16:22:34 -0700244 String peer2Sw2Eth1 = "192.168.30.1";
Jonathan Hartce430a42014-10-16 20:44:29 -0700245 configuredPeers.put(IpAddress.valueOf(peer2Sw2Eth1),
246 new BgpPeer(dpid2, 1, peer2Sw2Eth1));
247
248 return configuredPeers;
249 }
250
251 /**
252 * Sets up expected point to point intent list.
253 *
254 * @return point to point intent list
255 */
256 private List<PointToPointIntent> setUpIntentList() {
Jonathan Hart90a02c22015-02-13 11:52:07 -0800257 intentList = new ArrayList<>();
Jonathan Hartce430a42014-10-16 20:44:29 -0700258
259 setUpBgpIntents();
260 setUpIcmpIntents();
261
262 return intentList;
Jonathan Hartce430a42014-10-16 20:44:29 -0700263 }
264
265 /**
266 * Constructs a BGP intent and put it into the intentList.
267 * <p/>
268 * The purpose of this method is too simplify the setUpBgpIntents() method,
269 * and to make the setUpBgpIntents() easy to read.
270 *
271 * @param srcPrefix source IP prefix to match
272 * @param dstPrefix destination IP prefix to match
273 * @param srcTcpPort source TCP port to match
274 * @param dstTcpPort destination TCP port to match
275 * @param srcConnectPoint source connect point for PointToPointIntent
276 * @param dstConnectPoint destination connect point for PointToPointIntent
277 */
278 private void bgpPathintentConstructor(String srcPrefix, String dstPrefix,
279 Short srcTcpPort, Short dstTcpPort,
280 ConnectPoint srcConnectPoint, ConnectPoint dstConnectPoint) {
281
282 TrafficSelector.Builder builder = DefaultTrafficSelector.builder()
283 .matchEthType(Ethernet.TYPE_IPV4)
284 .matchIPProtocol(IPv4.PROTOCOL_TCP)
285 .matchIPSrc(IpPrefix.valueOf(srcPrefix))
286 .matchIPDst(IpPrefix.valueOf(dstPrefix));
287
288 if (srcTcpPort != null) {
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700289 builder.matchTcpSrc(TpPort.tpPort(srcTcpPort));
Jonathan Hartce430a42014-10-16 20:44:29 -0700290 }
291 if (dstTcpPort != null) {
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700292 builder.matchTcpDst(TpPort.tpPort(dstTcpPort));
Jonathan Hartce430a42014-10-16 20:44:29 -0700293 }
294
Jonathan Hart9a426f82015-09-03 15:43:13 +0200295 Key key = Key.of(srcPrefix.split("/")[0] + "-" + dstPrefix.split("/")[0]
296 + "-" + ((srcTcpPort == null) ? "dst" : "src"), APPID);
297
Ray Milkey3e3ec5f2015-03-17 17:00:38 -0700298 PointToPointIntent intent = PointToPointIntent.builder()
299 .appId(APPID)
Jonathan Hart9a426f82015-09-03 15:43:13 +0200300 .key(key)
Ray Milkey3e3ec5f2015-03-17 17:00:38 -0700301 .selector(builder.build())
302 .treatment(noTreatment)
303 .ingressPoint(srcConnectPoint)
304 .egressPoint(dstConnectPoint)
305 .build();
Jonathan Hartce430a42014-10-16 20:44:29 -0700306
307 intentList.add(intent);
308 }
309
310 /**
311 * Sets up intents for BGP paths.
312 */
313 private void setUpBgpIntents() {
314
Jonathan Hart41349e92015-02-09 14:14:02 -0800315 Short bgpPort = 179;
Jonathan Hartce430a42014-10-16 20:44:29 -0700316
317 // Start to build intents between BGP speaker1 and BGP peer1
318 bgpPathintentConstructor(
319 "192.168.10.101/32", "192.168.10.1/32", null, bgpPort,
320 s1Eth100, s1Eth1);
321 bgpPathintentConstructor(
322 "192.168.10.101/32", "192.168.10.1/32", bgpPort, null,
323 s1Eth100, s1Eth1);
324
325 bgpPathintentConstructor(
326 "192.168.10.1/32", "192.168.10.101/32", null, bgpPort,
327 s1Eth1, s1Eth100);
328 bgpPathintentConstructor(
329 "192.168.10.1/32", "192.168.10.101/32", bgpPort, null,
330 s1Eth1, s1Eth100);
331
332 // Start to build intents between BGP speaker1 and BGP peer2
333 bgpPathintentConstructor(
334 "192.168.20.101/32", "192.168.20.1/32", null, bgpPort,
335 s1Eth100, s2Eth1);
336 bgpPathintentConstructor(
337 "192.168.20.101/32", "192.168.20.1/32", bgpPort, null,
338 s1Eth100, s2Eth1);
339
340 bgpPathintentConstructor(
341 "192.168.20.1/32", "192.168.20.101/32", null, bgpPort,
342 s2Eth1, s1Eth100);
343 bgpPathintentConstructor(
344 "192.168.20.1/32", "192.168.20.101/32", bgpPort, null,
345 s2Eth1, s1Eth100);
346
Jonathan Hartce430a42014-10-16 20:44:29 -0700347 //
348 // Start to build intents between BGP speaker3 and BGP peer1
349 bgpPathintentConstructor(
Jonathan Harte30fcda2015-08-06 16:22:34 -0700350 "192.168.30.101/32", "192.168.30.1/32", null, bgpPort,
351 s1Eth100, s2Eth1);
Jonathan Hartce430a42014-10-16 20:44:29 -0700352 bgpPathintentConstructor(
Jonathan Harte30fcda2015-08-06 16:22:34 -0700353 "192.168.30.101/32", "192.168.30.1/32", bgpPort, null,
354 s1Eth100, s2Eth1);
Jonathan Hartce430a42014-10-16 20:44:29 -0700355
356 bgpPathintentConstructor(
Jonathan Harte30fcda2015-08-06 16:22:34 -0700357 "192.168.30.1/32", "192.168.30.101/32", null, bgpPort,
358 s2Eth1, s1Eth100);
Jonathan Hartce430a42014-10-16 20:44:29 -0700359 bgpPathintentConstructor(
Jonathan Harte30fcda2015-08-06 16:22:34 -0700360 "192.168.30.1/32", "192.168.30.101/32", bgpPort, null,
361 s2Eth1, s1Eth100);
Jonathan Hartce430a42014-10-16 20:44:29 -0700362 }
363
364 /**
365 * Constructs a BGP intent and put it into the intentList.
366 * <p/>
367 * The purpose of this method is too simplify the setUpBgpIntents() method,
368 * and to make the setUpBgpIntents() easy to read.
369 *
370 * @param srcPrefix source IP prefix to match
371 * @param dstPrefix destination IP prefix to match
372 * @param srcConnectPoint source connect point for PointToPointIntent
373 * @param dstConnectPoint destination connect point for PointToPointIntent
374 */
375 private void icmpPathintentConstructor(String srcPrefix, String dstPrefix,
376 ConnectPoint srcConnectPoint, ConnectPoint dstConnectPoint) {
377
378 TrafficSelector selector = DefaultTrafficSelector.builder()
379 .matchEthType(Ethernet.TYPE_IPV4)
380 .matchIPProtocol(IPv4.PROTOCOL_ICMP)
381 .matchIPSrc(IpPrefix.valueOf(srcPrefix))
382 .matchIPDst(IpPrefix.valueOf(dstPrefix))
383 .build();
384
Jonathan Hart9a426f82015-09-03 15:43:13 +0200385 Key key = Key.of(srcPrefix.split("/")[0] + "-" + dstPrefix.split("/")[0]
386 + "-" + "icmp", APPID);
387
Ray Milkey3e3ec5f2015-03-17 17:00:38 -0700388 PointToPointIntent intent = PointToPointIntent.builder()
389 .appId(APPID)
Jonathan Hart9a426f82015-09-03 15:43:13 +0200390 .key(key)
Ray Milkey3e3ec5f2015-03-17 17:00:38 -0700391 .selector(selector)
392 .treatment(noTreatment)
393 .ingressPoint(srcConnectPoint)
394 .egressPoint(dstConnectPoint)
395 .build();
Jonathan Hartce430a42014-10-16 20:44:29 -0700396
397 intentList.add(intent);
398 }
399
400 /**
401 * Sets up intents for ICMP paths.
402 */
403 private void setUpIcmpIntents() {
Jonathan Hartce430a42014-10-16 20:44:29 -0700404 // Start to build intents between BGP speaker1 and BGP peer1
405 icmpPathintentConstructor(
406 "192.168.10.101/32", "192.168.10.1/32", s1Eth100, s1Eth1);
407 icmpPathintentConstructor(
408 "192.168.10.1/32", "192.168.10.101/32", s1Eth1, s1Eth100);
409
410 // Start to build intents between BGP speaker1 and BGP peer2
411 icmpPathintentConstructor(
412 "192.168.20.101/32", "192.168.20.1/32", s1Eth100, s2Eth1);
413 icmpPathintentConstructor(
414 "192.168.20.1/32", "192.168.20.101/32", s2Eth1, s1Eth100);
415
Jonathan Hartce430a42014-10-16 20:44:29 -0700416 icmpPathintentConstructor(
Jonathan Harte30fcda2015-08-06 16:22:34 -0700417 "192.168.30.101/32", "192.168.30.1/32", s1Eth100, s2Eth1);
Jonathan Hartce430a42014-10-16 20:44:29 -0700418 icmpPathintentConstructor(
Jonathan Harte30fcda2015-08-06 16:22:34 -0700419 "192.168.30.1/32", "192.168.30.101/32", s2Eth1, s1Eth100);
Jonathan Hartce430a42014-10-16 20:44:29 -0700420 }
421
422 /**
423 * Initializes peer connectivity testing environment.
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -0800424 *
425 * @throws TestUtilsException if exceptions when using TestUtils
Jonathan Hartce430a42014-10-16 20:44:29 -0700426 */
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -0800427 private void initPeerConnectivity() throws TestUtilsException {
Jonathan Hart4cb39882015-08-12 23:50:55 -0400428 expect(bgpConfig.bgpSpeakers()).andReturn(bgpSpeakers).anyTimes();
429 replay(bgpConfig);
Jonathan Hart9a426f82015-09-03 15:43:13 +0200430 expect(networkConfigService.getConfig(APPID, BgpConfig.class))
431 .andReturn(bgpConfig).anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400432 replay(networkConfigService);
Jonathan Hart4cb39882015-08-12 23:50:55 -0400433 replay(interfaceService);
Jonathan Hartce430a42014-10-16 20:44:29 -0700434
Jonathan Hart9a426f82015-09-03 15:43:13 +0200435 intentSynchronizer = createMock(IntentSynchronizationService.class);
436 replay(intentSynchronizer);
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -0800437
438 peerConnectivityManager =
439 new PeerConnectivityManager(APPID, intentSynchronizer,
Jonathan Hart4cb39882015-08-12 23:50:55 -0400440 networkConfigService,
441 CONFIG_APP_ID,
442 interfaceService);
Jonathan Hartce430a42014-10-16 20:44:29 -0700443 }
444
Jonathan Hartce430a42014-10-16 20:44:29 -0700445 /**
446 * Tests whether peer connectivity manager can set up correct BGP and
447 * ICMP intents according to specific configuration.
448 * <p/>
449 * Two tricky cases included in the configuration are: 2 peers on a same
450 * switch port, peer on the same switch with BGPd.
451 */
452 @Test
453 public void testConnectionSetup() {
Jonathan Hart9a426f82015-09-03 15:43:13 +0200454 reset(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700455
Pavlin Radoslavovdde22ae2014-11-24 11:47:17 -0800456 // Setup the expected intents
Pavlin Radoslavovdde22ae2014-11-24 11:47:17 -0800457 for (Intent intent : intentList) {
Jonathan Hart9a426f82015-09-03 15:43:13 +0200458 intentSynchronizer.submit(eqExceptId(intent));
Jonathan Hartce430a42014-10-16 20:44:29 -0700459 }
Jonathan Hart9a426f82015-09-03 15:43:13 +0200460 replay(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700461
462 // Running the interface to be tested.
463 peerConnectivityManager.start();
464
Jonathan Hart9a426f82015-09-03 15:43:13 +0200465 verify(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700466 }
467
468 /**
469 * Tests a corner case, when there are no interfaces in the configuration.
470 */
471 @Test
472 public void testNullInterfaces() {
Jonathan Hart4cb39882015-08-12 23:50:55 -0400473 reset(interfaceService);
Jonathan Hartb14221c2016-03-07 09:55:50 -0800474 interfaceService.addListener(anyObject(InterfaceListener.class));
475 expectLastCall().anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400476
477 expect(interfaceService.getInterfaces()).andReturn(
Jonathan Hart9a426f82015-09-03 15:43:13 +0200478 Sets.newHashSet()).anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400479 expect(interfaceService.getInterfacesByPort(s2Eth1))
480 .andReturn(Collections.emptySet()).anyTimes();
481 expect(interfaceService.getInterfacesByPort(s1Eth1))
482 .andReturn(Collections.emptySet()).anyTimes();
483 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.10.101")))
484 .andReturn(Collections.emptySet()).anyTimes();
485 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.10.1")))
Jonathan Hartce430a42014-10-16 20:44:29 -0700486 .andReturn(null).anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400487 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.20.101")))
488 .andReturn(Collections.emptySet()).anyTimes();
489 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.20.1")))
Jonathan Harte30fcda2015-08-06 16:22:34 -0700490 .andReturn(null).anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400491 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.30.101")))
492 .andReturn(Collections.emptySet()).anyTimes();
493 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.30.1")))
Jonathan Harte30fcda2015-08-06 16:22:34 -0700494 .andReturn(null).anyTimes();
Jonathan Hartce430a42014-10-16 20:44:29 -0700495
Jonathan Hart4cb39882015-08-12 23:50:55 -0400496 replay(interfaceService);
Jonathan Hartce430a42014-10-16 20:44:29 -0700497
Jonathan Hart9a426f82015-09-03 15:43:13 +0200498 reset(intentSynchronizer);
499 replay(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700500 peerConnectivityManager.start();
Jonathan Hart9a426f82015-09-03 15:43:13 +0200501 verify(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700502 }
503
504 /**
505 * Tests a corner case, when there is no BGP speakers in the configuration.
506 */
507 @Test
508 public void testNullBgpSpeakers() {
Jonathan Hart4cb39882015-08-12 23:50:55 -0400509 reset(bgpConfig);
Jonathan Hart4cb39882015-08-12 23:50:55 -0400510 expect(bgpConfig.bgpSpeakers()).andReturn(Collections.emptySet()).anyTimes();
511 replay(bgpConfig);
Jonathan Hartce430a42014-10-16 20:44:29 -0700512
Jonathan Hart9a426f82015-09-03 15:43:13 +0200513 reset(intentSynchronizer);
514 replay(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700515 peerConnectivityManager.start();
Jonathan Hart9a426f82015-09-03 15:43:13 +0200516 verify(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700517 }
518
519 /**
520 * Tests a corner case, when there is no Interface configured for one BGP
521 * peer.
522 */
523 @Test
524 public void testNoPeerInterface() {
525 String peerSw100Eth1 = "192.168.200.1";
Jonathan Hart9a426f82015-09-03 15:43:13 +0200526 peers.put(IpAddress.valueOf(peerSw100Eth1),
Jonathan Hartce430a42014-10-16 20:44:29 -0700527 new BgpPeer("00:00:00:00:00:00:01:00", 1, peerSw100Eth1));
528 testConnectionSetup();
529 }
530
Jonathan Hartce430a42014-10-16 20:44:29 -0700531}