blob: 48f097e0ca2e95d73521dee03d0040fdc28f0adc [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;
20import org.junit.Ignore;
21import org.junit.Test;
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -080022import org.onlab.junit.TestUtils.TestUtilsException;
Jonathan Hart51372182014-12-03 21:32:34 -080023import org.onlab.packet.Ethernet;
24import org.onlab.packet.IPv4;
25import org.onlab.packet.IpAddress;
26import org.onlab.packet.IpPrefix;
27import org.onlab.packet.MacAddress;
Hyunsun Mooncf732fb2015-08-22 21:04:23 -070028import org.onlab.packet.TpPort;
Jonathan Hart6cd2f352015-01-13 17:44:45 -080029import org.onlab.packet.VlanId;
Jonathan Hart9a426f82015-09-03 15:43:13 +020030import org.onosproject.TestApplicationId;
Brian O'Connorabafb502014-12-02 22:26:20 -080031import org.onosproject.core.ApplicationId;
Jonathan Hart4cb39882015-08-12 23:50:55 -040032import org.onosproject.incubator.net.intf.Interface;
33import 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;
51import org.onosproject.routing.config.BgpSpeaker;
Jonathan Hart2da1e602015-02-18 19:09:24 -080052import org.onosproject.routing.config.InterfaceAddress;
53import org.onosproject.routing.config.RoutingConfigurationService;
Jonathan Hartce430a42014-10-16 20:44:29 -070054
Jonathan Harte30fcda2015-08-06 16:22:34 -070055import java.util.ArrayList;
56import java.util.Collections;
57import java.util.HashMap;
58import java.util.LinkedList;
59import java.util.List;
60import java.util.Map;
Jonathan Harta8625482015-09-08 16:14:56 -070061import java.util.Optional;
Jonathan Hart4cb39882015-08-12 23:50:55 -040062import java.util.Set;
Jonathan Hart552e31f2015-02-06 11:11:59 -080063
Jonathan Hart08105be2015-10-10 18:31:06 -070064import static org.easymock.EasyMock.anyObject;
Ray Milkey3e3ec5f2015-03-17 17:00:38 -070065import static org.easymock.EasyMock.createMock;
66import static org.easymock.EasyMock.expect;
Jonathan Hart08105be2015-10-10 18:31:06 -070067import static org.easymock.EasyMock.expectLastCall;
Ray Milkey3e3ec5f2015-03-17 17:00:38 -070068import static org.easymock.EasyMock.replay;
69import static org.easymock.EasyMock.reset;
70import static org.easymock.EasyMock.verify;
Jonathan Hart33b81f22016-02-05 09:25:50 -080071import static org.onosproject.routing.TestIntentServiceHelper.eqExceptId;
Jonathan Hartce430a42014-10-16 20:44:29 -070072
73/**
Jonathan Hart51372182014-12-03 21:32:34 -080074 * Unit tests for PeerConnectivityManager.
Jonathan Hartce430a42014-10-16 20:44:29 -070075 */
Brian O'Connor520c0522014-11-23 23:50:47 -080076public class PeerConnectivityManagerTest extends AbstractIntentTest {
Jonathan Hartce430a42014-10-16 20:44:29 -070077
Jonathan Hart9a426f82015-09-03 15:43:13 +020078 private static final ApplicationId APPID = TestApplicationId.create("foo");
Thomas Vachuskab97cf282014-10-20 23:31:12 -070079
Jonathan Hart4cb39882015-08-12 23:50:55 -040080 private static final ApplicationId CONFIG_APP_ID = APPID;
81
Jonathan Hartce430a42014-10-16 20:44:29 -070082 private PeerConnectivityManager peerConnectivityManager;
Jonathan Hart9a426f82015-09-03 15:43:13 +020083 private IntentSynchronizationService intentSynchronizer;
Jonathan Hart90a02c22015-02-13 11:52:07 -080084 private RoutingConfigurationService routingConfig;
Jonathan Hart4cb39882015-08-12 23:50:55 -040085 private InterfaceService interfaceService;
86 private NetworkConfigService networkConfigService;
Jonathan Hartce430a42014-10-16 20:44:29 -070087
Jonathan Hart4cb39882015-08-12 23:50:55 -040088 private Set<BgpConfig.BgpSpeakerConfig> bgpSpeakers;
Jonathan Hartce430a42014-10-16 20:44:29 -070089 private Map<String, Interface> interfaces;
90 private Map<IpAddress, BgpPeer> peers;
91
Jonathan Hart4cb39882015-08-12 23:50:55 -040092 private BgpConfig bgpConfig;
93
Jonathan Hartce430a42014-10-16 20:44:29 -070094 private List<PointToPointIntent> intentList;
95
96 private final String dpid1 = "00:00:00:00:00:00:00:01";
97 private final String dpid2 = "00:00:00:00:00:00:00:02";
98
99 private final DeviceId deviceId1 =
100 DeviceId.deviceId(SdnIp.dpidToUri(dpid1));
101 private final DeviceId deviceId2 =
102 DeviceId.deviceId(SdnIp.dpidToUri(dpid2));
103
104 // Interfaces connected to BGP speakers
105 private final ConnectPoint s1Eth100 =
106 new ConnectPoint(deviceId1, PortNumber.portNumber(100));
107 private final ConnectPoint s2Eth100 =
108 new ConnectPoint(deviceId2, PortNumber.portNumber(100));
109
110 // Interfaces connected to BGP peers
111 private final ConnectPoint s1Eth1 =
112 new ConnectPoint(deviceId1, PortNumber.portNumber(1));
113 private final ConnectPoint s2Eth1 =
114 new ConnectPoint(deviceId2, PortNumber.portNumber(1));
115
Jonathan Hartce430a42014-10-16 20:44:29 -0700116 private final TrafficTreatment noTreatment =
Brian O'Connor6b528132015-03-10 16:39:52 -0700117 DefaultTrafficTreatment.emptyTreatment();
Jonathan Hartce430a42014-10-16 20:44:29 -0700118
119 @Before
120 public void setUp() throws Exception {
Brian O'Connor520c0522014-11-23 23:50:47 -0800121 super.setUp();
Jonathan Hart90a02c22015-02-13 11:52:07 -0800122 routingConfig = createMock(RoutingConfigurationService.class);
Jonathan Hart4cb39882015-08-12 23:50:55 -0400123 interfaceService = createMock(InterfaceService.class);
124 networkConfigService = createMock(NetworkConfigService.class);
Jonathan Hart08105be2015-10-10 18:31:06 -0700125 networkConfigService.addListener(anyObject(NetworkConfigListener.class));
126 expectLastCall().anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400127 bgpConfig = createMock(BgpConfig.class);
Jonathan Hart90a02c22015-02-13 11:52:07 -0800128
Jonathan Hart4cb39882015-08-12 23:50:55 -0400129 // These will set expectations on routingConfig and interfaceService
130 bgpSpeakers = setUpBgpSpeakers();
Jonathan Hartce430a42014-10-16 20:44:29 -0700131 interfaces = Collections.unmodifiableMap(setUpInterfaces());
Jonathan Hart9a426f82015-09-03 15:43:13 +0200132 peers = setUpPeers();
Jonathan Hartce430a42014-10-16 20:44:29 -0700133
134 initPeerConnectivity();
135 intentList = setUpIntentList();
136 }
137
138 /**
139 * Sets up BGP speakers.
140 *
141 * @return configured BGP speakers as a map from speaker name to speaker
142 */
Jonathan Hart4cb39882015-08-12 23:50:55 -0400143 private Set<BgpConfig.BgpSpeakerConfig> setUpBgpSpeakers() {
Jonathan Hartce430a42014-10-16 20:44:29 -0700144
Jonathan Hart4cb39882015-08-12 23:50:55 -0400145 BgpConfig.BgpSpeakerConfig speaker1 = new BgpConfig.BgpSpeakerConfig(
Jonathan Harta8625482015-09-08 16:14:56 -0700146 Optional.empty(),
Jonathan Hart4cb39882015-08-12 23:50:55 -0400147 s1Eth100, Collections.singleton(IpAddress.valueOf("192.168.10.1")));
Jonathan Hartce430a42014-10-16 20:44:29 -0700148
Jonathan Hart4cb39882015-08-12 23:50:55 -0400149 BgpConfig.BgpSpeakerConfig speaker2 = new BgpConfig.BgpSpeakerConfig(
Jonathan Harta8625482015-09-08 16:14:56 -0700150 Optional.empty(),
Jonathan Hart4cb39882015-08-12 23:50:55 -0400151 s1Eth100, Sets.newHashSet(IpAddress.valueOf("192.168.20.1"),
152 IpAddress.valueOf("192.168.30.1")));
Jonathan Hartce430a42014-10-16 20:44:29 -0700153
Jonathan Hart4cb39882015-08-12 23:50:55 -0400154 Set<BgpConfig.BgpSpeakerConfig> bgpSpeakers = Sets.newHashSet();
155 bgpSpeakers.add(speaker1);
156 bgpSpeakers.add(speaker2);
Jonathan Hartce430a42014-10-16 20:44:29 -0700157
Jonathan Hart4cb39882015-08-12 23:50:55 -0400158 return bgpSpeakers;
Jonathan Hartce430a42014-10-16 20:44:29 -0700159 }
160
161 /**
162 * Sets up logical interfaces, which emulate the configured interfaces
163 * in SDN-IP application.
164 *
Jonathan Hart9a426f82015-09-03 15:43:13 +0200165 * @return configured interfaces as a map from interface name to Interface
Jonathan Hartce430a42014-10-16 20:44:29 -0700166 */
167 private Map<String, Interface> setUpInterfaces() {
168
Jonathan Hart9a426f82015-09-03 15:43:13 +0200169 Map<String, Interface> configuredInterfaces = new HashMap<>();
Jonathan Hartce430a42014-10-16 20:44:29 -0700170
171 String interfaceSw1Eth1 = "s1-eth1";
Pavlin Radoslavov76b0ae22014-10-27 15:33:19 -0700172 InterfaceIpAddress ia1 =
Jonathan Harte30fcda2015-08-06 16:22:34 -0700173 new InterfaceIpAddress(IpAddress.valueOf("192.168.10.101"),
Pavlin Radoslavov76b0ae22014-10-27 15:33:19 -0700174 IpPrefix.valueOf("192.168.10.0/24"));
Jonathan Hartce430a42014-10-16 20:44:29 -0700175 Interface intfsw1eth1 = new Interface(s1Eth1,
Jonathan Hart00cddda2016-02-16 10:30:37 -0800176 Collections.singletonList(ia1),
Jonathan Hart6cd2f352015-01-13 17:44:45 -0800177 MacAddress.valueOf("00:00:00:00:00:01"),
178 VlanId.NONE);
Jonathan Hartce430a42014-10-16 20:44:29 -0700179
180 configuredInterfaces.put(interfaceSw1Eth1, intfsw1eth1);
181 String interfaceSw2Eth1 = "s2-eth1";
Pavlin Radoslavov76b0ae22014-10-27 15:33:19 -0700182 InterfaceIpAddress ia2 =
Jonathan Harte30fcda2015-08-06 16:22:34 -0700183 new InterfaceIpAddress(IpAddress.valueOf("192.168.20.101"),
Pavlin Radoslavov76b0ae22014-10-27 15:33:19 -0700184 IpPrefix.valueOf("192.168.20.0/24"));
Jonathan Hartce430a42014-10-16 20:44:29 -0700185 Interface intfsw2eth1 = new Interface(s2Eth1,
Jonathan Hart00cddda2016-02-16 10:30:37 -0800186 Collections.singletonList(ia2),
Jonathan Hart6cd2f352015-01-13 17:44:45 -0800187 MacAddress.valueOf("00:00:00:00:00:02"),
188 VlanId.NONE);
Jonathan Hartce430a42014-10-16 20:44:29 -0700189 configuredInterfaces.put(interfaceSw2Eth1, intfsw2eth1);
190
Jonathan Harte30fcda2015-08-06 16:22:34 -0700191 String interfaceSw2Eth1intf2 = "s2-eth1_2";
192 InterfaceIpAddress ia3 =
193 new InterfaceIpAddress(IpAddress.valueOf("192.168.30.101"),
194 IpPrefix.valueOf("192.168.30.0/24"));
195 Interface intfsw2eth1intf2 = new Interface(s2Eth1,
Jonathan Hart00cddda2016-02-16 10:30:37 -0800196 Collections.singletonList(ia3),
Jonathan Harte30fcda2015-08-06 16:22:34 -0700197 MacAddress.valueOf("00:00:00:00:00:03"),
198 VlanId.NONE);
199 configuredInterfaces.put(interfaceSw2Eth1intf2, intfsw2eth1intf2);
200
Jonathan Hart4cb39882015-08-12 23:50:55 -0400201 expect(interfaceService.getInterfacesByPort(s1Eth1))
202 .andReturn(Collections.singleton(intfsw1eth1)).anyTimes();
203 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.10.101")))
204 .andReturn(Collections.singleton(intfsw1eth1)).anyTimes();
205 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.10.1")))
Jonathan Hartce430a42014-10-16 20:44:29 -0700206 .andReturn(intfsw1eth1).anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400207 expect(interfaceService.getInterfacesByPort(s2Eth1))
208 .andReturn(Collections.singleton(intfsw2eth1)).anyTimes();
209 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.20.101")))
210 .andReturn(Collections.singleton(intfsw2eth1)).anyTimes();
211 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.20.1")))
Jonathan Hartce430a42014-10-16 20:44:29 -0700212 .andReturn(intfsw2eth1).anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400213
214 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.30.101")))
215 .andReturn(Collections.singleton(intfsw2eth1intf2)).anyTimes();
216 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.30.1")))
Jonathan Harte30fcda2015-08-06 16:22:34 -0700217 .andReturn(intfsw2eth1intf2).anyTimes();
Jonathan Hartce430a42014-10-16 20:44:29 -0700218
219 // Non-existent interface used during one of the tests
Jonathan Hart4cb39882015-08-12 23:50:55 -0400220 expect(interfaceService.getInterfacesByPort(new ConnectPoint(
221 DeviceId.deviceId(SdnIp.dpidToUri("00:00:00:00:00:00:01:00")),
222 PortNumber.portNumber(1))))
Jonathan Hartce430a42014-10-16 20:44:29 -0700223 .andReturn(null).anyTimes();
224
Jonathan Hart4cb39882015-08-12 23:50:55 -0400225 expect(interfaceService.getInterfaces()).andReturn(
Jonathan Hartce430a42014-10-16 20:44:29 -0700226 Sets.newHashSet(configuredInterfaces.values())).anyTimes();
Jonathan Hartce430a42014-10-16 20:44:29 -0700227
228 return configuredInterfaces;
229 }
230
231 /**
232 * Sets up BGP daemon peers.
233 *
234 * @return configured BGP peers as a MAP from peer IP address to BgpPeer
235 */
236 private Map<IpAddress, BgpPeer> setUpPeers() {
237
Jonathan Hart9a426f82015-09-03 15:43:13 +0200238 Map<IpAddress, BgpPeer> configuredPeers = new HashMap<>();
Jonathan Hartce430a42014-10-16 20:44:29 -0700239
240 String peerSw1Eth1 = "192.168.10.1";
241 configuredPeers.put(IpAddress.valueOf(peerSw1Eth1),
242 new BgpPeer(dpid1, 1, peerSw1Eth1));
243
244 // Two BGP peers are connected to switch 2 port 1.
245 String peer1Sw2Eth1 = "192.168.20.1";
246 configuredPeers.put(IpAddress.valueOf(peer1Sw2Eth1),
247 new BgpPeer(dpid2, 1, peer1Sw2Eth1));
248
Jonathan Harte30fcda2015-08-06 16:22:34 -0700249 String peer2Sw2Eth1 = "192.168.30.1";
Jonathan Hartce430a42014-10-16 20:44:29 -0700250 configuredPeers.put(IpAddress.valueOf(peer2Sw2Eth1),
251 new BgpPeer(dpid2, 1, peer2Sw2Eth1));
252
253 return configuredPeers;
254 }
255
256 /**
257 * Sets up expected point to point intent list.
258 *
259 * @return point to point intent list
260 */
261 private List<PointToPointIntent> setUpIntentList() {
Jonathan Hart90a02c22015-02-13 11:52:07 -0800262 intentList = new ArrayList<>();
Jonathan Hartce430a42014-10-16 20:44:29 -0700263
264 setUpBgpIntents();
265 setUpIcmpIntents();
266
267 return intentList;
Jonathan Hartce430a42014-10-16 20:44:29 -0700268 }
269
270 /**
271 * Constructs a BGP intent and put it into the intentList.
272 * <p/>
273 * The purpose of this method is too simplify the setUpBgpIntents() method,
274 * and to make the setUpBgpIntents() easy to read.
275 *
276 * @param srcPrefix source IP prefix to match
277 * @param dstPrefix destination IP prefix to match
278 * @param srcTcpPort source TCP port to match
279 * @param dstTcpPort destination TCP port to match
280 * @param srcConnectPoint source connect point for PointToPointIntent
281 * @param dstConnectPoint destination connect point for PointToPointIntent
282 */
283 private void bgpPathintentConstructor(String srcPrefix, String dstPrefix,
284 Short srcTcpPort, Short dstTcpPort,
285 ConnectPoint srcConnectPoint, ConnectPoint dstConnectPoint) {
286
287 TrafficSelector.Builder builder = DefaultTrafficSelector.builder()
288 .matchEthType(Ethernet.TYPE_IPV4)
289 .matchIPProtocol(IPv4.PROTOCOL_TCP)
290 .matchIPSrc(IpPrefix.valueOf(srcPrefix))
291 .matchIPDst(IpPrefix.valueOf(dstPrefix));
292
293 if (srcTcpPort != null) {
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700294 builder.matchTcpSrc(TpPort.tpPort(srcTcpPort));
Jonathan Hartce430a42014-10-16 20:44:29 -0700295 }
296 if (dstTcpPort != null) {
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700297 builder.matchTcpDst(TpPort.tpPort(dstTcpPort));
Jonathan Hartce430a42014-10-16 20:44:29 -0700298 }
299
Jonathan Hart9a426f82015-09-03 15:43:13 +0200300 Key key = Key.of(srcPrefix.split("/")[0] + "-" + dstPrefix.split("/")[0]
301 + "-" + ((srcTcpPort == null) ? "dst" : "src"), APPID);
302
Ray Milkey3e3ec5f2015-03-17 17:00:38 -0700303 PointToPointIntent intent = PointToPointIntent.builder()
304 .appId(APPID)
Jonathan Hart9a426f82015-09-03 15:43:13 +0200305 .key(key)
Ray Milkey3e3ec5f2015-03-17 17:00:38 -0700306 .selector(builder.build())
307 .treatment(noTreatment)
308 .ingressPoint(srcConnectPoint)
309 .egressPoint(dstConnectPoint)
310 .build();
Jonathan Hartce430a42014-10-16 20:44:29 -0700311
312 intentList.add(intent);
313 }
314
315 /**
316 * Sets up intents for BGP paths.
317 */
318 private void setUpBgpIntents() {
319
Jonathan Hart41349e92015-02-09 14:14:02 -0800320 Short bgpPort = 179;
Jonathan Hartce430a42014-10-16 20:44:29 -0700321
322 // Start to build intents between BGP speaker1 and BGP peer1
323 bgpPathintentConstructor(
324 "192.168.10.101/32", "192.168.10.1/32", null, bgpPort,
325 s1Eth100, s1Eth1);
326 bgpPathintentConstructor(
327 "192.168.10.101/32", "192.168.10.1/32", bgpPort, null,
328 s1Eth100, s1Eth1);
329
330 bgpPathintentConstructor(
331 "192.168.10.1/32", "192.168.10.101/32", null, bgpPort,
332 s1Eth1, s1Eth100);
333 bgpPathintentConstructor(
334 "192.168.10.1/32", "192.168.10.101/32", bgpPort, null,
335 s1Eth1, s1Eth100);
336
337 // Start to build intents between BGP speaker1 and BGP peer2
338 bgpPathintentConstructor(
339 "192.168.20.101/32", "192.168.20.1/32", null, bgpPort,
340 s1Eth100, s2Eth1);
341 bgpPathintentConstructor(
342 "192.168.20.101/32", "192.168.20.1/32", bgpPort, null,
343 s1Eth100, s2Eth1);
344
345 bgpPathintentConstructor(
346 "192.168.20.1/32", "192.168.20.101/32", null, bgpPort,
347 s2Eth1, s1Eth100);
348 bgpPathintentConstructor(
349 "192.168.20.1/32", "192.168.20.101/32", bgpPort, null,
350 s2Eth1, s1Eth100);
351
Jonathan Hartce430a42014-10-16 20:44:29 -0700352 //
353 // Start to build intents between BGP speaker3 and BGP peer1
354 bgpPathintentConstructor(
Jonathan Harte30fcda2015-08-06 16:22:34 -0700355 "192.168.30.101/32", "192.168.30.1/32", null, bgpPort,
356 s1Eth100, s2Eth1);
Jonathan Hartce430a42014-10-16 20:44:29 -0700357 bgpPathintentConstructor(
Jonathan Harte30fcda2015-08-06 16:22:34 -0700358 "192.168.30.101/32", "192.168.30.1/32", bgpPort, null,
359 s1Eth100, s2Eth1);
Jonathan Hartce430a42014-10-16 20:44:29 -0700360
361 bgpPathintentConstructor(
Jonathan Harte30fcda2015-08-06 16:22:34 -0700362 "192.168.30.1/32", "192.168.30.101/32", null, bgpPort,
363 s2Eth1, s1Eth100);
Jonathan Hartce430a42014-10-16 20:44:29 -0700364 bgpPathintentConstructor(
Jonathan Harte30fcda2015-08-06 16:22:34 -0700365 "192.168.30.1/32", "192.168.30.101/32", bgpPort, null,
366 s2Eth1, s1Eth100);
Jonathan Hartce430a42014-10-16 20:44:29 -0700367 }
368
369 /**
370 * Constructs a BGP intent and put it into the intentList.
371 * <p/>
372 * The purpose of this method is too simplify the setUpBgpIntents() method,
373 * and to make the setUpBgpIntents() easy to read.
374 *
375 * @param srcPrefix source IP prefix to match
376 * @param dstPrefix destination IP prefix to match
377 * @param srcConnectPoint source connect point for PointToPointIntent
378 * @param dstConnectPoint destination connect point for PointToPointIntent
379 */
380 private void icmpPathintentConstructor(String srcPrefix, String dstPrefix,
381 ConnectPoint srcConnectPoint, ConnectPoint dstConnectPoint) {
382
383 TrafficSelector selector = DefaultTrafficSelector.builder()
384 .matchEthType(Ethernet.TYPE_IPV4)
385 .matchIPProtocol(IPv4.PROTOCOL_ICMP)
386 .matchIPSrc(IpPrefix.valueOf(srcPrefix))
387 .matchIPDst(IpPrefix.valueOf(dstPrefix))
388 .build();
389
Jonathan Hart9a426f82015-09-03 15:43:13 +0200390 Key key = Key.of(srcPrefix.split("/")[0] + "-" + dstPrefix.split("/")[0]
391 + "-" + "icmp", APPID);
392
Ray Milkey3e3ec5f2015-03-17 17:00:38 -0700393 PointToPointIntent intent = PointToPointIntent.builder()
394 .appId(APPID)
Jonathan Hart9a426f82015-09-03 15:43:13 +0200395 .key(key)
Ray Milkey3e3ec5f2015-03-17 17:00:38 -0700396 .selector(selector)
397 .treatment(noTreatment)
398 .ingressPoint(srcConnectPoint)
399 .egressPoint(dstConnectPoint)
400 .build();
Jonathan Hartce430a42014-10-16 20:44:29 -0700401
402 intentList.add(intent);
403 }
404
405 /**
406 * Sets up intents for ICMP paths.
407 */
408 private void setUpIcmpIntents() {
Jonathan Hartce430a42014-10-16 20:44:29 -0700409 // Start to build intents between BGP speaker1 and BGP peer1
410 icmpPathintentConstructor(
411 "192.168.10.101/32", "192.168.10.1/32", s1Eth100, s1Eth1);
412 icmpPathintentConstructor(
413 "192.168.10.1/32", "192.168.10.101/32", s1Eth1, s1Eth100);
414
415 // Start to build intents between BGP speaker1 and BGP peer2
416 icmpPathintentConstructor(
417 "192.168.20.101/32", "192.168.20.1/32", s1Eth100, s2Eth1);
418 icmpPathintentConstructor(
419 "192.168.20.1/32", "192.168.20.101/32", s2Eth1, s1Eth100);
420
Jonathan Hartce430a42014-10-16 20:44:29 -0700421 icmpPathintentConstructor(
Jonathan Harte30fcda2015-08-06 16:22:34 -0700422 "192.168.30.101/32", "192.168.30.1/32", s1Eth100, s2Eth1);
Jonathan Hartce430a42014-10-16 20:44:29 -0700423 icmpPathintentConstructor(
Jonathan Harte30fcda2015-08-06 16:22:34 -0700424 "192.168.30.1/32", "192.168.30.101/32", s2Eth1, s1Eth100);
Jonathan Hartce430a42014-10-16 20:44:29 -0700425 }
426
427 /**
428 * Initializes peer connectivity testing environment.
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -0800429 *
430 * @throws TestUtilsException if exceptions when using TestUtils
Jonathan Hartce430a42014-10-16 20:44:29 -0700431 */
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -0800432 private void initPeerConnectivity() throws TestUtilsException {
Jonathan Hart90a02c22015-02-13 11:52:07 -0800433 expect(routingConfig.getBgpPeers()).andReturn(peers).anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400434 expect(bgpConfig.bgpSpeakers()).andReturn(bgpSpeakers).anyTimes();
435 replay(bgpConfig);
Jonathan Hart9a426f82015-09-03 15:43:13 +0200436 expect(networkConfigService.getConfig(APPID, BgpConfig.class))
437 .andReturn(bgpConfig).anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400438 replay(networkConfigService);
Jonathan Hart90a02c22015-02-13 11:52:07 -0800439 replay(routingConfig);
Jonathan Hart4cb39882015-08-12 23:50:55 -0400440 replay(interfaceService);
Jonathan Hartce430a42014-10-16 20:44:29 -0700441
Jonathan Hart9a426f82015-09-03 15:43:13 +0200442 intentSynchronizer = createMock(IntentSynchronizationService.class);
443 replay(intentSynchronizer);
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -0800444
445 peerConnectivityManager =
446 new PeerConnectivityManager(APPID, intentSynchronizer,
Jonathan Hart4cb39882015-08-12 23:50:55 -0400447 networkConfigService,
448 CONFIG_APP_ID,
449 interfaceService);
Jonathan Hartce430a42014-10-16 20:44:29 -0700450 }
451
Jonathan Hartce430a42014-10-16 20:44:29 -0700452 /**
453 * Tests whether peer connectivity manager can set up correct BGP and
454 * ICMP intents according to specific configuration.
455 * <p/>
456 * Two tricky cases included in the configuration are: 2 peers on a same
457 * switch port, peer on the same switch with BGPd.
458 */
459 @Test
460 public void testConnectionSetup() {
Jonathan Hart9a426f82015-09-03 15:43:13 +0200461 reset(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700462
Pavlin Radoslavovdde22ae2014-11-24 11:47:17 -0800463 // Setup the expected intents
Pavlin Radoslavovdde22ae2014-11-24 11:47:17 -0800464 for (Intent intent : intentList) {
Jonathan Hart9a426f82015-09-03 15:43:13 +0200465 intentSynchronizer.submit(eqExceptId(intent));
Jonathan Hartce430a42014-10-16 20:44:29 -0700466 }
Jonathan Hart9a426f82015-09-03 15:43:13 +0200467 replay(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700468
469 // Running the interface to be tested.
470 peerConnectivityManager.start();
471
Jonathan Hart9a426f82015-09-03 15:43:13 +0200472 verify(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700473 }
474
475 /**
476 * Tests a corner case, when there are no interfaces in the configuration.
477 */
478 @Test
479 public void testNullInterfaces() {
Jonathan Hart4cb39882015-08-12 23:50:55 -0400480 reset(interfaceService);
481
482 expect(interfaceService.getInterfaces()).andReturn(
Jonathan Hart9a426f82015-09-03 15:43:13 +0200483 Sets.newHashSet()).anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400484 expect(interfaceService.getInterfacesByPort(s2Eth1))
485 .andReturn(Collections.emptySet()).anyTimes();
486 expect(interfaceService.getInterfacesByPort(s1Eth1))
487 .andReturn(Collections.emptySet()).anyTimes();
488 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.10.101")))
489 .andReturn(Collections.emptySet()).anyTimes();
490 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.10.1")))
Jonathan Hartce430a42014-10-16 20:44:29 -0700491 .andReturn(null).anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400492 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.20.101")))
493 .andReturn(Collections.emptySet()).anyTimes();
494 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.20.1")))
Jonathan Harte30fcda2015-08-06 16:22:34 -0700495 .andReturn(null).anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400496 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.30.101")))
497 .andReturn(Collections.emptySet()).anyTimes();
498 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.30.1")))
Jonathan Harte30fcda2015-08-06 16:22:34 -0700499 .andReturn(null).anyTimes();
Jonathan Hartce430a42014-10-16 20:44:29 -0700500
Jonathan Hart4cb39882015-08-12 23:50:55 -0400501 replay(interfaceService);
Jonathan Hartce430a42014-10-16 20:44:29 -0700502
Jonathan Hart9a426f82015-09-03 15:43:13 +0200503 reset(intentSynchronizer);
504 replay(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700505 peerConnectivityManager.start();
Jonathan Hart9a426f82015-09-03 15:43:13 +0200506 verify(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700507 }
508
509 /**
510 * Tests a corner case, when there is no BGP speakers in the configuration.
511 */
512 @Test
513 public void testNullBgpSpeakers() {
Jonathan Hart90a02c22015-02-13 11:52:07 -0800514 reset(routingConfig);
Jonathan Hart4cb39882015-08-12 23:50:55 -0400515 reset(bgpConfig);
Jonathan Hartce430a42014-10-16 20:44:29 -0700516
Jonathan Hart4cb39882015-08-12 23:50:55 -0400517 expect(bgpConfig.bgpSpeakers()).andReturn(Collections.emptySet()).anyTimes();
518 replay(bgpConfig);
Jonathan Hart90a02c22015-02-13 11:52:07 -0800519 expect(routingConfig.getBgpPeers()).andReturn(peers).anyTimes();
Jonathan Hart90a02c22015-02-13 11:52:07 -0800520 replay(routingConfig);
Jonathan Hartce430a42014-10-16 20:44:29 -0700521
Jonathan Hart9a426f82015-09-03 15:43:13 +0200522 reset(intentSynchronizer);
523 replay(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700524 peerConnectivityManager.start();
Jonathan Hart9a426f82015-09-03 15:43:13 +0200525 verify(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700526 }
527
528 /**
529 * Tests a corner case, when there is no Interface configured for one BGP
530 * peer.
531 */
532 @Test
533 public void testNoPeerInterface() {
534 String peerSw100Eth1 = "192.168.200.1";
Jonathan Hart9a426f82015-09-03 15:43:13 +0200535 peers.put(IpAddress.valueOf(peerSw100Eth1),
Jonathan Hartce430a42014-10-16 20:44:29 -0700536 new BgpPeer("00:00:00:00:00:00:01:00", 1, peerSw100Eth1));
537 testConnectionSetup();
538 }
539
540 /**
541 * Tests a corner case, when there is no Interface configured for one BGP
542 * speaker.
Jonathan Hartce430a42014-10-16 20:44:29 -0700543 */
544 @Ignore
545 @Test
546 public void testNoSpeakerInterface() {
547 BgpSpeaker bgpSpeaker100 = new BgpSpeaker(
548 "bgpSpeaker100",
549 "00:00:00:00:00:00:01:00", 100,
550 "00:00:00:00:01:00");
Jonathan Hart90a02c22015-02-13 11:52:07 -0800551 List<InterfaceAddress> interfaceAddresses100 = new LinkedList<>();
Jonathan Hartce430a42014-10-16 20:44:29 -0700552 interfaceAddresses100.add(new InterfaceAddress(dpid1, 1, "192.168.10.201"));
553 interfaceAddresses100.add(new InterfaceAddress(dpid2, 1, "192.168.20.201"));
554 bgpSpeaker100.setInterfaceAddresses(interfaceAddresses100);
Jonathan Hartce430a42014-10-16 20:44:29 -0700555 testConnectionSetup();
556 }
557}