16 package org.openkilda.wfm.isl;
18 import static org.hamcrest.Matchers.everyItem;
19 import static org.hamcrest.Matchers.hasProperty;
20 import static org.hamcrest.Matchers.is;
21 import static org.junit.Assert.assertEquals;
22 import static org.junit.Assert.assertFalse;
23 import static org.junit.Assert.assertThat;
24 import static org.junit.Assert.assertTrue;
30 import org.junit.Before;
31 import org.junit.Test;
33 import java.util.HashMap;
34 import java.util.List;
35 import java.util.Optional;
56 private int islHealthCheckInterval;
57 private int islHealthFailureLimit;
59 private int maxAttemptsLimit;
60 private int minutesKeepRemovedIsl;
66 public void setUp() throws Exception {
67 islHealthCheckInterval = 0;
68 islHealthFailureLimit = 1;
70 minutesKeepRemovedIsl = 10;
73 islHealthFailureLimit, maxAttemptsLimit, minutesKeepRemovedIsl);
79 private void setupThreeLinks() {
87 dm.
handlePortUp(srcNode1.getDatapath(), srcNode1.getPortNumber());
88 dm.
handlePortUp(srcNode2.getDatapath(), srcNode2.getPortNumber());
89 dm.
handlePortUp(srcNode3.getDatapath(), srcNode3.getPortNumber());
98 assertEquals(3, discoveryPlan.needDiscovery.size());
99 assertEquals(0, discoveryPlan.discoveryFailure.size());
106 for (
int attempt = 0; attempt <= maxAttemptsLimit + islHealthFailureLimit + 1; attempt++) {
111 assertEquals(1, dm.findBySourceEndpoint(srcNode1).get().getAttempts());
112 assertEquals(1, dm.findBySourceEndpoint(srcNode2).get().getAttempts());
113 assertEquals(1, dm.findBySourceEndpoint(srcNode3).get().getAttempts());
117 assertEquals(1, dm.findBySourceEndpoint(srcNode1).get().getAckAttempts());
118 assertEquals(1, dm.findBySourceEndpoint(srcNode2).get().getAckAttempts());
119 assertEquals(1, dm.findBySourceEndpoint(srcNode3).get().getAckAttempts());
121 assertEquals(3, discoveryPlan.needDiscovery.size());
122 assertEquals(0, discoveryPlan.discoveryFailure.size());
125 dstNode1.getDatapath(), dstNode1.getPortNumber());
127 dstNode2.getDatapath(), dstNode2.getPortNumber());
129 dstNode3.getDatapath(), dstNode3.getPortNumber());
138 islHealthCheckInterval, islHealthFailureLimit,
false);
140 dm.
handlePortUp(srcNode.getDatapath(), srcNode.getPortNumber());
145 link.getDestination().getDatapath(), link.getDestination().getPortNumber());
147 assertTrue(dm.findBySourceEndpoint(srcNode).get().isActive());
151 assertEquals(1, discoveryPlan.needDiscovery.size());
152 assertEquals(0, discoveryPlan.discoveryFailure.size());
154 assertTrue(dm.findBySourceEndpoint(srcNode).get().isActive());
158 assertEquals(1, discoveryPlan.needDiscovery.size());
159 assertEquals(0, discoveryPlan.discoveryFailure.size());
161 assertTrue(dm.findBySourceEndpoint(srcNode).get().isActive());
166 assertEquals(1, discoveryPlan.needDiscovery.size());
167 assertEquals(1, discoveryPlan.discoveryFailure.size());
169 assertFalse(dm.findBySourceEndpoint(srcNode).get().isActive());
173 assertEquals(1, discoveryPlan.needDiscovery.size());
174 assertEquals(0, discoveryPlan.discoveryFailure.size());
176 assertFalse(dm.findBySourceEndpoint(srcNode).get().isActive());
181 assertEquals(0, discoveryPlan.needDiscovery.size());
182 assertEquals(0, discoveryPlan.discoveryFailure.size());
183 assertFalse(dm.findBySourceEndpoint(srcNode).get().isActive());
191 for (
int attempt = 0; attempt <= maxAttemptsLimit + islHealthFailureLimit; attempt++) {
194 assertEquals(3, discoveryPlan.needDiscovery.size());
195 assertEquals(0, discoveryPlan.discoveryFailure.size());
201 assertEquals(0, discoveryPlan.needDiscovery.size());
202 assertEquals(0, discoveryPlan.discoveryFailure.size());
206 dstNode1.getDatapath(), dstNode1.getPortNumber());
208 srcNode2.getPortNumber(), dstNode2.getDatapath(), dstNode2.getPortNumber());
210 dstNode3.getDatapath(), dstNode3.getPortNumber());
212 assertEquals(3, discoveryPlan.needDiscovery.size());
213 assertEquals(0, discoveryPlan.discoveryFailure.size());
221 for (
int attempt = 0; attempt <= maxAttemptsLimit + islHealthFailureLimit + 1; attempt++) {
224 assertEquals(3, discoveryPlan.needDiscovery.size());
225 assertEquals(0, discoveryPlan.discoveryFailure.size());
236 dstNode1.getDatapath(), dstNode1.getPortNumber());
238 dstNode2.getDatapath(), dstNode2.getPortNumber());
240 dstNode3.getDatapath(), dstNode3.getPortNumber());
243 for (
int attempt = 0; attempt <= maxAttemptsLimit + islHealthFailureLimit + 1; attempt++) {
245 assertEquals(3, discoveryPlan.needDiscovery.size());
246 assertEquals(0, discoveryPlan.discoveryFailure.size());
255 islHealthCheckInterval = 2;
256 islHealthFailureLimit = 4;
257 maxAttemptsLimit = 8;
260 islHealthFailureLimit, maxAttemptsLimit, minutesKeepRemovedIsl);
264 assertEquals(0, discoveryPlan.needDiscovery.size());
265 assertEquals(0, discoveryPlan.discoveryFailure.size());
269 assertEquals(0, discoveryPlan.needDiscovery.size());
270 assertEquals(0, discoveryPlan.discoveryFailure.size());
274 assertEquals(3, discoveryPlan.needDiscovery.size());
275 assertEquals(0, discoveryPlan.discoveryFailure.size());
279 assertEquals(0, discoveryPlan.needDiscovery.size());
280 assertEquals(0, discoveryPlan.discoveryFailure.size());
313 List<DiscoveryLink>
nodes;
339 dstNode1.getDatapath(), dstNode1.getPortNumber());
341 dstNode2.getDatapath(), dstNode2.getPortNumber());
343 dstNode3.getDatapath(), dstNode3.getPortNumber());
345 Set<DiscoveryLink> links = dm.findAllBySwitch(srcNode1.getDatapath());
346 assertThat(links, everyItem(hasProperty(
"active", is(
true))));
347 links = dm.findAllBySwitch(srcNode3.getDatapath());
348 assertThat(links, everyItem(hasProperty(
"active", is(
true))));
352 links = dm.findAllBySwitch(srcNode1.getDatapath());
353 assertThat(links, everyItem(hasProperty(
"active", is(
false))));
354 links = dm.findAllBySwitch(srcNode3.getDatapath());
355 assertThat(links, everyItem(hasProperty(
"active", is(
true))));
359 dstNode1.getDatapath(), dstNode1.getPortNumber());
361 dstNode2.getDatapath(), dstNode2.getPortNumber());
362 links = dm.findAllBySwitch(srcNode1.getDatapath());
363 assertThat(links, everyItem(hasProperty(
"active", is(
true))));
364 links = dm.findAllBySwitch(srcNode3.getDatapath());
365 assertThat(links, everyItem(hasProperty(
"active", is(
true))));
374 Set<DiscoveryLink> links = dm.findAllBySwitch(srcNode1.getDatapath());
375 assertEquals(2, links.size());
376 links = dm.findAllBySwitch(srcNode3.getDatapath());
377 assertEquals(1, links.size());
381 links = dm.findAllBySwitch(srcNode1.getDatapath());
382 assertEquals(0, links.size());
383 links = dm.findAllBySwitch((srcNode3.getDatapath()));
384 assertEquals(1, links.size());
396 Optional<DiscoveryLink> discoveryLink =
398 assertTrue(discoveryLink.isPresent());
399 assertEquals(link, discoveryLink.get());
404 assertTrue(discoveryLink.isPresent());
405 assertEquals(link, discoveryLink.get());
418 Optional<DiscoveryLink> discoveryLink =
420 assertFalse(discoveryLink.isPresent());
425 assertFalse(discoveryLink.isPresent());
434 assertTrue(stateChanged);
438 assertFalse(stateChanged);
442 assertTrue(stateChanged);
490 Optional<DiscoveryLink> links = dm.findBySourceEndpoint(
source);
491 assertTrue(links.isPresent());
492 assertEquals(0, links.get().getAckAttempts());
493 assertEquals(0, links.get().getAttempts());
497 links = dm.findBySourceEndpoint(
source);
498 assertTrue(links.isPresent());
499 assertEquals(1, links.get().getAckAttempts());
500 assertEquals(0, links.get().getAttempts());
503 private void verifyAllLinks() {
504 assertTrue(dm.findBySourceEndpoint(srcNode1).isPresent()
505 && dm.findBySourceEndpoint(srcNode1).get().isActive());
506 assertTrue(dm.findBySourceEndpoint(srcNode2).isPresent()
507 && dm.findBySourceEndpoint(srcNode2).get().isActive());
508 assertTrue(dm.findBySourceEndpoint(srcNode3).isPresent()
509 && dm.findBySourceEndpoint(srcNode3).get().isActive());
517 Optional<DiscoveryLink> foundAsLink1Before = dm.findBySourceEndpoint(srcNode1);
518 assertTrue(foundAsLink1Before.isPresent());
519 foundAsLink1Before.get().activate(dstNode1);
523 assertEquals(affectedLink.getSource(), srcNode1);
524 assertTrue(
"The link must be active.", affectedLink.isActive());
527 Optional<DiscoveryLink> foundAsLink1After = dm.findBySourceEndpoint(srcNode1);
528 assertTrue(foundAsLink1After.isPresent());
529 assertTrue(
"The link must be active.", foundAsLink1After.get().isActive());
539 Optional<DiscoveryLink> foundAsLink4Before = dm.findBySourceEndpoint(srcNode4);
540 assertFalse(foundAsLink4Before.isPresent());
544 assertEquals(addedLink.getSource(), srcNode4);
545 assertFalse(
"The link must be inactive.", addedLink.isActive());
548 Optional<DiscoveryLink> foundAsLink4After = dm.findBySourceEndpoint(srcNode4);
549 assertTrue(foundAsLink4After.isPresent());
void shouldNotStopSendingDiscoIfConfirmationOfSendingDiscoIsNotReceived()
void shouldNotDeactivateLinkOnPortRegistration()
void shouldEndpointBeRemovedFromDiscoveryPlanAfterFailures()
boolean isInDiscoveryPlan(SwitchId switchId, int portId)
void shouldBreakDiscoveredLinkCorrectly()
void shouldReturnFalseWhenDiscoPacketsAreNotSendingFromEndpoint()
void handlePortUp(SwitchId switchId, int portId)
void handlePortDown(SwitchId switchId, int portId)
DiscoveryLink registerPort(SwitchId switchId, int portId)
void shouldReturnTrueWhenEndpointIsSendingDisco()
void shouldDiscoveryPlanContainsAllEndpoints()
void handleSentDiscoPacket(NetworkEndpoint endpoint)
boolean handleFailed(SwitchId switchId, int portId)
void shouldAddInactiveLinkOnPortRegistration()
final List< NetworkEndpoint > needDiscovery
void shouldIslBeAbandonedAfterSeveralConsecutiveFailures()
void shouldIncreaseAcknowledgedAttempts()
void shouldWorksCorrectlyWhenIslUpdating()
void shouldCheckIslWithInterval()
void handleSwitchUp(SwitchId switchId)
void handleSwitchDown(SwitchId switchId)
void shouldNotBreakActiveIslIfConfirmationOfSendingDiscoIsNotReceived()
boolean handleDiscovered(SwitchId srcSwitch, int srcPort, SwitchId dstSwitch, int dstPort)
void shouldAlwaysSendDiscoveryForActiveLinks()