blob: 1799155962b963d0442a520afb58145e6d987296 [file] [log] [blame]
Thomas Vachuska781d18b2014-10-27 10:31:25 -07001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2014-present 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;
Jonathan Hart51372182014-12-03 21:32:34 -080021import org.onlab.packet.Ethernet;
22import org.onlab.packet.IPv4;
23import org.onlab.packet.IpAddress;
24import org.onlab.packet.IpPrefix;
25import org.onlab.packet.MacAddress;
Hyunsun Mooncf732fb2015-08-22 21:04:23 -070026import org.onlab.packet.TpPort;
Jonathan Hart6cd2f352015-01-13 17:44:45 -080027import org.onlab.packet.VlanId;
Jonathan Hart9a426f82015-09-03 15:43:13 +020028import org.onosproject.TestApplicationId;
Brian O'Connorabafb502014-12-02 22:26:20 -080029import org.onosproject.core.ApplicationId;
Jonathan Hart4cb39882015-08-12 23:50:55 -040030import org.onosproject.incubator.net.intf.Interface;
Jonathan Hartb14221c2016-03-07 09:55:50 -080031import org.onosproject.incubator.net.intf.InterfaceListener;
Jonathan Hart4cb39882015-08-12 23:50:55 -040032import org.onosproject.incubator.net.intf.InterfaceService;
Brian O'Connorabafb502014-12-02 22:26:20 -080033import org.onosproject.net.ConnectPoint;
34import org.onosproject.net.DeviceId;
35import org.onosproject.net.PortNumber;
Jonathan Hart08105be2015-10-10 18:31:06 -070036import org.onosproject.net.config.NetworkConfigListener;
Jonathan Hart9a426f82015-09-03 15:43:13 +020037import org.onosproject.net.config.NetworkConfigService;
Brian O'Connorabafb502014-12-02 22:26:20 -080038import org.onosproject.net.flow.DefaultTrafficSelector;
39import org.onosproject.net.flow.DefaultTrafficTreatment;
40import org.onosproject.net.flow.TrafficSelector;
41import org.onosproject.net.flow.TrafficTreatment;
42import org.onosproject.net.host.InterfaceIpAddress;
43import org.onosproject.net.intent.AbstractIntentTest;
44import org.onosproject.net.intent.Intent;
Jonathan Hart9a426f82015-09-03 15:43:13 +020045import org.onosproject.net.intent.Key;
Brian O'Connorabafb502014-12-02 22:26:20 -080046import org.onosproject.net.intent.PointToPointIntent;
Jonathan Hart9a426f82015-09-03 15:43:13 +020047import org.onosproject.routing.IntentSynchronizationService;
Jonathan Hart4cb39882015-08-12 23:50:55 -040048import org.onosproject.routing.config.BgpConfig;
Jonathan Hartce430a42014-10-16 20:44:29 -070049
Jonathan Harte30fcda2015-08-06 16:22:34 -070050import java.util.ArrayList;
51import java.util.Collections;
52import java.util.HashMap;
Jonathan Harte30fcda2015-08-06 16:22:34 -070053import java.util.List;
54import java.util.Map;
Jonathan Harta8625482015-09-08 16:14:56 -070055import java.util.Optional;
Jonathan Hart4cb39882015-08-12 23:50:55 -040056import java.util.Set;
Jonathan Hart552e31f2015-02-06 11:11:59 -080057
Jonathan Hart08105be2015-10-10 18:31:06 -070058import static org.easymock.EasyMock.anyObject;
Ray Milkey3e3ec5f2015-03-17 17:00:38 -070059import static org.easymock.EasyMock.createMock;
60import static org.easymock.EasyMock.expect;
Jonathan Hart08105be2015-10-10 18:31:06 -070061import static org.easymock.EasyMock.expectLastCall;
Ray Milkey3e3ec5f2015-03-17 17:00:38 -070062import static org.easymock.EasyMock.replay;
63import static org.easymock.EasyMock.reset;
64import static org.easymock.EasyMock.verify;
Jonathan Hart33b81f22016-02-05 09:25:50 -080065import static org.onosproject.routing.TestIntentServiceHelper.eqExceptId;
Jonathan Hartce430a42014-10-16 20:44:29 -070066
67/**
Jonathan Hart51372182014-12-03 21:32:34 -080068 * Unit tests for PeerConnectivityManager.
Jonathan Hartce430a42014-10-16 20:44:29 -070069 */
Brian O'Connor520c0522014-11-23 23:50:47 -080070public class PeerConnectivityManagerTest extends AbstractIntentTest {
Jonathan Hartce430a42014-10-16 20:44:29 -070071
Jonathan Hart9a426f82015-09-03 15:43:13 +020072 private static final ApplicationId APPID = TestApplicationId.create("foo");
Thomas Vachuskab97cf282014-10-20 23:31:12 -070073
Jonathan Hart4cb39882015-08-12 23:50:55 -040074 private static final ApplicationId CONFIG_APP_ID = APPID;
75
Jonathan Hartce430a42014-10-16 20:44:29 -070076 private PeerConnectivityManager peerConnectivityManager;
Jonathan Hart9a426f82015-09-03 15:43:13 +020077 private IntentSynchronizationService intentSynchronizer;
Jonathan Hart4cb39882015-08-12 23:50:55 -040078 private InterfaceService interfaceService;
79 private NetworkConfigService networkConfigService;
Jonathan Hartce430a42014-10-16 20:44:29 -070080
Jonathan Hart4cb39882015-08-12 23:50:55 -040081 private Set<BgpConfig.BgpSpeakerConfig> bgpSpeakers;
Jonathan Hartce430a42014-10-16 20:44:29 -070082 private Map<String, Interface> interfaces;
Jonathan Hartce430a42014-10-16 20:44:29 -070083
Jonathan Hart4cb39882015-08-12 23:50:55 -040084 private BgpConfig bgpConfig;
85
Jonathan Hartce430a42014-10-16 20:44:29 -070086 private List<PointToPointIntent> intentList;
87
88 private final String dpid1 = "00:00:00:00:00:00:00:01";
89 private final String dpid2 = "00:00:00:00:00:00:00:02";
Luca Prete8f2a3ce2016-03-29 16:13:01 -070090 private final String dpid3 = "00:00:00:00:00:00:00:03";
Jonathan Hartce430a42014-10-16 20:44:29 -070091
92 private final DeviceId deviceId1 =
93 DeviceId.deviceId(SdnIp.dpidToUri(dpid1));
94 private final DeviceId deviceId2 =
95 DeviceId.deviceId(SdnIp.dpidToUri(dpid2));
Luca Prete8f2a3ce2016-03-29 16:13:01 -070096 private final DeviceId deviceId3 =
97 DeviceId.deviceId(SdnIp.dpidToUri(dpid3));
Jonathan Hartce430a42014-10-16 20:44:29 -070098
99 // Interfaces connected to BGP speakers
100 private final ConnectPoint s1Eth100 =
101 new ConnectPoint(deviceId1, PortNumber.portNumber(100));
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700102 private final ConnectPoint s2Eth100 =
103 new ConnectPoint(deviceId2, PortNumber.portNumber(100));
104 private final ConnectPoint s3Eth100 =
105 new ConnectPoint(deviceId3, PortNumber.portNumber(100));
Jonathan Hartce430a42014-10-16 20:44:29 -0700106
107 // Interfaces connected to BGP peers
108 private final ConnectPoint s1Eth1 =
109 new ConnectPoint(deviceId1, PortNumber.portNumber(1));
110 private final ConnectPoint s2Eth1 =
111 new ConnectPoint(deviceId2, PortNumber.portNumber(1));
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700112 private final ConnectPoint s3Eth1 =
113 new ConnectPoint(deviceId3, PortNumber.portNumber(1));
Jonathan Hartce430a42014-10-16 20:44:29 -0700114
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700115 private static final VlanId NO_VLAN = VlanId.NONE;
116 private static final VlanId VLAN10 = VlanId.vlanId(Short.valueOf("10"));
117 private static final VlanId VLAN20 = VlanId.vlanId(Short.valueOf("20"));
118 private static final VlanId VLAN30 = VlanId.vlanId(Short.valueOf("30"));
Jonathan Hartce430a42014-10-16 20:44:29 -0700119
120 @Before
121 public void setUp() throws Exception {
Brian O'Connor520c0522014-11-23 23:50:47 -0800122 super.setUp();
Jonathan Hartb14221c2016-03-07 09:55:50 -0800123
Jonathan Hart4cb39882015-08-12 23:50:55 -0400124 interfaceService = createMock(InterfaceService.class);
Jonathan Hartb14221c2016-03-07 09:55:50 -0800125 interfaceService.addListener(anyObject(InterfaceListener.class));
126 expectLastCall().anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400127 networkConfigService = createMock(NetworkConfigService.class);
Jonathan Hart08105be2015-10-10 18:31:06 -0700128 networkConfigService.addListener(anyObject(NetworkConfigListener.class));
129 expectLastCall().anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400130 bgpConfig = createMock(BgpConfig.class);
Jonathan Hart90a02c22015-02-13 11:52:07 -0800131
Jonathan Hart4cb39882015-08-12 23:50:55 -0400132 // These will set expectations on routingConfig and interfaceService
133 bgpSpeakers = setUpBgpSpeakers();
Jonathan Hartce430a42014-10-16 20:44:29 -0700134 interfaces = Collections.unmodifiableMap(setUpInterfaces());
Jonathan Hartce430a42014-10-16 20:44:29 -0700135
136 initPeerConnectivity();
137 intentList = setUpIntentList();
138 }
139
140 /**
141 * Sets up BGP speakers.
142 *
143 * @return configured BGP speakers as a map from speaker name to speaker
144 */
Jonathan Hart4cb39882015-08-12 23:50:55 -0400145 private Set<BgpConfig.BgpSpeakerConfig> setUpBgpSpeakers() {
Jonathan Hartce430a42014-10-16 20:44:29 -0700146
Jonathan Hart4cb39882015-08-12 23:50:55 -0400147 BgpConfig.BgpSpeakerConfig speaker1 = new BgpConfig.BgpSpeakerConfig(
Jonathan Harta8625482015-09-08 16:14:56 -0700148 Optional.empty(),
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700149 NO_VLAN, s1Eth100,
150 Collections.singleton(IpAddress.valueOf("192.168.10.1")));
Jonathan Hartce430a42014-10-16 20:44:29 -0700151
Jonathan Hart4cb39882015-08-12 23:50:55 -0400152 BgpConfig.BgpSpeakerConfig speaker2 = new BgpConfig.BgpSpeakerConfig(
Jonathan Harta8625482015-09-08 16:14:56 -0700153 Optional.empty(),
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700154 NO_VLAN, s1Eth100,
155 Sets.newHashSet(IpAddress.valueOf("192.168.20.1"),
Jonathan Hart4cb39882015-08-12 23:50:55 -0400156 IpAddress.valueOf("192.168.30.1")));
Jonathan Hartce430a42014-10-16 20:44:29 -0700157
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700158 BgpConfig.BgpSpeakerConfig speaker3 = new BgpConfig.BgpSpeakerConfig(
159 Optional.empty(),
160 VLAN30, s3Eth100,
161 Sets.newHashSet(IpAddress.valueOf("192.168.40.1"),
162 IpAddress.valueOf("192.168.50.1")));
163
Jonathan Hart4cb39882015-08-12 23:50:55 -0400164 Set<BgpConfig.BgpSpeakerConfig> bgpSpeakers = Sets.newHashSet();
165 bgpSpeakers.add(speaker1);
166 bgpSpeakers.add(speaker2);
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700167 bgpSpeakers.add(speaker3);
Jonathan Hartce430a42014-10-16 20:44:29 -0700168
Jonathan Hart4cb39882015-08-12 23:50:55 -0400169 return bgpSpeakers;
Jonathan Hartce430a42014-10-16 20:44:29 -0700170 }
171
172 /**
173 * Sets up logical interfaces, which emulate the configured interfaces
174 * in SDN-IP application.
175 *
Jonathan Hart9a426f82015-09-03 15:43:13 +0200176 * @return configured interfaces as a map from interface name to Interface
Jonathan Hartce430a42014-10-16 20:44:29 -0700177 */
178 private Map<String, Interface> setUpInterfaces() {
179
Jonathan Hart9a426f82015-09-03 15:43:13 +0200180 Map<String, Interface> configuredInterfaces = new HashMap<>();
Jonathan Hartce430a42014-10-16 20:44:29 -0700181
182 String interfaceSw1Eth1 = "s1-eth1";
Pavlin Radoslavov76b0ae22014-10-27 15:33:19 -0700183 InterfaceIpAddress ia1 =
Jonathan Harte30fcda2015-08-06 16:22:34 -0700184 new InterfaceIpAddress(IpAddress.valueOf("192.168.10.101"),
Pavlin Radoslavov76b0ae22014-10-27 15:33:19 -0700185 IpPrefix.valueOf("192.168.10.0/24"));
Jonathan Hartb14221c2016-03-07 09:55:50 -0800186 Interface intfsw1eth1 = new Interface(interfaceSw1Eth1, s1Eth1,
Jonathan Hart00cddda2016-02-16 10:30:37 -0800187 Collections.singletonList(ia1),
Jonathan Hart6cd2f352015-01-13 17:44:45 -0800188 MacAddress.valueOf("00:00:00:00:00:01"),
189 VlanId.NONE);
Jonathan Hartce430a42014-10-16 20:44:29 -0700190
191 configuredInterfaces.put(interfaceSw1Eth1, intfsw1eth1);
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700192
Jonathan Hartce430a42014-10-16 20:44:29 -0700193 String interfaceSw2Eth1 = "s2-eth1";
Pavlin Radoslavov76b0ae22014-10-27 15:33:19 -0700194 InterfaceIpAddress ia2 =
Jonathan Harte30fcda2015-08-06 16:22:34 -0700195 new InterfaceIpAddress(IpAddress.valueOf("192.168.20.101"),
Pavlin Radoslavov76b0ae22014-10-27 15:33:19 -0700196 IpPrefix.valueOf("192.168.20.0/24"));
Jonathan Hartb14221c2016-03-07 09:55:50 -0800197 Interface intfsw2eth1 = new Interface(interfaceSw2Eth1, s2Eth1,
Jonathan Hart00cddda2016-02-16 10:30:37 -0800198 Collections.singletonList(ia2),
Jonathan Hart6cd2f352015-01-13 17:44:45 -0800199 MacAddress.valueOf("00:00:00:00:00:02"),
200 VlanId.NONE);
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700201
Jonathan Hartce430a42014-10-16 20:44:29 -0700202 configuredInterfaces.put(interfaceSw2Eth1, intfsw2eth1);
203
Jonathan Harte30fcda2015-08-06 16:22:34 -0700204 String interfaceSw2Eth1intf2 = "s2-eth1_2";
205 InterfaceIpAddress ia3 =
206 new InterfaceIpAddress(IpAddress.valueOf("192.168.30.101"),
207 IpPrefix.valueOf("192.168.30.0/24"));
Jonathan Hartb14221c2016-03-07 09:55:50 -0800208 Interface intfsw2eth1intf2 = new Interface(interfaceSw2Eth1intf2, s2Eth1,
Jonathan Hart00cddda2016-02-16 10:30:37 -0800209 Collections.singletonList(ia3),
Jonathan Harte30fcda2015-08-06 16:22:34 -0700210 MacAddress.valueOf("00:00:00:00:00:03"),
211 VlanId.NONE);
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700212
Jonathan Harte30fcda2015-08-06 16:22:34 -0700213 configuredInterfaces.put(interfaceSw2Eth1intf2, intfsw2eth1intf2);
214
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700215 String interfaceSw3Eth1 = "s3-eth1";
216 InterfaceIpAddress ia4 =
217 new InterfaceIpAddress(IpAddress.valueOf("192.168.40.101"),
218 IpPrefix.valueOf("192.168.40.0/24"));
219 Interface intfsw3eth1 = new Interface(s3Eth1,
220 Collections.singleton(ia4),
221 MacAddress.valueOf("00:00:00:00:00:04"),
222 VLAN10);
223
224 configuredInterfaces.put(interfaceSw3Eth1, intfsw3eth1);
225
226 String interfaceSw3Eth1intf2 = "s3-eth1_2";
227 InterfaceIpAddress ia5 =
228 new InterfaceIpAddress(IpAddress.valueOf("192.168.50.101"),
229 IpPrefix.valueOf("192.168.50.0/24"));
230 Interface intfsw3eth1intf2 = new Interface(s3Eth1,
231 Collections.singleton(ia5),
232 MacAddress.valueOf("00:00:00:00:00:05"),
233 VLAN20);
234
235 configuredInterfaces.put(interfaceSw3Eth1intf2, intfsw3eth1intf2);
236
Jonathan Hart4cb39882015-08-12 23:50:55 -0400237 expect(interfaceService.getInterfacesByPort(s1Eth1))
238 .andReturn(Collections.singleton(intfsw1eth1)).anyTimes();
239 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.10.101")))
240 .andReturn(Collections.singleton(intfsw1eth1)).anyTimes();
241 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.10.1")))
Jonathan Hartce430a42014-10-16 20:44:29 -0700242 .andReturn(intfsw1eth1).anyTimes();
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700243
Jonathan Hart4cb39882015-08-12 23:50:55 -0400244 expect(interfaceService.getInterfacesByPort(s2Eth1))
245 .andReturn(Collections.singleton(intfsw2eth1)).anyTimes();
246 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.20.101")))
247 .andReturn(Collections.singleton(intfsw2eth1)).anyTimes();
248 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.20.1")))
Jonathan Hartce430a42014-10-16 20:44:29 -0700249 .andReturn(intfsw2eth1).anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400250
251 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.30.101")))
252 .andReturn(Collections.singleton(intfsw2eth1intf2)).anyTimes();
253 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.30.1")))
Jonathan Harte30fcda2015-08-06 16:22:34 -0700254 .andReturn(intfsw2eth1intf2).anyTimes();
Jonathan Hartce430a42014-10-16 20:44:29 -0700255
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700256 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.40.101")))
257 .andReturn(Collections.singleton(intfsw3eth1)).anyTimes();
258 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.40.1")))
259 .andReturn(intfsw3eth1).anyTimes();
260
261 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.50.101")))
262 .andReturn(Collections.singleton(intfsw3eth1intf2)).anyTimes();
263 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.50.1")))
264 .andReturn(intfsw3eth1intf2).anyTimes();
265
Jonathan Hartce430a42014-10-16 20:44:29 -0700266 // Non-existent interface used during one of the tests
Jonathan Hart4cb39882015-08-12 23:50:55 -0400267 expect(interfaceService.getInterfacesByPort(new ConnectPoint(
268 DeviceId.deviceId(SdnIp.dpidToUri("00:00:00:00:00:00:01:00")),
269 PortNumber.portNumber(1))))
Jonathan Hartce430a42014-10-16 20:44:29 -0700270 .andReturn(null).anyTimes();
271
Jonathan Hart4cb39882015-08-12 23:50:55 -0400272 expect(interfaceService.getInterfaces()).andReturn(
Jonathan Hartce430a42014-10-16 20:44:29 -0700273 Sets.newHashSet(configuredInterfaces.values())).anyTimes();
Jonathan Hartce430a42014-10-16 20:44:29 -0700274
275 return configuredInterfaces;
276 }
277
278 /**
Jonathan Hartce430a42014-10-16 20:44:29 -0700279 * Sets up expected point to point intent list.
280 *
281 * @return point to point intent list
282 */
283 private List<PointToPointIntent> setUpIntentList() {
Jonathan Hart90a02c22015-02-13 11:52:07 -0800284 intentList = new ArrayList<>();
Jonathan Hartce430a42014-10-16 20:44:29 -0700285
286 setUpBgpIntents();
287 setUpIcmpIntents();
288
289 return intentList;
Jonathan Hartce430a42014-10-16 20:44:29 -0700290 }
291
292 /**
293 * Constructs a BGP intent and put it into the intentList.
294 * <p/>
295 * The purpose of this method is too simplify the setUpBgpIntents() method,
296 * and to make the setUpBgpIntents() easy to read.
297 *
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700298 * @param srcVlanId ingress VlanId
299 * @param dstVlanId egress VlanId
Jonathan Hartce430a42014-10-16 20:44:29 -0700300 * @param srcPrefix source IP prefix to match
301 * @param dstPrefix destination IP prefix to match
302 * @param srcTcpPort source TCP port to match
303 * @param dstTcpPort destination TCP port to match
304 * @param srcConnectPoint source connect point for PointToPointIntent
305 * @param dstConnectPoint destination connect point for PointToPointIntent
306 */
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700307 private void bgpPathintentConstructor(VlanId srcVlanId, VlanId dstVlanId,
308 String srcPrefix, String dstPrefix,
309 Short srcTcpPort, Short dstTcpPort,
310 ConnectPoint srcConnectPoint,
311 ConnectPoint dstConnectPoint) {
Jonathan Hartce430a42014-10-16 20:44:29 -0700312
313 TrafficSelector.Builder builder = DefaultTrafficSelector.builder()
314 .matchEthType(Ethernet.TYPE_IPV4)
315 .matchIPProtocol(IPv4.PROTOCOL_TCP)
316 .matchIPSrc(IpPrefix.valueOf(srcPrefix))
317 .matchIPDst(IpPrefix.valueOf(dstPrefix));
318
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700319 if (!srcVlanId.equals(VlanId.NONE)) {
320 builder.matchVlanId(VlanId.ANY);
321 }
322
323 TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
324
325 if (!dstVlanId.equals(VlanId.NONE)) {
326 treatment.setVlanId(dstVlanId);
327 }
328
Jonathan Hartce430a42014-10-16 20:44:29 -0700329 if (srcTcpPort != null) {
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700330 builder.matchTcpSrc(TpPort.tpPort(srcTcpPort));
Jonathan Hartce430a42014-10-16 20:44:29 -0700331 }
332 if (dstTcpPort != null) {
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700333 builder.matchTcpDst(TpPort.tpPort(dstTcpPort));
Jonathan Hartce430a42014-10-16 20:44:29 -0700334 }
335
Jonathan Hart9a426f82015-09-03 15:43:13 +0200336 Key key = Key.of(srcPrefix.split("/")[0] + "-" + dstPrefix.split("/")[0]
337 + "-" + ((srcTcpPort == null) ? "dst" : "src"), APPID);
338
Ray Milkey3e3ec5f2015-03-17 17:00:38 -0700339 PointToPointIntent intent = PointToPointIntent.builder()
340 .appId(APPID)
Jonathan Hart9a426f82015-09-03 15:43:13 +0200341 .key(key)
Ray Milkey3e3ec5f2015-03-17 17:00:38 -0700342 .selector(builder.build())
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700343 .treatment(treatment.build())
Ray Milkey3e3ec5f2015-03-17 17:00:38 -0700344 .ingressPoint(srcConnectPoint)
345 .egressPoint(dstConnectPoint)
346 .build();
Jonathan Hartce430a42014-10-16 20:44:29 -0700347
348 intentList.add(intent);
349 }
350
351 /**
352 * Sets up intents for BGP paths.
353 */
354 private void setUpBgpIntents() {
355
Jonathan Hart41349e92015-02-09 14:14:02 -0800356 Short bgpPort = 179;
Jonathan Hartce430a42014-10-16 20:44:29 -0700357
358 // Start to build intents between BGP speaker1 and BGP peer1
359 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700360 NO_VLAN, NO_VLAN,
361 "192.168.10.101/32", "192.168.10.1/32",
362 null, bgpPort,
Jonathan Hartce430a42014-10-16 20:44:29 -0700363 s1Eth100, s1Eth1);
364 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700365 NO_VLAN, NO_VLAN,
366 "192.168.10.101/32", "192.168.10.1/32",
367 bgpPort, null,
Jonathan Hartce430a42014-10-16 20:44:29 -0700368 s1Eth100, s1Eth1);
369
370 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700371 NO_VLAN, NO_VLAN,
372 "192.168.10.1/32", "192.168.10.101/32",
373 null, bgpPort,
Jonathan Hartce430a42014-10-16 20:44:29 -0700374 s1Eth1, s1Eth100);
375 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700376 NO_VLAN, NO_VLAN,
377 "192.168.10.1/32", "192.168.10.101/32",
378 bgpPort, null,
Jonathan Hartce430a42014-10-16 20:44:29 -0700379 s1Eth1, s1Eth100);
380
381 // Start to build intents between BGP speaker1 and BGP peer2
382 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700383 NO_VLAN, NO_VLAN,
384 "192.168.20.101/32", "192.168.20.1/32",
385 null, bgpPort,
Jonathan Hartce430a42014-10-16 20:44:29 -0700386 s1Eth100, s2Eth1);
387 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700388 NO_VLAN, NO_VLAN,
389 "192.168.20.101/32", "192.168.20.1/32",
390 bgpPort, null,
Jonathan Hartce430a42014-10-16 20:44:29 -0700391 s1Eth100, s2Eth1);
392
393 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700394 NO_VLAN, NO_VLAN,
395 "192.168.20.1/32", "192.168.20.101/32",
396 null, bgpPort,
Jonathan Hartce430a42014-10-16 20:44:29 -0700397 s2Eth1, s1Eth100);
398 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700399 NO_VLAN, NO_VLAN,
400 "192.168.20.1/32", "192.168.20.101/32",
401 bgpPort, null,
Jonathan Hartce430a42014-10-16 20:44:29 -0700402 s2Eth1, s1Eth100);
403
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700404 // Start to build intents between BGP speaker2 and BGP peer1
Jonathan Hartce430a42014-10-16 20:44:29 -0700405 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700406 NO_VLAN, NO_VLAN,
407 "192.168.30.101/32", "192.168.30.1/32",
408 null, bgpPort,
Jonathan Harte30fcda2015-08-06 16:22:34 -0700409 s1Eth100, s2Eth1);
Jonathan Hartce430a42014-10-16 20:44:29 -0700410 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700411 NO_VLAN, NO_VLAN,
412 "192.168.30.101/32", "192.168.30.1/32",
413 bgpPort, null,
Jonathan Harte30fcda2015-08-06 16:22:34 -0700414 s1Eth100, s2Eth1);
Jonathan Hartce430a42014-10-16 20:44:29 -0700415
416 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700417 NO_VLAN, NO_VLAN,
418 "192.168.30.1/32", "192.168.30.101/32",
419 null, bgpPort,
Jonathan Harte30fcda2015-08-06 16:22:34 -0700420 s2Eth1, s1Eth100);
Jonathan Hartce430a42014-10-16 20:44:29 -0700421 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700422 NO_VLAN, NO_VLAN,
423 "192.168.30.1/32", "192.168.30.101/32",
424 bgpPort, null,
Jonathan Harte30fcda2015-08-06 16:22:34 -0700425 s2Eth1, s1Eth100);
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700426
427 // Start to build intents between BGP speaker3 and BGP peer4
428 bgpPathintentConstructor(
429 VLAN30, VLAN10,
430 "192.168.40.101/32", "192.168.40.1/32",
431 null, bgpPort,
432 s3Eth100, s3Eth1);
433 bgpPathintentConstructor(
434 VLAN30, VLAN10,
435 "192.168.40.101/32", "192.168.40.1/32",
436 bgpPort, null,
437 s3Eth100, s3Eth1);
438
439 bgpPathintentConstructor(
440 VLAN10, VLAN30,
441 "192.168.40.1/32", "192.168.40.101/32",
442 null, bgpPort,
443 s3Eth1, s3Eth100);
444 bgpPathintentConstructor(
445 VLAN10, VLAN30,
446 "192.168.40.1/32", "192.168.40.101/32",
447 bgpPort, null,
448 s3Eth1, s3Eth100);
449
450 // Start to build intents between BGP speaker3 and BGP peer5
451 bgpPathintentConstructor(
452 VLAN30, VLAN20,
453 "192.168.50.101/32", "192.168.50.1/32",
454 null, bgpPort,
455 s3Eth100, s3Eth1);
456 bgpPathintentConstructor(
457 VLAN30, VLAN20,
458 "192.168.50.101/32", "192.168.50.1/32",
459 bgpPort, null,
460 s3Eth100, s3Eth1);
461
462 bgpPathintentConstructor(
463 VLAN20, VLAN30,
464 "192.168.50.1/32", "192.168.50.101/32",
465 null, bgpPort,
466 s3Eth1, s3Eth100);
467 bgpPathintentConstructor(
468 VLAN20, VLAN30,
469 "192.168.50.1/32", "192.168.50.101/32",
470 bgpPort, null,
471 s3Eth1, s3Eth100);
Jonathan Hartce430a42014-10-16 20:44:29 -0700472 }
473
474 /**
475 * Constructs a BGP intent and put it into the intentList.
476 * <p/>
477 * The purpose of this method is too simplify the setUpBgpIntents() method,
478 * and to make the setUpBgpIntents() easy to read.
479 *
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700480 * @param srcVlanId ingress VlanId
481 * @param dstVlanId egress VlanId
Jonathan Hartce430a42014-10-16 20:44:29 -0700482 * @param srcPrefix source IP prefix to match
483 * @param dstPrefix destination IP prefix to match
484 * @param srcConnectPoint source connect point for PointToPointIntent
485 * @param dstConnectPoint destination connect point for PointToPointIntent
486 */
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700487 private void icmpPathintentConstructor(VlanId srcVlanId, VlanId dstVlanId,
488 String srcPrefix, String dstPrefix,
489 ConnectPoint srcConnectPoint,
490 ConnectPoint dstConnectPoint) {
Jonathan Hartce430a42014-10-16 20:44:29 -0700491
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700492 TrafficSelector.Builder builder = DefaultTrafficSelector.builder()
Jonathan Hartce430a42014-10-16 20:44:29 -0700493 .matchEthType(Ethernet.TYPE_IPV4)
494 .matchIPProtocol(IPv4.PROTOCOL_ICMP)
495 .matchIPSrc(IpPrefix.valueOf(srcPrefix))
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700496 .matchIPDst(IpPrefix.valueOf(dstPrefix));
497
498 if (!srcVlanId.equals(VlanId.NONE)) {
499 builder.matchVlanId(VlanId.ANY);
500 }
501
502 TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
503
504 if (!dstVlanId.equals(VlanId.NONE)) {
505 treatment.setVlanId(dstVlanId);
506 }
Jonathan Hartce430a42014-10-16 20:44:29 -0700507
Jonathan Hart9a426f82015-09-03 15:43:13 +0200508 Key key = Key.of(srcPrefix.split("/")[0] + "-" + dstPrefix.split("/")[0]
509 + "-" + "icmp", APPID);
510
Ray Milkey3e3ec5f2015-03-17 17:00:38 -0700511 PointToPointIntent intent = PointToPointIntent.builder()
512 .appId(APPID)
Jonathan Hart9a426f82015-09-03 15:43:13 +0200513 .key(key)
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700514 .selector(builder.build())
515 .treatment(treatment.build())
Ray Milkey3e3ec5f2015-03-17 17:00:38 -0700516 .ingressPoint(srcConnectPoint)
517 .egressPoint(dstConnectPoint)
518 .build();
Jonathan Hartce430a42014-10-16 20:44:29 -0700519
520 intentList.add(intent);
521 }
522
523 /**
524 * Sets up intents for ICMP paths.
525 */
526 private void setUpIcmpIntents() {
Jonathan Hartce430a42014-10-16 20:44:29 -0700527 // Start to build intents between BGP speaker1 and BGP peer1
528 icmpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700529 NO_VLAN, NO_VLAN,
530 "192.168.10.101/32", "192.168.10.1/32",
531 s1Eth100, s1Eth1);
Jonathan Hartce430a42014-10-16 20:44:29 -0700532 icmpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700533 NO_VLAN, NO_VLAN,
534 "192.168.10.1/32", "192.168.10.101/32",
535 s1Eth1, s1Eth100);
Jonathan Hartce430a42014-10-16 20:44:29 -0700536
537 // Start to build intents between BGP speaker1 and BGP peer2
538 icmpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700539 NO_VLAN, NO_VLAN,
540 "192.168.20.101/32", "192.168.20.1/32",
541 s1Eth100, s2Eth1);
Jonathan Hartce430a42014-10-16 20:44:29 -0700542 icmpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700543 NO_VLAN, NO_VLAN,
544 "192.168.20.1/32", "192.168.20.101/32",
545 s2Eth1, s1Eth100);
Jonathan Hartce430a42014-10-16 20:44:29 -0700546
Jonathan Hartce430a42014-10-16 20:44:29 -0700547 icmpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700548 NO_VLAN, NO_VLAN,
549 "192.168.30.101/32", "192.168.30.1/32",
550 s1Eth100, s2Eth1);
Jonathan Hartce430a42014-10-16 20:44:29 -0700551 icmpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700552 NO_VLAN, NO_VLAN,
553 "192.168.30.1/32", "192.168.30.101/32",
554 s2Eth1, s1Eth100);
555
556 // Start to build intents between BGP speaker3 and BGP peer 4
557 icmpPathintentConstructor(
558 VLAN10, VLAN30,
559 "192.168.40.1/32", "192.168.40.101/32",
560 s3Eth1, s3Eth100);
561 icmpPathintentConstructor(
562 VLAN30, VLAN10,
563 "192.168.40.101/32", "192.168.40.1/32",
564 s3Eth100, s3Eth1);
565
566 // Start to build intents between BGP speaker3 and BGP peer 5
567 icmpPathintentConstructor(
568 VLAN20, VLAN30,
569 "192.168.50.1/32", "192.168.50.101/32",
570 s3Eth1, s3Eth100);
571 icmpPathintentConstructor(
572 VLAN30, VLAN20,
573 "192.168.50.101/32", "192.168.50.1/32",
574 s3Eth100, s3Eth1);
Jonathan Hartce430a42014-10-16 20:44:29 -0700575 }
576
577 /**
578 * Initializes peer connectivity testing environment.
579 */
Jonathan Hartde6e2032016-04-15 13:28:02 -0700580 private void initPeerConnectivity() {
Jonathan Hart4cb39882015-08-12 23:50:55 -0400581 expect(bgpConfig.bgpSpeakers()).andReturn(bgpSpeakers).anyTimes();
582 replay(bgpConfig);
Jonathan Hart9a426f82015-09-03 15:43:13 +0200583 expect(networkConfigService.getConfig(APPID, BgpConfig.class))
584 .andReturn(bgpConfig).anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400585 replay(networkConfigService);
Jonathan Hart4cb39882015-08-12 23:50:55 -0400586 replay(interfaceService);
Jonathan Hartce430a42014-10-16 20:44:29 -0700587
Jonathan Hart9a426f82015-09-03 15:43:13 +0200588 intentSynchronizer = createMock(IntentSynchronizationService.class);
589 replay(intentSynchronizer);
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -0800590
591 peerConnectivityManager =
592 new PeerConnectivityManager(APPID, intentSynchronizer,
Jonathan Hart4cb39882015-08-12 23:50:55 -0400593 networkConfigService,
594 CONFIG_APP_ID,
595 interfaceService);
Jonathan Hartce430a42014-10-16 20:44:29 -0700596 }
597
Jonathan Hartce430a42014-10-16 20:44:29 -0700598 /**
599 * Tests whether peer connectivity manager can set up correct BGP and
600 * ICMP intents according to specific configuration.
601 * <p/>
602 * Two tricky cases included in the configuration are: 2 peers on a same
603 * switch port, peer on the same switch with BGPd.
604 */
605 @Test
606 public void testConnectionSetup() {
Jonathan Hart9a426f82015-09-03 15:43:13 +0200607 reset(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700608
Pavlin Radoslavovdde22ae2014-11-24 11:47:17 -0800609 // Setup the expected intents
Pavlin Radoslavovdde22ae2014-11-24 11:47:17 -0800610 for (Intent intent : intentList) {
Jonathan Hart9a426f82015-09-03 15:43:13 +0200611 intentSynchronizer.submit(eqExceptId(intent));
Jonathan Hartce430a42014-10-16 20:44:29 -0700612 }
Jonathan Hart9a426f82015-09-03 15:43:13 +0200613 replay(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700614
615 // Running the interface to be tested.
616 peerConnectivityManager.start();
617
Jonathan Hart9a426f82015-09-03 15:43:13 +0200618 verify(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700619 }
620
621 /**
622 * Tests a corner case, when there are no interfaces in the configuration.
623 */
624 @Test
625 public void testNullInterfaces() {
Jonathan Hart4cb39882015-08-12 23:50:55 -0400626 reset(interfaceService);
Jonathan Hartb14221c2016-03-07 09:55:50 -0800627 interfaceService.addListener(anyObject(InterfaceListener.class));
628 expectLastCall().anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400629
630 expect(interfaceService.getInterfaces()).andReturn(
Jonathan Hart9a426f82015-09-03 15:43:13 +0200631 Sets.newHashSet()).anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400632 expect(interfaceService.getInterfacesByPort(s2Eth1))
633 .andReturn(Collections.emptySet()).anyTimes();
634 expect(interfaceService.getInterfacesByPort(s1Eth1))
635 .andReturn(Collections.emptySet()).anyTimes();
636 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.10.101")))
637 .andReturn(Collections.emptySet()).anyTimes();
638 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.10.1")))
Jonathan Hartce430a42014-10-16 20:44:29 -0700639 .andReturn(null).anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400640 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.20.101")))
641 .andReturn(Collections.emptySet()).anyTimes();
642 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.20.1")))
Jonathan Harte30fcda2015-08-06 16:22:34 -0700643 .andReturn(null).anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400644 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.30.101")))
645 .andReturn(Collections.emptySet()).anyTimes();
646 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.30.1")))
Jonathan Harte30fcda2015-08-06 16:22:34 -0700647 .andReturn(null).anyTimes();
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700648 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.40.101")))
649 .andReturn(Collections.emptySet()).anyTimes();
650 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.40.1")))
651 .andReturn(null).anyTimes();
652 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.50.101")))
653 .andReturn(Collections.emptySet()).anyTimes();
654 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.50.1")))
655 .andReturn(null).anyTimes();
Jonathan Hartce430a42014-10-16 20:44:29 -0700656
Jonathan Hart4cb39882015-08-12 23:50:55 -0400657 replay(interfaceService);
Jonathan Hartce430a42014-10-16 20:44:29 -0700658
Jonathan Hart9a426f82015-09-03 15:43:13 +0200659 reset(intentSynchronizer);
660 replay(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700661 peerConnectivityManager.start();
Jonathan Hart9a426f82015-09-03 15:43:13 +0200662 verify(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700663 }
664
665 /**
666 * Tests a corner case, when there is no BGP speakers in the configuration.
667 */
668 @Test
669 public void testNullBgpSpeakers() {
Jonathan Hart4cb39882015-08-12 23:50:55 -0400670 reset(bgpConfig);
Jonathan Hart4cb39882015-08-12 23:50:55 -0400671 expect(bgpConfig.bgpSpeakers()).andReturn(Collections.emptySet()).anyTimes();
672 replay(bgpConfig);
Jonathan Hartce430a42014-10-16 20:44:29 -0700673
Jonathan Hartde6e2032016-04-15 13:28:02 -0700674 // We don't expect any intents in this case
Jonathan Hart9a426f82015-09-03 15:43:13 +0200675 reset(intentSynchronizer);
676 replay(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700677 peerConnectivityManager.start();
Jonathan Hart9a426f82015-09-03 15:43:13 +0200678 verify(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700679 }
680
681 /**
682 * Tests a corner case, when there is no Interface configured for one BGP
683 * peer.
684 */
685 @Test
686 public void testNoPeerInterface() {
Jonathan Hartde6e2032016-04-15 13:28:02 -0700687 IpAddress ip = IpAddress.valueOf("1.1.1.1");
688 bgpSpeakers.clear();
689 bgpSpeakers.add(new BgpConfig.BgpSpeakerConfig(Optional.of("foo"),
690 VlanId.NONE, s1Eth100, Collections.singleton(ip)));
691 reset(interfaceService);
692 interfaceService.addListener(anyObject(InterfaceListener.class));
693 expect(interfaceService.getMatchingInterface(ip)).andReturn(null).anyTimes();
694 replay(interfaceService);
695
696 // We don't expect any intents in this case
697 reset(intentSynchronizer);
698 replay(intentSynchronizer);
699 peerConnectivityManager.start();
700 verify(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700701 }
702
Jonathan Hartce430a42014-10-16 20:44:29 -0700703}