blob: b8e4e1ba40bef7f36efc41d22164d42a4e10e9b0 [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
Sho SHIMIZU891162b2016-06-06 16:32:01 -070018import com.google.common.collect.ImmutableList;
Jonathan Harte30fcda2015-08-06 16:22:34 -070019import com.google.common.collect.Sets;
Jonathan Hartce430a42014-10-16 20:44:29 -070020import org.junit.Before;
Jonathan Hartce430a42014-10-16 20:44:29 -070021import org.junit.Test;
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 Hartce430a42014-10-16 20:44:29 -070050
Jonathan Harte30fcda2015-08-06 16:22:34 -070051import java.util.ArrayList;
52import java.util.Collections;
53import java.util.HashMap;
Jonathan Harte30fcda2015-08-06 16:22:34 -070054import java.util.List;
55import java.util.Map;
Jonathan Harta8625482015-09-08 16:14:56 -070056import java.util.Optional;
Jonathan Hart4cb39882015-08-12 23:50:55 -040057import java.util.Set;
Jonathan Hart552e31f2015-02-06 11:11:59 -080058
Jonathan Hart08105be2015-10-10 18:31:06 -070059import static org.easymock.EasyMock.anyObject;
Ray Milkey3e3ec5f2015-03-17 17:00:38 -070060import static org.easymock.EasyMock.createMock;
61import static org.easymock.EasyMock.expect;
Jonathan Hart08105be2015-10-10 18:31:06 -070062import static org.easymock.EasyMock.expectLastCall;
Ray Milkey3e3ec5f2015-03-17 17:00:38 -070063import static org.easymock.EasyMock.replay;
64import static org.easymock.EasyMock.reset;
65import static org.easymock.EasyMock.verify;
Jonathan Hart33b81f22016-02-05 09:25:50 -080066import static org.onosproject.routing.TestIntentServiceHelper.eqExceptId;
Jonathan Hartce430a42014-10-16 20:44:29 -070067
68/**
Jonathan Hart51372182014-12-03 21:32:34 -080069 * Unit tests for PeerConnectivityManager.
Jonathan Hartce430a42014-10-16 20:44:29 -070070 */
Brian O'Connor520c0522014-11-23 23:50:47 -080071public class PeerConnectivityManagerTest extends AbstractIntentTest {
Jonathan Hartce430a42014-10-16 20:44:29 -070072
Jonathan Hart9a426f82015-09-03 15:43:13 +020073 private static final ApplicationId APPID = TestApplicationId.create("foo");
Thomas Vachuskab97cf282014-10-20 23:31:12 -070074
Jonathan Hart4cb39882015-08-12 23:50:55 -040075 private static final ApplicationId CONFIG_APP_ID = APPID;
76
Jonathan Hartce430a42014-10-16 20:44:29 -070077 private PeerConnectivityManager peerConnectivityManager;
Jonathan Hart9a426f82015-09-03 15:43:13 +020078 private IntentSynchronizationService intentSynchronizer;
Jonathan Hart4cb39882015-08-12 23:50:55 -040079 private InterfaceService interfaceService;
80 private NetworkConfigService networkConfigService;
Jonathan Hartce430a42014-10-16 20:44:29 -070081
Jonathan Hart4cb39882015-08-12 23:50:55 -040082 private Set<BgpConfig.BgpSpeakerConfig> bgpSpeakers;
Jonathan Hartce430a42014-10-16 20:44:29 -070083 private Map<String, Interface> interfaces;
Jonathan Hartce430a42014-10-16 20:44:29 -070084
Jonathan Hart4cb39882015-08-12 23:50:55 -040085 private BgpConfig bgpConfig;
86
Jonathan Hartce430a42014-10-16 20:44:29 -070087 private List<PointToPointIntent> intentList;
88
Jonathan Hartce430a42014-10-16 20:44:29 -070089 private final DeviceId deviceId1 =
Jonathan Hart3d8ff282016-09-06 10:59:41 -070090 DeviceId.deviceId("of:0000000000000001");
Jonathan Hartce430a42014-10-16 20:44:29 -070091 private final DeviceId deviceId2 =
Jonathan Hart3d8ff282016-09-06 10:59:41 -070092 DeviceId.deviceId("of:0000000000000002");
Luca Prete8f2a3ce2016-03-29 16:13:01 -070093 private final DeviceId deviceId3 =
Jonathan Hart3d8ff282016-09-06 10:59:41 -070094 DeviceId.deviceId("of:0000000000000003");
Jonathan Hartce430a42014-10-16 20:44:29 -070095
96 // Interfaces connected to BGP speakers
97 private final ConnectPoint s1Eth100 =
98 new ConnectPoint(deviceId1, PortNumber.portNumber(100));
Luca Prete8f2a3ce2016-03-29 16:13:01 -070099 private final ConnectPoint s2Eth100 =
100 new ConnectPoint(deviceId2, PortNumber.portNumber(100));
101 private final ConnectPoint s3Eth100 =
102 new ConnectPoint(deviceId3, PortNumber.portNumber(100));
Jonathan Hartce430a42014-10-16 20:44:29 -0700103
104 // Interfaces connected to BGP peers
105 private final ConnectPoint s1Eth1 =
106 new ConnectPoint(deviceId1, PortNumber.portNumber(1));
107 private final ConnectPoint s2Eth1 =
108 new ConnectPoint(deviceId2, PortNumber.portNumber(1));
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700109 private final ConnectPoint s3Eth1 =
110 new ConnectPoint(deviceId3, PortNumber.portNumber(1));
Jonathan Hartce430a42014-10-16 20:44:29 -0700111
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700112 private static final VlanId NO_VLAN = VlanId.NONE;
113 private static final VlanId VLAN10 = VlanId.vlanId(Short.valueOf("10"));
114 private static final VlanId VLAN20 = VlanId.vlanId(Short.valueOf("20"));
115 private static final VlanId VLAN30 = VlanId.vlanId(Short.valueOf("30"));
Jonathan Hartce430a42014-10-16 20:44:29 -0700116
117 @Before
118 public void setUp() throws Exception {
Brian O'Connor520c0522014-11-23 23:50:47 -0800119 super.setUp();
Jonathan Hartb14221c2016-03-07 09:55:50 -0800120
Jonathan Hart4cb39882015-08-12 23:50:55 -0400121 interfaceService = createMock(InterfaceService.class);
Jonathan Hartb14221c2016-03-07 09:55:50 -0800122 interfaceService.addListener(anyObject(InterfaceListener.class));
123 expectLastCall().anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400124 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 Hartce430a42014-10-16 20:44:29 -0700132
133 initPeerConnectivity();
134 intentList = setUpIntentList();
135 }
136
137 /**
138 * Sets up BGP speakers.
139 *
140 * @return configured BGP speakers as a map from speaker name to speaker
141 */
Jonathan Hart4cb39882015-08-12 23:50:55 -0400142 private Set<BgpConfig.BgpSpeakerConfig> setUpBgpSpeakers() {
Jonathan Hartce430a42014-10-16 20:44:29 -0700143
Jonathan Hart4cb39882015-08-12 23:50:55 -0400144 BgpConfig.BgpSpeakerConfig speaker1 = new BgpConfig.BgpSpeakerConfig(
Jonathan Harta8625482015-09-08 16:14:56 -0700145 Optional.empty(),
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700146 NO_VLAN, s1Eth100,
147 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(),
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700151 NO_VLAN, s1Eth100,
152 Sets.newHashSet(IpAddress.valueOf("192.168.20.1"),
Jonathan Hart4cb39882015-08-12 23:50:55 -0400153 IpAddress.valueOf("192.168.30.1")));
Jonathan Hartce430a42014-10-16 20:44:29 -0700154
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700155 BgpConfig.BgpSpeakerConfig speaker3 = new BgpConfig.BgpSpeakerConfig(
156 Optional.empty(),
157 VLAN30, s3Eth100,
158 Sets.newHashSet(IpAddress.valueOf("192.168.40.1"),
159 IpAddress.valueOf("192.168.50.1")));
160
Jonathan Hart4cb39882015-08-12 23:50:55 -0400161 Set<BgpConfig.BgpSpeakerConfig> bgpSpeakers = Sets.newHashSet();
162 bgpSpeakers.add(speaker1);
163 bgpSpeakers.add(speaker2);
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700164 bgpSpeakers.add(speaker3);
Jonathan Hartce430a42014-10-16 20:44:29 -0700165
Jonathan Hart4cb39882015-08-12 23:50:55 -0400166 return bgpSpeakers;
Jonathan Hartce430a42014-10-16 20:44:29 -0700167 }
168
169 /**
170 * Sets up logical interfaces, which emulate the configured interfaces
171 * in SDN-IP application.
172 *
Jonathan Hart9a426f82015-09-03 15:43:13 +0200173 * @return configured interfaces as a map from interface name to Interface
Jonathan Hartce430a42014-10-16 20:44:29 -0700174 */
175 private Map<String, Interface> setUpInterfaces() {
176
Jonathan Hart9a426f82015-09-03 15:43:13 +0200177 Map<String, Interface> configuredInterfaces = new HashMap<>();
Jonathan Hartce430a42014-10-16 20:44:29 -0700178
179 String interfaceSw1Eth1 = "s1-eth1";
Pavlin Radoslavov76b0ae22014-10-27 15:33:19 -0700180 InterfaceIpAddress ia1 =
Jonathan Harte30fcda2015-08-06 16:22:34 -0700181 new InterfaceIpAddress(IpAddress.valueOf("192.168.10.101"),
Pavlin Radoslavov76b0ae22014-10-27 15:33:19 -0700182 IpPrefix.valueOf("192.168.10.0/24"));
Jonathan Hartb14221c2016-03-07 09:55:50 -0800183 Interface intfsw1eth1 = new Interface(interfaceSw1Eth1, s1Eth1,
Jonathan Hart00cddda2016-02-16 10:30:37 -0800184 Collections.singletonList(ia1),
Jonathan Hart6cd2f352015-01-13 17:44:45 -0800185 MacAddress.valueOf("00:00:00:00:00:01"),
186 VlanId.NONE);
Jonathan Hartce430a42014-10-16 20:44:29 -0700187
188 configuredInterfaces.put(interfaceSw1Eth1, intfsw1eth1);
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700189
Jonathan Hartce430a42014-10-16 20:44:29 -0700190 String interfaceSw2Eth1 = "s2-eth1";
Pavlin Radoslavov76b0ae22014-10-27 15:33:19 -0700191 InterfaceIpAddress ia2 =
Jonathan Harte30fcda2015-08-06 16:22:34 -0700192 new InterfaceIpAddress(IpAddress.valueOf("192.168.20.101"),
Pavlin Radoslavov76b0ae22014-10-27 15:33:19 -0700193 IpPrefix.valueOf("192.168.20.0/24"));
Jonathan Hartb14221c2016-03-07 09:55:50 -0800194 Interface intfsw2eth1 = new Interface(interfaceSw2Eth1, s2Eth1,
Jonathan Hart00cddda2016-02-16 10:30:37 -0800195 Collections.singletonList(ia2),
Jonathan Hart6cd2f352015-01-13 17:44:45 -0800196 MacAddress.valueOf("00:00:00:00:00:02"),
197 VlanId.NONE);
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700198
Jonathan Hartce430a42014-10-16 20:44:29 -0700199 configuredInterfaces.put(interfaceSw2Eth1, intfsw2eth1);
200
Jonathan Harte30fcda2015-08-06 16:22:34 -0700201 String interfaceSw2Eth1intf2 = "s2-eth1_2";
202 InterfaceIpAddress ia3 =
203 new InterfaceIpAddress(IpAddress.valueOf("192.168.30.101"),
204 IpPrefix.valueOf("192.168.30.0/24"));
Jonathan Hartb14221c2016-03-07 09:55:50 -0800205 Interface intfsw2eth1intf2 = new Interface(interfaceSw2Eth1intf2, s2Eth1,
Jonathan Hart00cddda2016-02-16 10:30:37 -0800206 Collections.singletonList(ia3),
Jonathan Harte30fcda2015-08-06 16:22:34 -0700207 MacAddress.valueOf("00:00:00:00:00:03"),
208 VlanId.NONE);
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700209
Jonathan Harte30fcda2015-08-06 16:22:34 -0700210 configuredInterfaces.put(interfaceSw2Eth1intf2, intfsw2eth1intf2);
211
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700212 String interfaceSw3Eth1 = "s3-eth1";
213 InterfaceIpAddress ia4 =
214 new InterfaceIpAddress(IpAddress.valueOf("192.168.40.101"),
215 IpPrefix.valueOf("192.168.40.0/24"));
Sho SHIMIZU891162b2016-06-06 16:32:01 -0700216 Interface intfsw3eth1 = new Interface(Interface.NO_INTERFACE_NAME,
217 s3Eth1,
218 ImmutableList.of(ia4),
219 MacAddress.valueOf("00:00:00:00:00:04"),
220 VLAN10);
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700221
222 configuredInterfaces.put(interfaceSw3Eth1, intfsw3eth1);
223
224 String interfaceSw3Eth1intf2 = "s3-eth1_2";
225 InterfaceIpAddress ia5 =
226 new InterfaceIpAddress(IpAddress.valueOf("192.168.50.101"),
227 IpPrefix.valueOf("192.168.50.0/24"));
Sho SHIMIZU891162b2016-06-06 16:32:01 -0700228 Interface intfsw3eth1intf2 = new Interface(Interface.NO_INTERFACE_NAME,
229 s3Eth1,
230 ImmutableList.of(ia5),
231 MacAddress.valueOf("00:00:00:00:00:05"),
232 VLAN20);
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700233
234 configuredInterfaces.put(interfaceSw3Eth1intf2, intfsw3eth1intf2);
235
Jonathan Hart4cb39882015-08-12 23:50:55 -0400236 expect(interfaceService.getInterfacesByPort(s1Eth1))
237 .andReturn(Collections.singleton(intfsw1eth1)).anyTimes();
238 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.10.101")))
239 .andReturn(Collections.singleton(intfsw1eth1)).anyTimes();
240 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.10.1")))
Jonathan Hartce430a42014-10-16 20:44:29 -0700241 .andReturn(intfsw1eth1).anyTimes();
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700242
Jonathan Hart4cb39882015-08-12 23:50:55 -0400243 expect(interfaceService.getInterfacesByPort(s2Eth1))
244 .andReturn(Collections.singleton(intfsw2eth1)).anyTimes();
245 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.20.101")))
246 .andReturn(Collections.singleton(intfsw2eth1)).anyTimes();
247 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.20.1")))
Jonathan Hartce430a42014-10-16 20:44:29 -0700248 .andReturn(intfsw2eth1).anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400249
250 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.30.101")))
251 .andReturn(Collections.singleton(intfsw2eth1intf2)).anyTimes();
252 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.30.1")))
Jonathan Harte30fcda2015-08-06 16:22:34 -0700253 .andReturn(intfsw2eth1intf2).anyTimes();
Jonathan Hartce430a42014-10-16 20:44:29 -0700254
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700255 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.40.101")))
256 .andReturn(Collections.singleton(intfsw3eth1)).anyTimes();
257 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.40.1")))
258 .andReturn(intfsw3eth1).anyTimes();
259
260 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.50.101")))
261 .andReturn(Collections.singleton(intfsw3eth1intf2)).anyTimes();
262 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.50.1")))
263 .andReturn(intfsw3eth1intf2).anyTimes();
264
Jonathan Hartce430a42014-10-16 20:44:29 -0700265 // Non-existent interface used during one of the tests
Jonathan Hart4cb39882015-08-12 23:50:55 -0400266 expect(interfaceService.getInterfacesByPort(new ConnectPoint(
Jonathan Hart3d8ff282016-09-06 10:59:41 -0700267 DeviceId.deviceId("of:0000000000000100"),
Jonathan Hart4cb39882015-08-12 23:50:55 -0400268 PortNumber.portNumber(1))))
Jonathan Hartce430a42014-10-16 20:44:29 -0700269 .andReturn(null).anyTimes();
270
Jonathan Hart4cb39882015-08-12 23:50:55 -0400271 expect(interfaceService.getInterfaces()).andReturn(
Jonathan Hartce430a42014-10-16 20:44:29 -0700272 Sets.newHashSet(configuredInterfaces.values())).anyTimes();
Jonathan Hartce430a42014-10-16 20:44:29 -0700273
274 return configuredInterfaces;
275 }
276
277 /**
Jonathan Hartce430a42014-10-16 20:44:29 -0700278 * Sets up expected point to point intent list.
279 *
280 * @return point to point intent list
281 */
282 private List<PointToPointIntent> setUpIntentList() {
Jonathan Hart90a02c22015-02-13 11:52:07 -0800283 intentList = new ArrayList<>();
Jonathan Hartce430a42014-10-16 20:44:29 -0700284
285 setUpBgpIntents();
286 setUpIcmpIntents();
287
288 return intentList;
Jonathan Hartce430a42014-10-16 20:44:29 -0700289 }
290
291 /**
292 * Constructs a BGP intent and put it into the intentList.
293 * <p/>
294 * The purpose of this method is too simplify the setUpBgpIntents() method,
295 * and to make the setUpBgpIntents() easy to read.
296 *
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700297 * @param srcVlanId ingress VlanId
298 * @param dstVlanId egress VlanId
Jonathan Hartce430a42014-10-16 20:44:29 -0700299 * @param srcPrefix source IP prefix to match
300 * @param dstPrefix destination IP prefix to match
301 * @param srcTcpPort source TCP port to match
302 * @param dstTcpPort destination TCP port to match
303 * @param srcConnectPoint source connect point for PointToPointIntent
304 * @param dstConnectPoint destination connect point for PointToPointIntent
305 */
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700306 private void bgpPathintentConstructor(VlanId srcVlanId, VlanId dstVlanId,
307 String srcPrefix, String dstPrefix,
308 Short srcTcpPort, Short dstTcpPort,
309 ConnectPoint srcConnectPoint,
310 ConnectPoint dstConnectPoint) {
Jonathan Hartce430a42014-10-16 20:44:29 -0700311
312 TrafficSelector.Builder builder = DefaultTrafficSelector.builder()
313 .matchEthType(Ethernet.TYPE_IPV4)
314 .matchIPProtocol(IPv4.PROTOCOL_TCP)
315 .matchIPSrc(IpPrefix.valueOf(srcPrefix))
316 .matchIPDst(IpPrefix.valueOf(dstPrefix));
317
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700318 if (!srcVlanId.equals(VlanId.NONE)) {
Luca Pretee4a5e1a2016-09-07 17:01:22 -0700319 builder.matchVlanId(srcVlanId);
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700320 }
321
322 TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
323
324 if (!dstVlanId.equals(VlanId.NONE)) {
325 treatment.setVlanId(dstVlanId);
326 }
327
Jonathan Hartce430a42014-10-16 20:44:29 -0700328 if (srcTcpPort != null) {
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700329 builder.matchTcpSrc(TpPort.tpPort(srcTcpPort));
Jonathan Hartce430a42014-10-16 20:44:29 -0700330 }
331 if (dstTcpPort != null) {
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700332 builder.matchTcpDst(TpPort.tpPort(dstTcpPort));
Jonathan Hartce430a42014-10-16 20:44:29 -0700333 }
334
Jonathan Hart9a426f82015-09-03 15:43:13 +0200335 Key key = Key.of(srcPrefix.split("/")[0] + "-" + dstPrefix.split("/")[0]
336 + "-" + ((srcTcpPort == null) ? "dst" : "src"), APPID);
337
Ray Milkey3e3ec5f2015-03-17 17:00:38 -0700338 PointToPointIntent intent = PointToPointIntent.builder()
339 .appId(APPID)
Jonathan Hart9a426f82015-09-03 15:43:13 +0200340 .key(key)
Ray Milkey3e3ec5f2015-03-17 17:00:38 -0700341 .selector(builder.build())
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700342 .treatment(treatment.build())
Ray Milkey3e3ec5f2015-03-17 17:00:38 -0700343 .ingressPoint(srcConnectPoint)
344 .egressPoint(dstConnectPoint)
345 .build();
Jonathan Hartce430a42014-10-16 20:44:29 -0700346
347 intentList.add(intent);
348 }
349
350 /**
351 * Sets up intents for BGP paths.
352 */
353 private void setUpBgpIntents() {
354
Jonathan Hart41349e92015-02-09 14:14:02 -0800355 Short bgpPort = 179;
Jonathan Hartce430a42014-10-16 20:44:29 -0700356
357 // Start to build intents between BGP speaker1 and BGP peer1
358 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700359 NO_VLAN, NO_VLAN,
360 "192.168.10.101/32", "192.168.10.1/32",
361 null, bgpPort,
Jonathan Hartce430a42014-10-16 20:44:29 -0700362 s1Eth100, s1Eth1);
363 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700364 NO_VLAN, NO_VLAN,
365 "192.168.10.101/32", "192.168.10.1/32",
366 bgpPort, null,
Jonathan Hartce430a42014-10-16 20:44:29 -0700367 s1Eth100, s1Eth1);
368
369 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700370 NO_VLAN, NO_VLAN,
371 "192.168.10.1/32", "192.168.10.101/32",
372 null, bgpPort,
Jonathan Hartce430a42014-10-16 20:44:29 -0700373 s1Eth1, s1Eth100);
374 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700375 NO_VLAN, NO_VLAN,
376 "192.168.10.1/32", "192.168.10.101/32",
377 bgpPort, null,
Jonathan Hartce430a42014-10-16 20:44:29 -0700378 s1Eth1, s1Eth100);
379
380 // Start to build intents between BGP speaker1 and BGP peer2
381 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700382 NO_VLAN, NO_VLAN,
383 "192.168.20.101/32", "192.168.20.1/32",
384 null, bgpPort,
Jonathan Hartce430a42014-10-16 20:44:29 -0700385 s1Eth100, s2Eth1);
386 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700387 NO_VLAN, NO_VLAN,
388 "192.168.20.101/32", "192.168.20.1/32",
389 bgpPort, null,
Jonathan Hartce430a42014-10-16 20:44:29 -0700390 s1Eth100, s2Eth1);
391
392 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700393 NO_VLAN, NO_VLAN,
394 "192.168.20.1/32", "192.168.20.101/32",
395 null, bgpPort,
Jonathan Hartce430a42014-10-16 20:44:29 -0700396 s2Eth1, s1Eth100);
397 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700398 NO_VLAN, NO_VLAN,
399 "192.168.20.1/32", "192.168.20.101/32",
400 bgpPort, null,
Jonathan Hartce430a42014-10-16 20:44:29 -0700401 s2Eth1, s1Eth100);
402
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700403 // Start to build intents between BGP speaker2 and BGP peer1
Jonathan Hartce430a42014-10-16 20:44:29 -0700404 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700405 NO_VLAN, NO_VLAN,
406 "192.168.30.101/32", "192.168.30.1/32",
407 null, bgpPort,
Jonathan Harte30fcda2015-08-06 16:22:34 -0700408 s1Eth100, s2Eth1);
Jonathan Hartce430a42014-10-16 20:44:29 -0700409 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700410 NO_VLAN, NO_VLAN,
411 "192.168.30.101/32", "192.168.30.1/32",
412 bgpPort, null,
Jonathan Harte30fcda2015-08-06 16:22:34 -0700413 s1Eth100, s2Eth1);
Jonathan Hartce430a42014-10-16 20:44:29 -0700414
415 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700416 NO_VLAN, NO_VLAN,
417 "192.168.30.1/32", "192.168.30.101/32",
418 null, bgpPort,
Jonathan Harte30fcda2015-08-06 16:22:34 -0700419 s2Eth1, s1Eth100);
Jonathan Hartce430a42014-10-16 20:44:29 -0700420 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700421 NO_VLAN, NO_VLAN,
422 "192.168.30.1/32", "192.168.30.101/32",
423 bgpPort, null,
Jonathan Harte30fcda2015-08-06 16:22:34 -0700424 s2Eth1, s1Eth100);
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700425
426 // Start to build intents between BGP speaker3 and BGP peer4
427 bgpPathintentConstructor(
428 VLAN30, VLAN10,
429 "192.168.40.101/32", "192.168.40.1/32",
430 null, bgpPort,
431 s3Eth100, s3Eth1);
432 bgpPathintentConstructor(
433 VLAN30, VLAN10,
434 "192.168.40.101/32", "192.168.40.1/32",
435 bgpPort, null,
436 s3Eth100, s3Eth1);
437
438 bgpPathintentConstructor(
439 VLAN10, VLAN30,
440 "192.168.40.1/32", "192.168.40.101/32",
441 null, bgpPort,
442 s3Eth1, s3Eth100);
443 bgpPathintentConstructor(
444 VLAN10, VLAN30,
445 "192.168.40.1/32", "192.168.40.101/32",
446 bgpPort, null,
447 s3Eth1, s3Eth100);
448
449 // Start to build intents between BGP speaker3 and BGP peer5
450 bgpPathintentConstructor(
451 VLAN30, VLAN20,
452 "192.168.50.101/32", "192.168.50.1/32",
453 null, bgpPort,
454 s3Eth100, s3Eth1);
455 bgpPathintentConstructor(
456 VLAN30, VLAN20,
457 "192.168.50.101/32", "192.168.50.1/32",
458 bgpPort, null,
459 s3Eth100, s3Eth1);
460
461 bgpPathintentConstructor(
462 VLAN20, VLAN30,
463 "192.168.50.1/32", "192.168.50.101/32",
464 null, bgpPort,
465 s3Eth1, s3Eth100);
466 bgpPathintentConstructor(
467 VLAN20, VLAN30,
468 "192.168.50.1/32", "192.168.50.101/32",
469 bgpPort, null,
470 s3Eth1, s3Eth100);
Jonathan Hartce430a42014-10-16 20:44:29 -0700471 }
472
473 /**
474 * Constructs a BGP intent and put it into the intentList.
475 * <p/>
476 * The purpose of this method is too simplify the setUpBgpIntents() method,
477 * and to make the setUpBgpIntents() easy to read.
478 *
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700479 * @param srcVlanId ingress VlanId
480 * @param dstVlanId egress VlanId
Jonathan Hartce430a42014-10-16 20:44:29 -0700481 * @param srcPrefix source IP prefix to match
482 * @param dstPrefix destination IP prefix to match
483 * @param srcConnectPoint source connect point for PointToPointIntent
484 * @param dstConnectPoint destination connect point for PointToPointIntent
485 */
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700486 private void icmpPathintentConstructor(VlanId srcVlanId, VlanId dstVlanId,
487 String srcPrefix, String dstPrefix,
488 ConnectPoint srcConnectPoint,
489 ConnectPoint dstConnectPoint) {
Jonathan Hartce430a42014-10-16 20:44:29 -0700490
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700491 TrafficSelector.Builder builder = DefaultTrafficSelector.builder()
Jonathan Hartce430a42014-10-16 20:44:29 -0700492 .matchEthType(Ethernet.TYPE_IPV4)
493 .matchIPProtocol(IPv4.PROTOCOL_ICMP)
494 .matchIPSrc(IpPrefix.valueOf(srcPrefix))
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700495 .matchIPDst(IpPrefix.valueOf(dstPrefix));
496
497 if (!srcVlanId.equals(VlanId.NONE)) {
Luca Pretee4a5e1a2016-09-07 17:01:22 -0700498 builder.matchVlanId(srcVlanId);
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700499 }
500
501 TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
502
503 if (!dstVlanId.equals(VlanId.NONE)) {
504 treatment.setVlanId(dstVlanId);
505 }
Jonathan Hartce430a42014-10-16 20:44:29 -0700506
Jonathan Hart9a426f82015-09-03 15:43:13 +0200507 Key key = Key.of(srcPrefix.split("/")[0] + "-" + dstPrefix.split("/")[0]
508 + "-" + "icmp", APPID);
509
Ray Milkey3e3ec5f2015-03-17 17:00:38 -0700510 PointToPointIntent intent = PointToPointIntent.builder()
511 .appId(APPID)
Jonathan Hart9a426f82015-09-03 15:43:13 +0200512 .key(key)
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700513 .selector(builder.build())
514 .treatment(treatment.build())
Ray Milkey3e3ec5f2015-03-17 17:00:38 -0700515 .ingressPoint(srcConnectPoint)
516 .egressPoint(dstConnectPoint)
517 .build();
Jonathan Hartce430a42014-10-16 20:44:29 -0700518
519 intentList.add(intent);
520 }
521
522 /**
523 * Sets up intents for ICMP paths.
524 */
525 private void setUpIcmpIntents() {
Jonathan Hartce430a42014-10-16 20:44:29 -0700526 // Start to build intents between BGP speaker1 and BGP peer1
527 icmpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700528 NO_VLAN, NO_VLAN,
529 "192.168.10.101/32", "192.168.10.1/32",
530 s1Eth100, s1Eth1);
Jonathan Hartce430a42014-10-16 20:44:29 -0700531 icmpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700532 NO_VLAN, NO_VLAN,
533 "192.168.10.1/32", "192.168.10.101/32",
534 s1Eth1, s1Eth100);
Jonathan Hartce430a42014-10-16 20:44:29 -0700535
536 // Start to build intents between BGP speaker1 and BGP peer2
537 icmpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700538 NO_VLAN, NO_VLAN,
539 "192.168.20.101/32", "192.168.20.1/32",
540 s1Eth100, s2Eth1);
Jonathan Hartce430a42014-10-16 20:44:29 -0700541 icmpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700542 NO_VLAN, NO_VLAN,
543 "192.168.20.1/32", "192.168.20.101/32",
544 s2Eth1, s1Eth100);
Jonathan Hartce430a42014-10-16 20:44:29 -0700545
Jonathan Hartce430a42014-10-16 20:44:29 -0700546 icmpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700547 NO_VLAN, NO_VLAN,
548 "192.168.30.101/32", "192.168.30.1/32",
549 s1Eth100, s2Eth1);
Jonathan Hartce430a42014-10-16 20:44:29 -0700550 icmpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700551 NO_VLAN, NO_VLAN,
552 "192.168.30.1/32", "192.168.30.101/32",
553 s2Eth1, s1Eth100);
554
555 // Start to build intents between BGP speaker3 and BGP peer 4
556 icmpPathintentConstructor(
557 VLAN10, VLAN30,
558 "192.168.40.1/32", "192.168.40.101/32",
559 s3Eth1, s3Eth100);
560 icmpPathintentConstructor(
561 VLAN30, VLAN10,
562 "192.168.40.101/32", "192.168.40.1/32",
563 s3Eth100, s3Eth1);
564
565 // Start to build intents between BGP speaker3 and BGP peer 5
566 icmpPathintentConstructor(
567 VLAN20, VLAN30,
568 "192.168.50.1/32", "192.168.50.101/32",
569 s3Eth1, s3Eth100);
570 icmpPathintentConstructor(
571 VLAN30, VLAN20,
572 "192.168.50.101/32", "192.168.50.1/32",
573 s3Eth100, s3Eth1);
Jonathan Hartce430a42014-10-16 20:44:29 -0700574 }
575
576 /**
577 * Initializes peer connectivity testing environment.
578 */
Jonathan Hartde6e2032016-04-15 13:28:02 -0700579 private void initPeerConnectivity() {
Jonathan Hart4cb39882015-08-12 23:50:55 -0400580 expect(bgpConfig.bgpSpeakers()).andReturn(bgpSpeakers).anyTimes();
581 replay(bgpConfig);
Jonathan Hart9a426f82015-09-03 15:43:13 +0200582 expect(networkConfigService.getConfig(APPID, BgpConfig.class))
583 .andReturn(bgpConfig).anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400584 replay(networkConfigService);
Jonathan Hart4cb39882015-08-12 23:50:55 -0400585 replay(interfaceService);
Jonathan Hartce430a42014-10-16 20:44:29 -0700586
Jonathan Hart9a426f82015-09-03 15:43:13 +0200587 intentSynchronizer = createMock(IntentSynchronizationService.class);
588 replay(intentSynchronizer);
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -0800589
590 peerConnectivityManager =
591 new PeerConnectivityManager(APPID, intentSynchronizer,
Jonathan Hart4cb39882015-08-12 23:50:55 -0400592 networkConfigService,
593 CONFIG_APP_ID,
594 interfaceService);
Jonathan Hartce430a42014-10-16 20:44:29 -0700595 }
596
Jonathan Hartce430a42014-10-16 20:44:29 -0700597 /**
598 * Tests whether peer connectivity manager can set up correct BGP and
599 * ICMP intents according to specific configuration.
600 * <p/>
601 * Two tricky cases included in the configuration are: 2 peers on a same
602 * switch port, peer on the same switch with BGPd.
603 */
604 @Test
605 public void testConnectionSetup() {
Jonathan Hart9a426f82015-09-03 15:43:13 +0200606 reset(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700607
Pavlin Radoslavovdde22ae2014-11-24 11:47:17 -0800608 // Setup the expected intents
Pavlin Radoslavovdde22ae2014-11-24 11:47:17 -0800609 for (Intent intent : intentList) {
Jonathan Hart9a426f82015-09-03 15:43:13 +0200610 intentSynchronizer.submit(eqExceptId(intent));
Jonathan Hartce430a42014-10-16 20:44:29 -0700611 }
Jonathan Hart9a426f82015-09-03 15:43:13 +0200612 replay(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700613
614 // Running the interface to be tested.
615 peerConnectivityManager.start();
616
Jonathan Hart9a426f82015-09-03 15:43:13 +0200617 verify(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700618 }
619
620 /**
621 * Tests a corner case, when there are no interfaces in the configuration.
622 */
623 @Test
624 public void testNullInterfaces() {
Jonathan Hart4cb39882015-08-12 23:50:55 -0400625 reset(interfaceService);
Jonathan Hartb14221c2016-03-07 09:55:50 -0800626 interfaceService.addListener(anyObject(InterfaceListener.class));
627 expectLastCall().anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400628
629 expect(interfaceService.getInterfaces()).andReturn(
Jonathan Hart9a426f82015-09-03 15:43:13 +0200630 Sets.newHashSet()).anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400631 expect(interfaceService.getInterfacesByPort(s2Eth1))
632 .andReturn(Collections.emptySet()).anyTimes();
633 expect(interfaceService.getInterfacesByPort(s1Eth1))
634 .andReturn(Collections.emptySet()).anyTimes();
635 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.10.101")))
636 .andReturn(Collections.emptySet()).anyTimes();
637 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.10.1")))
Jonathan Hartce430a42014-10-16 20:44:29 -0700638 .andReturn(null).anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400639 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.20.101")))
640 .andReturn(Collections.emptySet()).anyTimes();
641 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.20.1")))
Jonathan Harte30fcda2015-08-06 16:22:34 -0700642 .andReturn(null).anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400643 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.30.101")))
644 .andReturn(Collections.emptySet()).anyTimes();
645 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.30.1")))
Jonathan Harte30fcda2015-08-06 16:22:34 -0700646 .andReturn(null).anyTimes();
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700647 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.40.101")))
648 .andReturn(Collections.emptySet()).anyTimes();
649 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.40.1")))
650 .andReturn(null).anyTimes();
651 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.50.101")))
652 .andReturn(Collections.emptySet()).anyTimes();
653 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.50.1")))
654 .andReturn(null).anyTimes();
Jonathan Hartce430a42014-10-16 20:44:29 -0700655
Jonathan Hart4cb39882015-08-12 23:50:55 -0400656 replay(interfaceService);
Jonathan Hartce430a42014-10-16 20:44:29 -0700657
Jonathan Hart9a426f82015-09-03 15:43:13 +0200658 reset(intentSynchronizer);
659 replay(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700660 peerConnectivityManager.start();
Jonathan Hart9a426f82015-09-03 15:43:13 +0200661 verify(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700662 }
663
664 /**
665 * Tests a corner case, when there is no BGP speakers in the configuration.
666 */
667 @Test
668 public void testNullBgpSpeakers() {
Jonathan Hart4cb39882015-08-12 23:50:55 -0400669 reset(bgpConfig);
Jonathan Hart4cb39882015-08-12 23:50:55 -0400670 expect(bgpConfig.bgpSpeakers()).andReturn(Collections.emptySet()).anyTimes();
671 replay(bgpConfig);
Jonathan Hartce430a42014-10-16 20:44:29 -0700672
Jonathan Hartde6e2032016-04-15 13:28:02 -0700673 // We don't expect any intents in this case
Jonathan Hart9a426f82015-09-03 15:43:13 +0200674 reset(intentSynchronizer);
675 replay(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700676 peerConnectivityManager.start();
Jonathan Hart9a426f82015-09-03 15:43:13 +0200677 verify(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700678 }
679
680 /**
681 * Tests a corner case, when there is no Interface configured for one BGP
682 * peer.
683 */
684 @Test
685 public void testNoPeerInterface() {
Jonathan Hartde6e2032016-04-15 13:28:02 -0700686 IpAddress ip = IpAddress.valueOf("1.1.1.1");
687 bgpSpeakers.clear();
688 bgpSpeakers.add(new BgpConfig.BgpSpeakerConfig(Optional.of("foo"),
689 VlanId.NONE, s1Eth100, Collections.singleton(ip)));
690 reset(interfaceService);
691 interfaceService.addListener(anyObject(InterfaceListener.class));
692 expect(interfaceService.getMatchingInterface(ip)).andReturn(null).anyTimes();
693 replay(interfaceService);
694
695 // We don't expect any intents in this case
696 reset(intentSynchronizer);
697 replay(intentSynchronizer);
698 peerConnectivityManager.start();
699 verify(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700700 }
701
Jonathan Hartce430a42014-10-16 20:44:29 -0700702}