Committed by
Gerrit Code Review
ONOS-2926 Remove IP instead of host when the IP mapping is released
Change-Id: Ifea3366ce8a18ea068e615636b3069e769221c0e
Showing
11 changed files
with
91 additions
and
7 deletions
... | @@ -65,7 +65,7 @@ public interface DhcpStore { | ... | @@ -65,7 +65,7 @@ public interface DhcpStore { |
65 | * | 65 | * |
66 | * @param hostId the host ID for which the mapping needs to be changed | 66 | * @param hostId the host ID for which the mapping needs to be changed |
67 | */ | 67 | */ |
68 | - void releaseIP(HostId hostId); | 68 | + Ip4Address releaseIP(HostId hostId); |
69 | 69 | ||
70 | /** | 70 | /** |
71 | * Returns a collection of all the MacAddress to IPAddress mapping assigned to the hosts. | 71 | * Returns a collection of all the MacAddress to IPAddress mapping assigned to the hosts. | ... | ... |
... | @@ -481,7 +481,10 @@ public class DhcpManager implements DhcpService { | ... | @@ -481,7 +481,10 @@ public class DhcpManager implements DhcpService { |
481 | } | 481 | } |
482 | } | 482 | } |
483 | } else if (incomingPacketType.getValue() == DHCPPacketType.DHCPRELEASE.getValue()) { | 483 | } else if (incomingPacketType.getValue() == DHCPPacketType.DHCPRELEASE.getValue()) { |
484 | - dhcpStore.releaseIP(hostId); | 484 | + Ip4Address ip4Address = dhcpStore.releaseIP(hostId); |
485 | + if (ip4Address != null) { | ||
486 | + hostProviderService.removeIpFromHost(hostId, ip4Address); | ||
487 | + } | ||
485 | } | 488 | } |
486 | } | 489 | } |
487 | } | 490 | } |
... | @@ -666,9 +669,10 @@ public class DhcpManager implements DhcpService { | ... | @@ -666,9 +669,10 @@ public class DhcpManager implements DhcpService { |
666 | if ((ipAssignment.assignmentStatus() != IpAssignment.AssignmentStatus.Option_Expired) && | 669 | if ((ipAssignment.assignmentStatus() != IpAssignment.AssignmentStatus.Option_Expired) && |
667 | (ipAssignment.leasePeriod() > 0) && (timeLapsed > (ipAssignment.leasePeriodMs()))) { | 670 | (ipAssignment.leasePeriod() > 0) && (timeLapsed > (ipAssignment.leasePeriodMs()))) { |
668 | 671 | ||
669 | - dhcpStore.releaseIP(entry.getKey()); | 672 | + Ip4Address ip4Address = dhcpStore.releaseIP(entry.getKey()); |
670 | - // TODO remove only the IP from the host entry when the API is in place. | 673 | + if (ip4Address != null) { |
671 | - hostProviderService.hostVanished(entry.getKey()); | 674 | + hostProviderService.removeIpFromHost(entry.getKey(), ipAssignment.ipAddress()); |
675 | + } | ||
672 | } | 676 | } |
673 | } | 677 | } |
674 | timeout = Timer.getTimer().newTimeout(new PurgeListTask(), timerDelay, TimeUnit.MINUTES); | 678 | timeout = Timer.getTimer().newTimeout(new PurgeListTask(), timerDelay, TimeUnit.MINUTES); | ... | ... |
... | @@ -212,7 +212,7 @@ public class DistributedDhcpStore implements DhcpStore { | ... | @@ -212,7 +212,7 @@ public class DistributedDhcpStore implements DhcpStore { |
212 | } | 212 | } |
213 | 213 | ||
214 | @Override | 214 | @Override |
215 | - public void releaseIP(HostId hostId) { | 215 | + public Ip4Address releaseIP(HostId hostId) { |
216 | if (allocationMap.containsKey(hostId)) { | 216 | if (allocationMap.containsKey(hostId)) { |
217 | IpAssignment newAssignment = IpAssignment.builder(allocationMap.get(hostId).value()) | 217 | IpAssignment newAssignment = IpAssignment.builder(allocationMap.get(hostId).value()) |
218 | .assignmentStatus(IpAssignment.AssignmentStatus.Option_Expired) | 218 | .assignmentStatus(IpAssignment.AssignmentStatus.Option_Expired) |
... | @@ -222,7 +222,9 @@ public class DistributedDhcpStore implements DhcpStore { | ... | @@ -222,7 +222,9 @@ public class DistributedDhcpStore implements DhcpStore { |
222 | if (ipWithinRange(freeIP)) { | 222 | if (ipWithinRange(freeIP)) { |
223 | freeIPPool.add(freeIP); | 223 | freeIPPool.add(freeIP); |
224 | } | 224 | } |
225 | + return freeIP; | ||
225 | } | 226 | } |
227 | + return null; | ||
226 | } | 228 | } |
227 | 229 | ||
228 | @Override | 230 | @Override | ... | ... |
... | @@ -25,6 +25,7 @@ import org.onlab.packet.DHCPPacketType; | ... | @@ -25,6 +25,7 @@ import org.onlab.packet.DHCPPacketType; |
25 | import org.onlab.packet.Ethernet; | 25 | import org.onlab.packet.Ethernet; |
26 | import org.onlab.packet.IPv4; | 26 | import org.onlab.packet.IPv4; |
27 | import org.onlab.packet.Ip4Address; | 27 | import org.onlab.packet.Ip4Address; |
28 | +import org.onlab.packet.IpAddress; | ||
28 | import org.onlab.packet.MacAddress; | 29 | import org.onlab.packet.MacAddress; |
29 | import org.onlab.packet.UDP; | 30 | import org.onlab.packet.UDP; |
30 | import org.onosproject.core.CoreServiceAdapter; | 31 | import org.onosproject.core.CoreServiceAdapter; |
... | @@ -234,7 +235,8 @@ public class DhcpManagerTest { | ... | @@ -234,7 +235,8 @@ public class DhcpManagerTest { |
234 | public void setDefaultTimeoutForPurge(int timeInSeconds) { | 235 | public void setDefaultTimeoutForPurge(int timeInSeconds) { |
235 | } | 236 | } |
236 | 237 | ||
237 | - public void releaseIP(HostId hostId) { | 238 | + public Ip4Address releaseIP(HostId hostId) { |
239 | + return null; | ||
238 | } | 240 | } |
239 | 241 | ||
240 | public Map<HostId, IpAssignment> listAssignedMapping() { | 242 | public Map<HostId, IpAssignment> listAssignedMapping() { |
... | @@ -338,6 +340,11 @@ public class DhcpManagerTest { | ... | @@ -338,6 +340,11 @@ public class DhcpManagerTest { |
338 | public void hostVanished(HostId hostId) { | 340 | public void hostVanished(HostId hostId) { |
339 | } | 341 | } |
340 | 342 | ||
343 | + @Override | ||
344 | + public void removeIpFromHost(HostId hostId, IpAddress ipAddress) { | ||
345 | + | ||
346 | + } | ||
347 | + | ||
341 | } | 348 | } |
342 | 349 | ||
343 | /** | 350 | /** | ... | ... |
... | @@ -15,6 +15,7 @@ | ... | @@ -15,6 +15,7 @@ |
15 | */ | 15 | */ |
16 | package org.onosproject.net.host; | 16 | package org.onosproject.net.host; |
17 | 17 | ||
18 | +import org.onlab.packet.IpAddress; | ||
18 | import org.onosproject.net.HostId; | 19 | import org.onosproject.net.HostId; |
19 | import org.onosproject.net.provider.ProviderService; | 20 | import org.onosproject.net.provider.ProviderService; |
20 | 21 | ||
... | @@ -52,4 +53,11 @@ public interface HostProviderService extends ProviderService<HostProvider> { | ... | @@ -52,4 +53,11 @@ public interface HostProviderService extends ProviderService<HostProvider> { |
52 | */ | 53 | */ |
53 | void hostVanished(HostId hostId); | 54 | void hostVanished(HostId hostId); |
54 | 55 | ||
56 | + /** | ||
57 | + * Notifies the core when a host is no longer detected on a network. | ||
58 | + * | ||
59 | + * @param hostId id of the host that vanished | ||
60 | + */ | ||
61 | + void removeIpFromHost(HostId hostId, IpAddress ipAddress); | ||
62 | + | ||
55 | } | 63 | } | ... | ... |
... | @@ -55,6 +55,15 @@ public interface HostStore extends Store<HostEvent, HostStoreDelegate> { | ... | @@ -55,6 +55,15 @@ public interface HostStore extends Store<HostEvent, HostStoreDelegate> { |
55 | HostEvent removeHost(HostId hostId); | 55 | HostEvent removeHost(HostId hostId); |
56 | 56 | ||
57 | /** | 57 | /** |
58 | + * Removes the specified ip from the host entry. | ||
59 | + * | ||
60 | + * @param hostId host identification | ||
61 | + * @param ipAddress ipAddress to be removed | ||
62 | + * @return remove event or null if host was not found | ||
63 | + */ | ||
64 | + HostEvent removeIp(HostId hostId, IpAddress ipAddress); | ||
65 | + | ||
66 | + /** | ||
58 | * Returns the number of hosts in the store. | 67 | * Returns the number of hosts in the store. |
59 | * | 68 | * |
60 | * @return host count | 69 | * @return host count | ... | ... |
... | @@ -160,6 +160,11 @@ public class SimpleHostStore | ... | @@ -160,6 +160,11 @@ public class SimpleHostStore |
160 | } | 160 | } |
161 | 161 | ||
162 | @Override | 162 | @Override |
163 | + public HostEvent removeIp(HostId hostId, IpAddress ipAddress) { | ||
164 | + return null; | ||
165 | + } | ||
166 | + | ||
167 | + @Override | ||
163 | public int getHostCount() { | 168 | public int getHostCount() { |
164 | return hosts.size(); | 169 | return hosts.size(); |
165 | } | 170 | } | ... | ... |
... | @@ -236,6 +236,16 @@ public class HostManager | ... | @@ -236,6 +236,16 @@ public class HostManager |
236 | post(event); | 236 | post(event); |
237 | } | 237 | } |
238 | } | 238 | } |
239 | + | ||
240 | + @Override | ||
241 | + public void removeIpFromHost(HostId hostId, IpAddress ipAddress) { | ||
242 | + checkNotNull(hostId, HOST_ID_NULL); | ||
243 | + checkValidity(); | ||
244 | + HostEvent event = store.removeIp(hostId, ipAddress); | ||
245 | + if (event != null) { | ||
246 | + post(event); | ||
247 | + } | ||
248 | + } | ||
239 | } | 249 | } |
240 | 250 | ||
241 | // Store delegate to re-post events emitted from the store. | 251 | // Store delegate to re-post events emitted from the store. | ... | ... |
... | @@ -27,6 +27,7 @@ import static org.onosproject.store.service.EventuallyConsistentMapEvent.Type.RE | ... | @@ -27,6 +27,7 @@ import static org.onosproject.store.service.EventuallyConsistentMapEvent.Type.RE |
27 | import static org.slf4j.LoggerFactory.getLogger; | 27 | import static org.slf4j.LoggerFactory.getLogger; |
28 | 28 | ||
29 | import java.util.Collection; | 29 | import java.util.Collection; |
30 | +import java.util.HashSet; | ||
30 | import java.util.Objects; | 31 | import java.util.Objects; |
31 | import java.util.Set; | 32 | import java.util.Set; |
32 | import java.util.concurrent.atomic.AtomicReference; | 33 | import java.util.concurrent.atomic.AtomicReference; |
... | @@ -197,6 +198,34 @@ public class ECHostStore | ... | @@ -197,6 +198,34 @@ public class ECHostStore |
197 | } | 198 | } |
198 | 199 | ||
199 | @Override | 200 | @Override |
201 | + public HostEvent removeIp(HostId hostId, IpAddress ipAddress) { | ||
202 | + DefaultHost host = hosts.compute(hostId, (id, existingHost) -> { | ||
203 | + if (existingHost != null) { | ||
204 | + checkState(Objects.equals(hostId.mac(), existingHost.mac()), | ||
205 | + "Existing and new MAC addresses differ."); | ||
206 | + checkState(Objects.equals(hostId.vlanId(), existingHost.vlan()), | ||
207 | + "Existing and new VLANs differ."); | ||
208 | + | ||
209 | + Set<IpAddress> addresses = new HashSet<>(existingHost.ipAddresses()); | ||
210 | + if (addresses != null && addresses.contains(ipAddress)) { | ||
211 | + addresses.remove(ipAddress); | ||
212 | + return new DefaultHost(existingHost.providerId(), | ||
213 | + hostId, | ||
214 | + existingHost.mac(), | ||
215 | + existingHost.vlan(), | ||
216 | + existingHost.location(), | ||
217 | + ImmutableSet.copyOf(addresses), | ||
218 | + existingHost.annotations()); | ||
219 | + } else { | ||
220 | + return existingHost; | ||
221 | + } | ||
222 | + } | ||
223 | + return null; | ||
224 | + }); | ||
225 | + return host != null ? new HostEvent(HOST_UPDATED, host) : null; | ||
226 | + } | ||
227 | + | ||
228 | + @Override | ||
200 | public int getHostCount() { | 229 | public int getHostCount() { |
201 | return hosts.size(); | 230 | return hosts.size(); |
202 | } | 231 | } | ... | ... |
... | @@ -259,6 +259,10 @@ public class HostLocationProviderTest { | ... | @@ -259,6 +259,10 @@ public class HostLocationProviderTest { |
259 | removeCount++; | 259 | removeCount++; |
260 | } | 260 | } |
261 | 261 | ||
262 | + @Override | ||
263 | + public void removeIpFromHost(HostId hostId, IpAddress ipAddress) { | ||
264 | + } | ||
265 | + | ||
262 | } | 266 | } |
263 | 267 | ||
264 | private class TestPacketService extends PacketServiceAdapter { | 268 | private class TestPacketService extends PacketServiceAdapter { | ... | ... |
... | @@ -24,6 +24,7 @@ import java.util.Set; | ... | @@ -24,6 +24,7 @@ import java.util.Set; |
24 | import org.junit.After; | 24 | import org.junit.After; |
25 | import org.junit.Before; | 25 | import org.junit.Before; |
26 | import org.junit.Test; | 26 | import org.junit.Test; |
27 | +import org.onlab.packet.IpAddress; | ||
27 | import org.onlab.packet.MacAddress; | 28 | import org.onlab.packet.MacAddress; |
28 | import org.onosproject.net.DeviceId; | 29 | import org.onosproject.net.DeviceId; |
29 | import org.onosproject.net.HostId; | 30 | import org.onosproject.net.HostId; |
... | @@ -159,6 +160,11 @@ public class OvsdbHostProviderTest { | ... | @@ -159,6 +160,11 @@ public class OvsdbHostProviderTest { |
159 | removeCount++; | 160 | removeCount++; |
160 | } | 161 | } |
161 | 162 | ||
163 | + @Override | ||
164 | + public void removeIpFromHost(HostId hostId, IpAddress ipAddress) { | ||
165 | + | ||
166 | + } | ||
167 | + | ||
162 | } | 168 | } |
163 | 169 | ||
164 | private class OvsdbControllerTest implements OvsdbController { | 170 | private class OvsdbControllerTest implements OvsdbController { | ... | ... |
-
Please register or login to post a comment