blob: 19e898ebffa7d57700a8b2bb0a2429a075d753f6 [file] [log] [blame]
Thomas Vachuska781d18b2014-10-27 10:31:25 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2014-present Open Networking Foundation
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;
Thomas Vachuska2048c1f2017-05-10 19:32:22 -070031import org.onosproject.intentsync.IntentSynchronizationService;
Brian O'Connorabafb502014-12-02 22:26:20 -080032import org.onosproject.net.ConnectPoint;
33import org.onosproject.net.DeviceId;
Luca Prete83bac342016-12-06 19:42:05 -080034import org.onosproject.net.EncapsulationType;
Ray Milkeya2cf3a12018-02-15 16:13:56 -080035import org.onosproject.net.FilteredConnectPoint;
Brian O'Connorabafb502014-12-02 22:26:20 -080036import 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;
Ray Milkeya2cf3a12018-02-15 16:13:56 -080048import org.onosproject.net.intf.Interface;
49import org.onosproject.net.intf.InterfaceListener;
50import org.onosproject.net.intf.InterfaceService;
Jonathan Hart4cb39882015-08-12 23:50:55 -040051import org.onosproject.routing.config.BgpConfig;
Luca Prete83bac342016-12-06 19:42:05 -080052import org.onosproject.sdnip.config.SdnIpConfig;
Jonathan Hartce430a42014-10-16 20:44:29 -070053
Jonathan Harte30fcda2015-08-06 16:22:34 -070054import java.util.ArrayList;
55import java.util.Collections;
56import java.util.HashMap;
Jonathan Harte30fcda2015-08-06 16:22:34 -070057import java.util.List;
58import java.util.Map;
Jonathan Harta8625482015-09-08 16:14:56 -070059import java.util.Optional;
Jonathan Hart4cb39882015-08-12 23:50:55 -040060import java.util.Set;
Jonathan Hart552e31f2015-02-06 11:11:59 -080061
Ray Milkeya2cf3a12018-02-15 16:13:56 -080062import static org.easymock.EasyMock.anyObject;
63import static org.easymock.EasyMock.createMock;
64import static org.easymock.EasyMock.expect;
65import static org.easymock.EasyMock.expectLastCall;
66import static org.easymock.EasyMock.replay;
67import static org.easymock.EasyMock.reset;
68import static org.easymock.EasyMock.verify;
Jonathan Hart33b81f22016-02-05 09:25:50 -080069import static org.onosproject.routing.TestIntentServiceHelper.eqExceptId;
Jonathan Hartce430a42014-10-16 20:44:29 -070070
71/**
Jonathan Hart51372182014-12-03 21:32:34 -080072 * Unit tests for PeerConnectivityManager.
Jonathan Hartce430a42014-10-16 20:44:29 -070073 */
Brian O'Connor520c0522014-11-23 23:50:47 -080074public class PeerConnectivityManagerTest extends AbstractIntentTest {
Jonathan Hartce430a42014-10-16 20:44:29 -070075
Jonathan Hart9a426f82015-09-03 15:43:13 +020076 private static final ApplicationId APPID = TestApplicationId.create("foo");
Thomas Vachuskab97cf282014-10-20 23:31:12 -070077
Jonathan Hart4cb39882015-08-12 23:50:55 -040078 private static final ApplicationId CONFIG_APP_ID = APPID;
79
Jonathan Hartce430a42014-10-16 20:44:29 -070080 private PeerConnectivityManager peerConnectivityManager;
Jonathan Hart9a426f82015-09-03 15:43:13 +020081 private IntentSynchronizationService intentSynchronizer;
Jonathan Hart4cb39882015-08-12 23:50:55 -040082 private InterfaceService interfaceService;
83 private NetworkConfigService networkConfigService;
Jonathan Hartce430a42014-10-16 20:44:29 -070084
Jonathan Hart4cb39882015-08-12 23:50:55 -040085 private Set<BgpConfig.BgpSpeakerConfig> bgpSpeakers;
Jonathan Hartce430a42014-10-16 20:44:29 -070086 private Map<String, Interface> interfaces;
Jonathan Hartce430a42014-10-16 20:44:29 -070087
Jonathan Hart4cb39882015-08-12 23:50:55 -040088 private BgpConfig bgpConfig;
89
Luca Prete83bac342016-12-06 19:42:05 -080090 private SdnIpConfig sdnIpConfig;
91
Jonathan Hartce430a42014-10-16 20:44:29 -070092 private List<PointToPointIntent> intentList;
93
Jonathan Hartce430a42014-10-16 20:44:29 -070094 private final DeviceId deviceId1 =
Jonathan Hart3d8ff282016-09-06 10:59:41 -070095 DeviceId.deviceId("of:0000000000000001");
Jonathan Hartce430a42014-10-16 20:44:29 -070096 private final DeviceId deviceId2 =
Jonathan Hart3d8ff282016-09-06 10:59:41 -070097 DeviceId.deviceId("of:0000000000000002");
Luca Prete8f2a3ce2016-03-29 16:13:01 -070098 private final DeviceId deviceId3 =
Jonathan Hart3d8ff282016-09-06 10:59:41 -070099 DeviceId.deviceId("of:0000000000000003");
Jonathan Hartce430a42014-10-16 20:44:29 -0700100
101 // Interfaces connected to BGP speakers
102 private final ConnectPoint s1Eth100 =
103 new ConnectPoint(deviceId1, PortNumber.portNumber(100));
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700104 private final ConnectPoint s2Eth100 =
105 new ConnectPoint(deviceId2, PortNumber.portNumber(100));
106 private final ConnectPoint s3Eth100 =
107 new ConnectPoint(deviceId3, PortNumber.portNumber(100));
Jonathan Hartce430a42014-10-16 20:44:29 -0700108
109 // Interfaces connected to BGP peers
110 private final ConnectPoint s1Eth1 =
111 new ConnectPoint(deviceId1, PortNumber.portNumber(1));
112 private final ConnectPoint s2Eth1 =
113 new ConnectPoint(deviceId2, PortNumber.portNumber(1));
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700114 private final ConnectPoint s3Eth1 =
115 new ConnectPoint(deviceId3, PortNumber.portNumber(1));
Jonathan Hartce430a42014-10-16 20:44:29 -0700116
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700117 private static final VlanId NO_VLAN = VlanId.NONE;
118 private static final VlanId VLAN10 = VlanId.vlanId(Short.valueOf("10"));
119 private static final VlanId VLAN20 = VlanId.vlanId(Short.valueOf("20"));
120 private static final VlanId VLAN30 = VlanId.vlanId(Short.valueOf("30"));
Jonathan Hartce430a42014-10-16 20:44:29 -0700121
122 @Before
Thomas Vachuska2048c1f2017-05-10 19:32:22 -0700123 public void setUp() {
Brian O'Connor520c0522014-11-23 23:50:47 -0800124 super.setUp();
Jonathan Hartb14221c2016-03-07 09:55:50 -0800125
Jonathan Hart4cb39882015-08-12 23:50:55 -0400126 interfaceService = createMock(InterfaceService.class);
Jonathan Hartb14221c2016-03-07 09:55:50 -0800127 interfaceService.addListener(anyObject(InterfaceListener.class));
128 expectLastCall().anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400129 networkConfigService = createMock(NetworkConfigService.class);
Jonathan Hart08105be2015-10-10 18:31:06 -0700130 networkConfigService.addListener(anyObject(NetworkConfigListener.class));
131 expectLastCall().anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400132 bgpConfig = createMock(BgpConfig.class);
Luca Prete83bac342016-12-06 19:42:05 -0800133 sdnIpConfig = createMock(SdnIpConfig.class);
Jonathan Hart90a02c22015-02-13 11:52:07 -0800134
Jonathan Hart4cb39882015-08-12 23:50:55 -0400135 // These will set expectations on routingConfig and interfaceService
136 bgpSpeakers = setUpBgpSpeakers();
Jonathan Hartce430a42014-10-16 20:44:29 -0700137 interfaces = Collections.unmodifiableMap(setUpInterfaces());
Jonathan Hartce430a42014-10-16 20:44:29 -0700138
139 initPeerConnectivity();
140 intentList = setUpIntentList();
141 }
142
143 /**
144 * Sets up BGP speakers.
145 *
146 * @return configured BGP speakers as a map from speaker name to speaker
147 */
Jonathan Hart4cb39882015-08-12 23:50:55 -0400148 private Set<BgpConfig.BgpSpeakerConfig> setUpBgpSpeakers() {
Jonathan Hartce430a42014-10-16 20:44:29 -0700149
Jonathan Hart4cb39882015-08-12 23:50:55 -0400150 BgpConfig.BgpSpeakerConfig speaker1 = new BgpConfig.BgpSpeakerConfig(
Jonathan Harta8625482015-09-08 16:14:56 -0700151 Optional.empty(),
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700152 NO_VLAN, s1Eth100,
153 Collections.singleton(IpAddress.valueOf("192.168.10.1")));
Jonathan Hartce430a42014-10-16 20:44:29 -0700154
Jonathan Hart4cb39882015-08-12 23:50:55 -0400155 BgpConfig.BgpSpeakerConfig speaker2 = new BgpConfig.BgpSpeakerConfig(
Jonathan Harta8625482015-09-08 16:14:56 -0700156 Optional.empty(),
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700157 NO_VLAN, s1Eth100,
158 Sets.newHashSet(IpAddress.valueOf("192.168.20.1"),
Jonathan Hart4cb39882015-08-12 23:50:55 -0400159 IpAddress.valueOf("192.168.30.1")));
Jonathan Hartce430a42014-10-16 20:44:29 -0700160
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700161 BgpConfig.BgpSpeakerConfig speaker3 = new BgpConfig.BgpSpeakerConfig(
162 Optional.empty(),
163 VLAN30, s3Eth100,
164 Sets.newHashSet(IpAddress.valueOf("192.168.40.1"),
165 IpAddress.valueOf("192.168.50.1")));
166
Jonathan Hart4cb39882015-08-12 23:50:55 -0400167 Set<BgpConfig.BgpSpeakerConfig> bgpSpeakers = Sets.newHashSet();
168 bgpSpeakers.add(speaker1);
169 bgpSpeakers.add(speaker2);
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700170 bgpSpeakers.add(speaker3);
Jonathan Hartce430a42014-10-16 20:44:29 -0700171
Jonathan Hart4cb39882015-08-12 23:50:55 -0400172 return bgpSpeakers;
Jonathan Hartce430a42014-10-16 20:44:29 -0700173 }
174
175 /**
176 * Sets up logical interfaces, which emulate the configured interfaces
Luca Prete83bac342016-12-06 19:42:05 -0800177 * in the SDN-IP application.
Jonathan Hartce430a42014-10-16 20:44:29 -0700178 *
Jonathan Hart9a426f82015-09-03 15:43:13 +0200179 * @return configured interfaces as a map from interface name to Interface
Jonathan Hartce430a42014-10-16 20:44:29 -0700180 */
181 private Map<String, Interface> setUpInterfaces() {
182
Jonathan Hart9a426f82015-09-03 15:43:13 +0200183 Map<String, Interface> configuredInterfaces = new HashMap<>();
Jonathan Hartce430a42014-10-16 20:44:29 -0700184
185 String interfaceSw1Eth1 = "s1-eth1";
Pavlin Radoslavov76b0ae22014-10-27 15:33:19 -0700186 InterfaceIpAddress ia1 =
Jonathan Harte30fcda2015-08-06 16:22:34 -0700187 new InterfaceIpAddress(IpAddress.valueOf("192.168.10.101"),
Pavlin Radoslavov76b0ae22014-10-27 15:33:19 -0700188 IpPrefix.valueOf("192.168.10.0/24"));
Jonathan Hartb14221c2016-03-07 09:55:50 -0800189 Interface intfsw1eth1 = new Interface(interfaceSw1Eth1, s1Eth1,
Jonathan Hart00cddda2016-02-16 10:30:37 -0800190 Collections.singletonList(ia1),
Jonathan Hart6cd2f352015-01-13 17:44:45 -0800191 MacAddress.valueOf("00:00:00:00:00:01"),
192 VlanId.NONE);
Jonathan Hartce430a42014-10-16 20:44:29 -0700193
194 configuredInterfaces.put(interfaceSw1Eth1, intfsw1eth1);
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700195
Jonathan Hartce430a42014-10-16 20:44:29 -0700196 String interfaceSw2Eth1 = "s2-eth1";
Pavlin Radoslavov76b0ae22014-10-27 15:33:19 -0700197 InterfaceIpAddress ia2 =
Jonathan Harte30fcda2015-08-06 16:22:34 -0700198 new InterfaceIpAddress(IpAddress.valueOf("192.168.20.101"),
Pavlin Radoslavov76b0ae22014-10-27 15:33:19 -0700199 IpPrefix.valueOf("192.168.20.0/24"));
Jonathan Hartb14221c2016-03-07 09:55:50 -0800200 Interface intfsw2eth1 = new Interface(interfaceSw2Eth1, s2Eth1,
Jonathan Hart00cddda2016-02-16 10:30:37 -0800201 Collections.singletonList(ia2),
Jonathan Hart6cd2f352015-01-13 17:44:45 -0800202 MacAddress.valueOf("00:00:00:00:00:02"),
203 VlanId.NONE);
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700204
Jonathan Hartce430a42014-10-16 20:44:29 -0700205 configuredInterfaces.put(interfaceSw2Eth1, intfsw2eth1);
206
Jonathan Harte30fcda2015-08-06 16:22:34 -0700207 String interfaceSw2Eth1intf2 = "s2-eth1_2";
208 InterfaceIpAddress ia3 =
209 new InterfaceIpAddress(IpAddress.valueOf("192.168.30.101"),
210 IpPrefix.valueOf("192.168.30.0/24"));
Jonathan Hartb14221c2016-03-07 09:55:50 -0800211 Interface intfsw2eth1intf2 = new Interface(interfaceSw2Eth1intf2, s2Eth1,
Jonathan Hart00cddda2016-02-16 10:30:37 -0800212 Collections.singletonList(ia3),
Jonathan Harte30fcda2015-08-06 16:22:34 -0700213 MacAddress.valueOf("00:00:00:00:00:03"),
214 VlanId.NONE);
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700215
Jonathan Harte30fcda2015-08-06 16:22:34 -0700216 configuredInterfaces.put(interfaceSw2Eth1intf2, intfsw2eth1intf2);
217
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700218 String interfaceSw3Eth1 = "s3-eth1";
219 InterfaceIpAddress ia4 =
220 new InterfaceIpAddress(IpAddress.valueOf("192.168.40.101"),
221 IpPrefix.valueOf("192.168.40.0/24"));
Sho SHIMIZU891162b2016-06-06 16:32:01 -0700222 Interface intfsw3eth1 = new Interface(Interface.NO_INTERFACE_NAME,
223 s3Eth1,
224 ImmutableList.of(ia4),
225 MacAddress.valueOf("00:00:00:00:00:04"),
226 VLAN10);
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700227
228 configuredInterfaces.put(interfaceSw3Eth1, intfsw3eth1);
229
230 String interfaceSw3Eth1intf2 = "s3-eth1_2";
231 InterfaceIpAddress ia5 =
232 new InterfaceIpAddress(IpAddress.valueOf("192.168.50.101"),
233 IpPrefix.valueOf("192.168.50.0/24"));
Sho SHIMIZU891162b2016-06-06 16:32:01 -0700234 Interface intfsw3eth1intf2 = new Interface(Interface.NO_INTERFACE_NAME,
235 s3Eth1,
236 ImmutableList.of(ia5),
237 MacAddress.valueOf("00:00:00:00:00:05"),
238 VLAN20);
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700239
240 configuredInterfaces.put(interfaceSw3Eth1intf2, intfsw3eth1intf2);
241
Jonathan Hart4cb39882015-08-12 23:50:55 -0400242 expect(interfaceService.getInterfacesByPort(s1Eth1))
243 .andReturn(Collections.singleton(intfsw1eth1)).anyTimes();
244 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.10.101")))
245 .andReturn(Collections.singleton(intfsw1eth1)).anyTimes();
246 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.10.1")))
Jonathan Hartce430a42014-10-16 20:44:29 -0700247 .andReturn(intfsw1eth1).anyTimes();
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700248
Jonathan Hart4cb39882015-08-12 23:50:55 -0400249 expect(interfaceService.getInterfacesByPort(s2Eth1))
250 .andReturn(Collections.singleton(intfsw2eth1)).anyTimes();
251 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.20.101")))
252 .andReturn(Collections.singleton(intfsw2eth1)).anyTimes();
253 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.20.1")))
Jonathan Hartce430a42014-10-16 20:44:29 -0700254 .andReturn(intfsw2eth1).anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400255
256 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.30.101")))
257 .andReturn(Collections.singleton(intfsw2eth1intf2)).anyTimes();
258 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.30.1")))
Jonathan Harte30fcda2015-08-06 16:22:34 -0700259 .andReturn(intfsw2eth1intf2).anyTimes();
Jonathan Hartce430a42014-10-16 20:44:29 -0700260
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700261 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.40.101")))
262 .andReturn(Collections.singleton(intfsw3eth1)).anyTimes();
263 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.40.1")))
264 .andReturn(intfsw3eth1).anyTimes();
265
266 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.50.101")))
267 .andReturn(Collections.singleton(intfsw3eth1intf2)).anyTimes();
268 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.50.1")))
269 .andReturn(intfsw3eth1intf2).anyTimes();
270
Jonathan Hartce430a42014-10-16 20:44:29 -0700271 // Non-existent interface used during one of the tests
Jonathan Hart4cb39882015-08-12 23:50:55 -0400272 expect(interfaceService.getInterfacesByPort(new ConnectPoint(
Jonathan Hart3d8ff282016-09-06 10:59:41 -0700273 DeviceId.deviceId("of:0000000000000100"),
Jonathan Hart4cb39882015-08-12 23:50:55 -0400274 PortNumber.portNumber(1))))
Jonathan Hartce430a42014-10-16 20:44:29 -0700275 .andReturn(null).anyTimes();
276
Jonathan Hart4cb39882015-08-12 23:50:55 -0400277 expect(interfaceService.getInterfaces()).andReturn(
Jonathan Hartce430a42014-10-16 20:44:29 -0700278 Sets.newHashSet(configuredInterfaces.values())).anyTimes();
Jonathan Hartce430a42014-10-16 20:44:29 -0700279
280 return configuredInterfaces;
281 }
282
283 /**
Jonathan Hartce430a42014-10-16 20:44:29 -0700284 * Sets up expected point to point intent list.
285 *
286 * @return point to point intent list
287 */
288 private List<PointToPointIntent> setUpIntentList() {
Jonathan Hart90a02c22015-02-13 11:52:07 -0800289 intentList = new ArrayList<>();
Jonathan Hartce430a42014-10-16 20:44:29 -0700290
291 setUpBgpIntents();
292 setUpIcmpIntents();
293
294 return intentList;
Jonathan Hartce430a42014-10-16 20:44:29 -0700295 }
296
297 /**
298 * Constructs a BGP intent and put it into the intentList.
299 * <p/>
300 * The purpose of this method is too simplify the setUpBgpIntents() method,
301 * and to make the setUpBgpIntents() easy to read.
302 *
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700303 * @param srcVlanId ingress VlanId
304 * @param dstVlanId egress VlanId
Jonathan Hartce430a42014-10-16 20:44:29 -0700305 * @param srcPrefix source IP prefix to match
306 * @param dstPrefix destination IP prefix to match
307 * @param srcTcpPort source TCP port to match
308 * @param dstTcpPort destination TCP port to match
309 * @param srcConnectPoint source connect point for PointToPointIntent
310 * @param dstConnectPoint destination connect point for PointToPointIntent
311 */
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700312 private void bgpPathintentConstructor(VlanId srcVlanId, VlanId dstVlanId,
313 String srcPrefix, String dstPrefix,
314 Short srcTcpPort, Short dstTcpPort,
315 ConnectPoint srcConnectPoint,
316 ConnectPoint dstConnectPoint) {
Jonathan Hartce430a42014-10-16 20:44:29 -0700317
318 TrafficSelector.Builder builder = DefaultTrafficSelector.builder()
319 .matchEthType(Ethernet.TYPE_IPV4)
320 .matchIPProtocol(IPv4.PROTOCOL_TCP)
321 .matchIPSrc(IpPrefix.valueOf(srcPrefix))
322 .matchIPDst(IpPrefix.valueOf(dstPrefix));
323
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700324 if (!srcVlanId.equals(VlanId.NONE)) {
Luca Pretee4a5e1a2016-09-07 17:01:22 -0700325 builder.matchVlanId(srcVlanId);
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700326 }
327
328 TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
329
330 if (!dstVlanId.equals(VlanId.NONE)) {
331 treatment.setVlanId(dstVlanId);
332 }
333
Jonathan Hartce430a42014-10-16 20:44:29 -0700334 if (srcTcpPort != null) {
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700335 builder.matchTcpSrc(TpPort.tpPort(srcTcpPort));
Jonathan Hartce430a42014-10-16 20:44:29 -0700336 }
337 if (dstTcpPort != null) {
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700338 builder.matchTcpDst(TpPort.tpPort(dstTcpPort));
Jonathan Hartce430a42014-10-16 20:44:29 -0700339 }
340
Jonathan Hart9a426f82015-09-03 15:43:13 +0200341 Key key = Key.of(srcPrefix.split("/")[0] + "-" + dstPrefix.split("/")[0]
342 + "-" + ((srcTcpPort == null) ? "dst" : "src"), APPID);
343
Ray Milkey3e3ec5f2015-03-17 17:00:38 -0700344 PointToPointIntent intent = PointToPointIntent.builder()
345 .appId(APPID)
Jonathan Hart9a426f82015-09-03 15:43:13 +0200346 .key(key)
Ray Milkey3e3ec5f2015-03-17 17:00:38 -0700347 .selector(builder.build())
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700348 .treatment(treatment.build())
Ray Milkeya2cf3a12018-02-15 16:13:56 -0800349 .filteredIngressPoint(new FilteredConnectPoint(srcConnectPoint))
350 .filteredEgressPoint(new FilteredConnectPoint(dstConnectPoint))
Ray Milkey3e3ec5f2015-03-17 17:00:38 -0700351 .build();
Jonathan Hartce430a42014-10-16 20:44:29 -0700352
353 intentList.add(intent);
354 }
355
356 /**
357 * Sets up intents for BGP paths.
358 */
359 private void setUpBgpIntents() {
360
Jonathan Hart41349e92015-02-09 14:14:02 -0800361 Short bgpPort = 179;
Jonathan Hartce430a42014-10-16 20:44:29 -0700362
363 // Start to build intents between BGP speaker1 and BGP peer1
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 null, bgpPort,
Jonathan Hartce430a42014-10-16 20:44:29 -0700368 s1Eth100, s1Eth1);
369 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700370 NO_VLAN, NO_VLAN,
371 "192.168.10.101/32", "192.168.10.1/32",
372 bgpPort, null,
Jonathan Hartce430a42014-10-16 20:44:29 -0700373 s1Eth100, s1Eth1);
374
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 null, bgpPort,
Jonathan Hartce430a42014-10-16 20:44:29 -0700379 s1Eth1, s1Eth100);
380 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700381 NO_VLAN, NO_VLAN,
382 "192.168.10.1/32", "192.168.10.101/32",
383 bgpPort, null,
Jonathan Hartce430a42014-10-16 20:44:29 -0700384 s1Eth1, s1Eth100);
385
386 // Start to build intents between BGP speaker1 and BGP peer2
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 null, bgpPort,
Jonathan Hartce430a42014-10-16 20:44:29 -0700391 s1Eth100, s2Eth1);
392 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700393 NO_VLAN, NO_VLAN,
394 "192.168.20.101/32", "192.168.20.1/32",
395 bgpPort, null,
Jonathan Hartce430a42014-10-16 20:44:29 -0700396 s1Eth100, s2Eth1);
397
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 null, bgpPort,
Jonathan Hartce430a42014-10-16 20:44:29 -0700402 s2Eth1, s1Eth100);
403 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700404 NO_VLAN, NO_VLAN,
405 "192.168.20.1/32", "192.168.20.101/32",
406 bgpPort, null,
Jonathan Hartce430a42014-10-16 20:44:29 -0700407 s2Eth1, s1Eth100);
408
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700409 // Start to build intents between BGP speaker2 and BGP peer1
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 null, bgpPort,
Jonathan Harte30fcda2015-08-06 16:22:34 -0700414 s1Eth100, s2Eth1);
Jonathan Hartce430a42014-10-16 20:44:29 -0700415 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700416 NO_VLAN, NO_VLAN,
417 "192.168.30.101/32", "192.168.30.1/32",
418 bgpPort, null,
Jonathan Harte30fcda2015-08-06 16:22:34 -0700419 s1Eth100, s2Eth1);
Jonathan Hartce430a42014-10-16 20:44:29 -0700420
421 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 null, bgpPort,
Jonathan Harte30fcda2015-08-06 16:22:34 -0700425 s2Eth1, s1Eth100);
Jonathan Hartce430a42014-10-16 20:44:29 -0700426 bgpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700427 NO_VLAN, NO_VLAN,
428 "192.168.30.1/32", "192.168.30.101/32",
429 bgpPort, null,
Jonathan Harte30fcda2015-08-06 16:22:34 -0700430 s2Eth1, s1Eth100);
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700431
432 // Start to build intents between BGP speaker3 and BGP peer4
433 bgpPathintentConstructor(
434 VLAN30, VLAN10,
435 "192.168.40.101/32", "192.168.40.1/32",
436 null, bgpPort,
437 s3Eth100, s3Eth1);
438 bgpPathintentConstructor(
439 VLAN30, VLAN10,
440 "192.168.40.101/32", "192.168.40.1/32",
441 bgpPort, null,
442 s3Eth100, s3Eth1);
443
444 bgpPathintentConstructor(
445 VLAN10, VLAN30,
446 "192.168.40.1/32", "192.168.40.101/32",
447 null, bgpPort,
448 s3Eth1, s3Eth100);
449 bgpPathintentConstructor(
450 VLAN10, VLAN30,
451 "192.168.40.1/32", "192.168.40.101/32",
452 bgpPort, null,
453 s3Eth1, s3Eth100);
454
455 // Start to build intents between BGP speaker3 and BGP peer5
456 bgpPathintentConstructor(
457 VLAN30, VLAN20,
458 "192.168.50.101/32", "192.168.50.1/32",
459 null, bgpPort,
460 s3Eth100, s3Eth1);
461 bgpPathintentConstructor(
462 VLAN30, VLAN20,
463 "192.168.50.101/32", "192.168.50.1/32",
464 bgpPort, null,
465 s3Eth100, s3Eth1);
466
467 bgpPathintentConstructor(
468 VLAN20, VLAN30,
469 "192.168.50.1/32", "192.168.50.101/32",
470 null, bgpPort,
471 s3Eth1, s3Eth100);
472 bgpPathintentConstructor(
473 VLAN20, VLAN30,
474 "192.168.50.1/32", "192.168.50.101/32",
475 bgpPort, null,
476 s3Eth1, s3Eth100);
Jonathan Hartce430a42014-10-16 20:44:29 -0700477 }
478
479 /**
480 * Constructs a BGP intent and put it into the intentList.
481 * <p/>
482 * The purpose of this method is too simplify the setUpBgpIntents() method,
483 * and to make the setUpBgpIntents() easy to read.
484 *
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700485 * @param srcVlanId ingress VlanId
486 * @param dstVlanId egress VlanId
Jonathan Hartce430a42014-10-16 20:44:29 -0700487 * @param srcPrefix source IP prefix to match
488 * @param dstPrefix destination IP prefix to match
489 * @param srcConnectPoint source connect point for PointToPointIntent
490 * @param dstConnectPoint destination connect point for PointToPointIntent
491 */
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700492 private void icmpPathintentConstructor(VlanId srcVlanId, VlanId dstVlanId,
493 String srcPrefix, String dstPrefix,
494 ConnectPoint srcConnectPoint,
495 ConnectPoint dstConnectPoint) {
Jonathan Hartce430a42014-10-16 20:44:29 -0700496
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700497 TrafficSelector.Builder builder = DefaultTrafficSelector.builder()
Jonathan Hartce430a42014-10-16 20:44:29 -0700498 .matchEthType(Ethernet.TYPE_IPV4)
499 .matchIPProtocol(IPv4.PROTOCOL_ICMP)
500 .matchIPSrc(IpPrefix.valueOf(srcPrefix))
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700501 .matchIPDst(IpPrefix.valueOf(dstPrefix));
502
503 if (!srcVlanId.equals(VlanId.NONE)) {
Luca Pretee4a5e1a2016-09-07 17:01:22 -0700504 builder.matchVlanId(srcVlanId);
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700505 }
506
507 TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
508
509 if (!dstVlanId.equals(VlanId.NONE)) {
510 treatment.setVlanId(dstVlanId);
511 }
Jonathan Hartce430a42014-10-16 20:44:29 -0700512
Jonathan Hart9a426f82015-09-03 15:43:13 +0200513 Key key = Key.of(srcPrefix.split("/")[0] + "-" + dstPrefix.split("/")[0]
514 + "-" + "icmp", APPID);
515
Ray Milkey3e3ec5f2015-03-17 17:00:38 -0700516 PointToPointIntent intent = PointToPointIntent.builder()
517 .appId(APPID)
Jonathan Hart9a426f82015-09-03 15:43:13 +0200518 .key(key)
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700519 .selector(builder.build())
520 .treatment(treatment.build())
Ray Milkeya2cf3a12018-02-15 16:13:56 -0800521 .filteredIngressPoint(new FilteredConnectPoint(srcConnectPoint))
522 .filteredEgressPoint(new FilteredConnectPoint(dstConnectPoint))
Ray Milkey3e3ec5f2015-03-17 17:00:38 -0700523 .build();
Jonathan Hartce430a42014-10-16 20:44:29 -0700524
525 intentList.add(intent);
526 }
527
528 /**
529 * Sets up intents for ICMP paths.
530 */
531 private void setUpIcmpIntents() {
Jonathan Hartce430a42014-10-16 20:44:29 -0700532 // Start to build intents between BGP speaker1 and BGP peer1
533 icmpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700534 NO_VLAN, NO_VLAN,
535 "192.168.10.101/32", "192.168.10.1/32",
536 s1Eth100, s1Eth1);
Jonathan Hartce430a42014-10-16 20:44:29 -0700537 icmpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700538 NO_VLAN, NO_VLAN,
539 "192.168.10.1/32", "192.168.10.101/32",
540 s1Eth1, s1Eth100);
Jonathan Hartce430a42014-10-16 20:44:29 -0700541
542 // Start to build intents between BGP speaker1 and BGP peer2
543 icmpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700544 NO_VLAN, NO_VLAN,
545 "192.168.20.101/32", "192.168.20.1/32",
546 s1Eth100, s2Eth1);
Jonathan Hartce430a42014-10-16 20:44:29 -0700547 icmpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700548 NO_VLAN, NO_VLAN,
549 "192.168.20.1/32", "192.168.20.101/32",
550 s2Eth1, s1Eth100);
Jonathan Hartce430a42014-10-16 20:44:29 -0700551
Jonathan Hartce430a42014-10-16 20:44:29 -0700552 icmpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700553 NO_VLAN, NO_VLAN,
554 "192.168.30.101/32", "192.168.30.1/32",
555 s1Eth100, s2Eth1);
Jonathan Hartce430a42014-10-16 20:44:29 -0700556 icmpPathintentConstructor(
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700557 NO_VLAN, NO_VLAN,
558 "192.168.30.1/32", "192.168.30.101/32",
559 s2Eth1, s1Eth100);
560
561 // Start to build intents between BGP speaker3 and BGP peer 4
562 icmpPathintentConstructor(
563 VLAN10, VLAN30,
564 "192.168.40.1/32", "192.168.40.101/32",
565 s3Eth1, s3Eth100);
566 icmpPathintentConstructor(
567 VLAN30, VLAN10,
568 "192.168.40.101/32", "192.168.40.1/32",
569 s3Eth100, s3Eth1);
570
571 // Start to build intents between BGP speaker3 and BGP peer 5
572 icmpPathintentConstructor(
573 VLAN20, VLAN30,
574 "192.168.50.1/32", "192.168.50.101/32",
575 s3Eth1, s3Eth100);
576 icmpPathintentConstructor(
577 VLAN30, VLAN20,
578 "192.168.50.101/32", "192.168.50.1/32",
579 s3Eth100, s3Eth1);
Jonathan Hartce430a42014-10-16 20:44:29 -0700580 }
581
582 /**
583 * Initializes peer connectivity testing environment.
584 */
Jonathan Hartde6e2032016-04-15 13:28:02 -0700585 private void initPeerConnectivity() {
Jonathan Hart4cb39882015-08-12 23:50:55 -0400586 expect(bgpConfig.bgpSpeakers()).andReturn(bgpSpeakers).anyTimes();
587 replay(bgpConfig);
Jonathan Hart9a426f82015-09-03 15:43:13 +0200588 expect(networkConfigService.getConfig(APPID, BgpConfig.class))
589 .andReturn(bgpConfig).anyTimes();
Luca Prete83bac342016-12-06 19:42:05 -0800590
591 expect(sdnIpConfig.encap()).andReturn(EncapsulationType.NONE).anyTimes();
592 replay(sdnIpConfig);
593 expect(networkConfigService.getConfig(APPID, SdnIpConfig.class))
594 .andReturn(sdnIpConfig).anyTimes();
595
Jonathan Hart4cb39882015-08-12 23:50:55 -0400596 replay(networkConfigService);
Jonathan Hart4cb39882015-08-12 23:50:55 -0400597 replay(interfaceService);
Jonathan Hartce430a42014-10-16 20:44:29 -0700598
Jonathan Hart9a426f82015-09-03 15:43:13 +0200599 intentSynchronizer = createMock(IntentSynchronizationService.class);
600 replay(intentSynchronizer);
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -0800601
602 peerConnectivityManager =
603 new PeerConnectivityManager(APPID, intentSynchronizer,
Jonathan Hart4cb39882015-08-12 23:50:55 -0400604 networkConfigService,
605 CONFIG_APP_ID,
606 interfaceService);
Jonathan Hartce430a42014-10-16 20:44:29 -0700607 }
608
Jonathan Hartce430a42014-10-16 20:44:29 -0700609 /**
610 * Tests whether peer connectivity manager can set up correct BGP and
611 * ICMP intents according to specific configuration.
612 * <p/>
613 * Two tricky cases included in the configuration are: 2 peers on a same
614 * switch port, peer on the same switch with BGPd.
615 */
616 @Test
617 public void testConnectionSetup() {
Jonathan Hart9a426f82015-09-03 15:43:13 +0200618 reset(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700619
Pavlin Radoslavovdde22ae2014-11-24 11:47:17 -0800620 // Setup the expected intents
Pavlin Radoslavovdde22ae2014-11-24 11:47:17 -0800621 for (Intent intent : intentList) {
Jonathan Hart9a426f82015-09-03 15:43:13 +0200622 intentSynchronizer.submit(eqExceptId(intent));
Jonathan Hartce430a42014-10-16 20:44:29 -0700623 }
Jonathan Hart9a426f82015-09-03 15:43:13 +0200624 replay(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700625
626 // Running the interface to be tested.
627 peerConnectivityManager.start();
628
Jonathan Hart9a426f82015-09-03 15:43:13 +0200629 verify(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700630 }
631
632 /**
633 * Tests a corner case, when there are no interfaces in the configuration.
634 */
635 @Test
636 public void testNullInterfaces() {
Jonathan Hart4cb39882015-08-12 23:50:55 -0400637 reset(interfaceService);
Jonathan Hartb14221c2016-03-07 09:55:50 -0800638 interfaceService.addListener(anyObject(InterfaceListener.class));
639 expectLastCall().anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400640
641 expect(interfaceService.getInterfaces()).andReturn(
Jonathan Hart9a426f82015-09-03 15:43:13 +0200642 Sets.newHashSet()).anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400643 expect(interfaceService.getInterfacesByPort(s2Eth1))
644 .andReturn(Collections.emptySet()).anyTimes();
645 expect(interfaceService.getInterfacesByPort(s1Eth1))
646 .andReturn(Collections.emptySet()).anyTimes();
647 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.10.101")))
648 .andReturn(Collections.emptySet()).anyTimes();
649 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.10.1")))
Jonathan Hartce430a42014-10-16 20:44:29 -0700650 .andReturn(null).anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400651 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.20.101")))
652 .andReturn(Collections.emptySet()).anyTimes();
653 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.20.1")))
Jonathan Harte30fcda2015-08-06 16:22:34 -0700654 .andReturn(null).anyTimes();
Jonathan Hart4cb39882015-08-12 23:50:55 -0400655 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.30.101")))
656 .andReturn(Collections.emptySet()).anyTimes();
657 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.30.1")))
Jonathan Harte30fcda2015-08-06 16:22:34 -0700658 .andReturn(null).anyTimes();
Luca Prete8f2a3ce2016-03-29 16:13:01 -0700659 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.40.101")))
660 .andReturn(Collections.emptySet()).anyTimes();
661 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.40.1")))
662 .andReturn(null).anyTimes();
663 expect(interfaceService.getInterfacesByIp(IpAddress.valueOf("192.168.50.101")))
664 .andReturn(Collections.emptySet()).anyTimes();
665 expect(interfaceService.getMatchingInterface(IpAddress.valueOf("192.168.50.1")))
666 .andReturn(null).anyTimes();
Jonathan Hartce430a42014-10-16 20:44:29 -0700667
Jonathan Hart4cb39882015-08-12 23:50:55 -0400668 replay(interfaceService);
Jonathan Hartce430a42014-10-16 20:44:29 -0700669
Jonathan Hart9a426f82015-09-03 15:43:13 +0200670 reset(intentSynchronizer);
671 replay(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700672 peerConnectivityManager.start();
Jonathan Hart9a426f82015-09-03 15:43:13 +0200673 verify(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700674 }
675
676 /**
677 * Tests a corner case, when there is no BGP speakers in the configuration.
678 */
679 @Test
680 public void testNullBgpSpeakers() {
Jonathan Hart4cb39882015-08-12 23:50:55 -0400681 reset(bgpConfig);
Jonathan Hart4cb39882015-08-12 23:50:55 -0400682 expect(bgpConfig.bgpSpeakers()).andReturn(Collections.emptySet()).anyTimes();
683 replay(bgpConfig);
Jonathan Hartce430a42014-10-16 20:44:29 -0700684
Luca Prete83bac342016-12-06 19:42:05 -0800685 reset(sdnIpConfig);
686 expect(sdnIpConfig.encap()).andReturn(EncapsulationType.NONE).anyTimes();
687 replay(sdnIpConfig);
688
Jonathan Hartde6e2032016-04-15 13:28:02 -0700689 // We don't expect any intents in this case
Jonathan Hart9a426f82015-09-03 15:43:13 +0200690 reset(intentSynchronizer);
691 replay(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700692 peerConnectivityManager.start();
Jonathan Hart9a426f82015-09-03 15:43:13 +0200693 verify(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700694 }
695
696 /**
697 * Tests a corner case, when there is no Interface configured for one BGP
698 * peer.
699 */
700 @Test
701 public void testNoPeerInterface() {
Jonathan Hartde6e2032016-04-15 13:28:02 -0700702 IpAddress ip = IpAddress.valueOf("1.1.1.1");
703 bgpSpeakers.clear();
704 bgpSpeakers.add(new BgpConfig.BgpSpeakerConfig(Optional.of("foo"),
705 VlanId.NONE, s1Eth100, Collections.singleton(ip)));
706 reset(interfaceService);
707 interfaceService.addListener(anyObject(InterfaceListener.class));
708 expect(interfaceService.getMatchingInterface(ip)).andReturn(null).anyTimes();
709 replay(interfaceService);
710
711 // We don't expect any intents in this case
712 reset(intentSynchronizer);
713 replay(intentSynchronizer);
714 peerConnectivityManager.start();
715 verify(intentSynchronizer);
Jonathan Hartce430a42014-10-16 20:44:29 -0700716 }
717
Jonathan Hartce430a42014-10-16 20:44:29 -0700718}