[ONOS-3726] Update L3's bug about unbinding floating ip. When we do joid
installer, we find this bug. Change-Id: Ice216d5e045c40122a1b9574ec1f144f25f7298b
Showing
6 changed files
with
69 additions
and
10 deletions
| ... | @@ -749,9 +749,9 @@ public class VTNManager implements VTNService { | ... | @@ -749,9 +749,9 @@ public class VTNManager implements VTNService { |
| 749 | } else | 749 | } else |
| 750 | if (VtnRscEvent.Type.ROUTER_INTERFACE_DELETE == event.type()) { | 750 | if (VtnRscEvent.Type.ROUTER_INTERFACE_DELETE == event.type()) { |
| 751 | onRouterInterfaceVanished(l3Feedback); | 751 | onRouterInterfaceVanished(l3Feedback); |
| 752 | - } else if (VtnRscEvent.Type.FLOATINGIP_PUT == event.type()) { | 752 | + } else if (VtnRscEvent.Type.FLOATINGIP_BIND == event.type()) { |
| 753 | onFloatingIpDetected(l3Feedback); | 753 | onFloatingIpDetected(l3Feedback); |
| 754 | - } else if (VtnRscEvent.Type.FLOATINGIP_DELETE == event.type()) { | 754 | + } else if (VtnRscEvent.Type.FLOATINGIP_UNBIND == event.type()) { |
| 755 | onFloatingIpVanished(l3Feedback); | 755 | onFloatingIpVanished(l3Feedback); |
| 756 | } | 756 | } |
| 757 | } | 757 | } |
| ... | @@ -762,6 +762,8 @@ public class VTNManager implements VTNService { | ... | @@ -762,6 +762,8 @@ public class VTNManager implements VTNService { |
| 762 | public void onRouterInterfaceDetected(VtnRscEventFeedback l3Feedback) { | 762 | public void onRouterInterfaceDetected(VtnRscEventFeedback l3Feedback) { |
| 763 | Objective.Operation operation = Objective.Operation.ADD; | 763 | Objective.Operation operation = Objective.Operation.ADD; |
| 764 | RouterInterface routerInf = l3Feedback.routerInterface(); | 764 | RouterInterface routerInf = l3Feedback.routerInterface(); |
| 765 | + VirtualPort gwPort = virtualPortService.getPort(routerInf.portId()); | ||
| 766 | + vPortStore.put(gwPort.portId(), gwPort); | ||
| 765 | Iterable<RouterInterface> interfaces = routerInterfaceService | 767 | Iterable<RouterInterface> interfaces = routerInterfaceService |
| 766 | .getRouterInterfaces(); | 768 | .getRouterInterfaces(); |
| 767 | Set<RouterInterface> interfacesSet = Sets.newHashSet(interfaces) | 769 | Set<RouterInterface> interfacesSet = Sets.newHashSet(interfaces) |
| ... | @@ -794,16 +796,21 @@ public class VTNManager implements VTNService { | ... | @@ -794,16 +796,21 @@ public class VTNManager implements VTNService { |
| 794 | }); | 796 | }); |
| 795 | } | 797 | } |
| 796 | } | 798 | } |
| 799 | + VirtualPort gwPort = virtualPortService.getPort(routerInf.portId()); | ||
| 800 | + if (gwPort == null) { | ||
| 801 | + gwPort = VtnData.getPort(vPortStore, routerInf.portId()); | ||
| 802 | + } | ||
| 803 | + vPortStore.remove(gwPort.portId()); | ||
| 797 | } | 804 | } |
| 798 | 805 | ||
| 799 | @Override | 806 | @Override |
| 800 | public void onFloatingIpDetected(VtnRscEventFeedback l3Feedback) { | 807 | public void onFloatingIpDetected(VtnRscEventFeedback l3Feedback) { |
| 801 | - programFloatingIpEvent(l3Feedback, VtnRscEvent.Type.FLOATINGIP_PUT); | 808 | + programFloatingIpEvent(l3Feedback, VtnRscEvent.Type.FLOATINGIP_BIND); |
| 802 | } | 809 | } |
| 803 | 810 | ||
| 804 | @Override | 811 | @Override |
| 805 | public void onFloatingIpVanished(VtnRscEventFeedback l3Feedback) { | 812 | public void onFloatingIpVanished(VtnRscEventFeedback l3Feedback) { |
| 806 | - programFloatingIpEvent(l3Feedback, VtnRscEvent.Type.FLOATINGIP_DELETE); | 813 | + programFloatingIpEvent(l3Feedback, VtnRscEvent.Type.FLOATINGIP_UNBIND); |
| 807 | } | 814 | } |
| 808 | 815 | ||
| 809 | private void programInterfacesSet(Set<RouterInterface> interfacesSet, | 816 | private void programInterfacesSet(Set<RouterInterface> interfacesSet, |
| ... | @@ -925,11 +932,11 @@ public class VTNManager implements VTNService { | ... | @@ -925,11 +932,11 @@ public class VTNManager implements VTNService { |
| 925 | SegmentationId l3vni = vtnRscService | 932 | SegmentationId l3vni = vtnRscService |
| 926 | .getL3vni(vmPort.tenantId()); | 933 | .getL3vni(vmPort.tenantId()); |
| 927 | // Floating ip BIND | 934 | // Floating ip BIND |
| 928 | - if (type == VtnRscEvent.Type.FLOATINGIP_PUT) { | 935 | + if (type == VtnRscEvent.Type.FLOATINGIP_BIND) { |
| 929 | applyNorthSouthL3Flows(deviceId, host, vmPort, fipPort, | 936 | applyNorthSouthL3Flows(deviceId, host, vmPort, fipPort, |
| 930 | floaingIp, l3vni, exPort, | 937 | floaingIp, l3vni, exPort, |
| 931 | Objective.Operation.ADD); | 938 | Objective.Operation.ADD); |
| 932 | - } else if (type == VtnRscEvent.Type.FLOATINGIP_DELETE) { | 939 | + } else if (type == VtnRscEvent.Type.FLOATINGIP_UNBIND) { |
| 933 | // Floating ip UNBIND | 940 | // Floating ip UNBIND |
| 934 | applyNorthSouthL3Flows(deviceId, host, vmPort, fipPort, | 941 | applyNorthSouthL3Flows(deviceId, host, vmPort, fipPort, |
| 935 | floaingIp, l3vni, exPort, | 942 | floaingIp, l3vni, exPort, | ... | ... |
| ... | @@ -23,6 +23,7 @@ import org.apache.karaf.shell.commands.Option; | ... | @@ -23,6 +23,7 @@ import org.apache.karaf.shell.commands.Option; |
| 23 | import org.onlab.packet.IpAddress; | 23 | import org.onlab.packet.IpAddress; |
| 24 | import org.onlab.packet.MacAddress; | 24 | import org.onlab.packet.MacAddress; |
| 25 | import org.onosproject.cli.AbstractShellCommand; | 25 | import org.onosproject.cli.AbstractShellCommand; |
| 26 | +import org.onosproject.net.DeviceId; | ||
| 26 | import org.onosproject.vtnrsc.BindingHostId; | 27 | import org.onosproject.vtnrsc.BindingHostId; |
| 27 | import org.onosproject.vtnrsc.DefaultVirtualPort; | 28 | import org.onosproject.vtnrsc.DefaultVirtualPort; |
| 28 | import org.onosproject.vtnrsc.FixedIp; | 29 | import org.onosproject.vtnrsc.FixedIp; |
| ... | @@ -86,7 +87,7 @@ public class VirtualPortExGwUpdateCommand extends AbstractShellCommand { | ... | @@ -86,7 +87,7 @@ public class VirtualPortExGwUpdateCommand extends AbstractShellCommand { |
| 86 | VirtualPort.State.DOWN, | 87 | VirtualPort.State.DOWN, |
| 87 | MacAddress.valueOf(macAddress), | 88 | MacAddress.valueOf(macAddress), |
| 88 | subnet.tenantId(), | 89 | subnet.tenantId(), |
| 89 | - null, | 90 | + DeviceId.deviceId(""), |
| 90 | Sets.newHashSet(fixedGwIp), | 91 | Sets.newHashSet(fixedGwIp), |
| 91 | BindingHostId.bindingHostId(""), | 92 | BindingHostId.bindingHostId(""), |
| 92 | Sets.newHashSet(), | 93 | Sets.newHashSet(), | ... | ... |
| ... | @@ -37,6 +37,14 @@ public class VtnRscEvent | ... | @@ -37,6 +37,14 @@ public class VtnRscEvent |
| 37 | */ | 37 | */ |
| 38 | FLOATINGIP_DELETE, | 38 | FLOATINGIP_DELETE, |
| 39 | /** | 39 | /** |
| 40 | + * Signifies that Floating IP has been bound. | ||
| 41 | + */ | ||
| 42 | + FLOATINGIP_BIND, | ||
| 43 | + /** | ||
| 44 | + * Signifies that Floating IP has been unbound. | ||
| 45 | + */ | ||
| 46 | + FLOATINGIP_UNBIND, | ||
| 47 | + /** | ||
| 40 | * Signifies that router has create. | 48 | * Signifies that router has create. |
| 41 | */ | 49 | */ |
| 42 | ROUTER_PUT, | 50 | ROUTER_PUT, | ... | ... |
| ... | @@ -34,7 +34,15 @@ public class FloatingIpEvent | ... | @@ -34,7 +34,15 @@ public class FloatingIpEvent |
| 34 | /** | 34 | /** |
| 35 | * Signifies that Floating IP has been deleted. | 35 | * Signifies that Floating IP has been deleted. |
| 36 | */ | 36 | */ |
| 37 | - FLOATINGIP_DELETE | 37 | + FLOATINGIP_DELETE, |
| 38 | + /** | ||
| 39 | + * Signifies that Floating IP has been bound. | ||
| 40 | + */ | ||
| 41 | + FLOATINGIP_BIND, | ||
| 42 | + /** | ||
| 43 | + * Signifies that Floating IP has been unbound. | ||
| 44 | + */ | ||
| 45 | + FLOATINGIP_UNBIND | ||
| 38 | } | 46 | } |
| 39 | 47 | ||
| 40 | /** | 48 | /** | ... | ... |
| ... | @@ -63,7 +63,8 @@ import com.google.common.collect.Sets; | ... | @@ -63,7 +63,8 @@ import com.google.common.collect.Sets; |
| 63 | public class FloatingIpManager implements FloatingIpService { | 63 | public class FloatingIpManager implements FloatingIpService { |
| 64 | private static final String FLOATINGIP_ID_NOT_NULL = "Floatingip ID cannot be null"; | 64 | private static final String FLOATINGIP_ID_NOT_NULL = "Floatingip ID cannot be null"; |
| 65 | private static final String FLOATINGIP_NOT_NULL = "Floatingip cannot be null"; | 65 | private static final String FLOATINGIP_NOT_NULL = "Floatingip cannot be null"; |
| 66 | - private static final String FLOATINGIP = "vtn-floatingip-store"; | 66 | + private static final String FLOATINGIPSTORE = "vtn-floatingip-store"; |
| 67 | + private static final String FLOATINGIPBINDSTORE = "vtn-floatingip-bind-store"; | ||
| 67 | private static final String VTNRSC_APP = "org.onosproject.vtnrsc"; | 68 | private static final String VTNRSC_APP = "org.onosproject.vtnrsc"; |
| 68 | private static final String LISTENER_NOT_NULL = "Listener cannot be null"; | 69 | private static final String LISTENER_NOT_NULL = "Listener cannot be null"; |
| 69 | private static final String EVENT_NOT_NULL = "event cannot be null"; | 70 | private static final String EVENT_NOT_NULL = "event cannot be null"; |
| ... | @@ -74,6 +75,7 @@ public class FloatingIpManager implements FloatingIpService { | ... | @@ -74,6 +75,7 @@ public class FloatingIpManager implements FloatingIpService { |
| 74 | private EventuallyConsistentMapListener<FloatingIpId, FloatingIp> floatingIpListener = | 75 | private EventuallyConsistentMapListener<FloatingIpId, FloatingIp> floatingIpListener = |
| 75 | new InnerFloatingIpStoreListener(); | 76 | new InnerFloatingIpStoreListener(); |
| 76 | protected EventuallyConsistentMap<FloatingIpId, FloatingIp> floatingIpStore; | 77 | protected EventuallyConsistentMap<FloatingIpId, FloatingIp> floatingIpStore; |
| 78 | + protected EventuallyConsistentMap<FloatingIpId, FloatingIp> floatingIpBindStore; | ||
| 77 | protected ApplicationId appId; | 79 | protected ApplicationId appId; |
| 78 | 80 | ||
| 79 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 81 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
| ... | @@ -103,7 +105,12 @@ public class FloatingIpManager implements FloatingIpService { | ... | @@ -103,7 +105,12 @@ public class FloatingIpManager implements FloatingIpService { |
| 103 | VirtualPortId.class, DefaultFloatingIp.class); | 105 | VirtualPortId.class, DefaultFloatingIp.class); |
| 104 | floatingIpStore = storageService | 106 | floatingIpStore = storageService |
| 105 | .<FloatingIpId, FloatingIp>eventuallyConsistentMapBuilder() | 107 | .<FloatingIpId, FloatingIp>eventuallyConsistentMapBuilder() |
| 106 | - .withName(FLOATINGIP).withSerializer(serializer) | 108 | + .withName(FLOATINGIPSTORE).withSerializer(serializer) |
| 109 | + .withTimestampProvider((k, v) -> new WallClockTimestamp()) | ||
| 110 | + .build(); | ||
| 111 | + floatingIpBindStore = storageService | ||
| 112 | + .<FloatingIpId, FloatingIp>eventuallyConsistentMapBuilder() | ||
| 113 | + .withName(FLOATINGIPBINDSTORE).withSerializer(serializer) | ||
| 107 | .withTimestampProvider((k, v) -> new WallClockTimestamp()) | 114 | .withTimestampProvider((k, v) -> new WallClockTimestamp()) |
| 108 | .build(); | 115 | .build(); |
| 109 | floatingIpStore.addListener(floatingIpListener); | 116 | floatingIpStore.addListener(floatingIpListener); |
| ... | @@ -114,6 +121,7 @@ public class FloatingIpManager implements FloatingIpService { | ... | @@ -114,6 +121,7 @@ public class FloatingIpManager implements FloatingIpService { |
| 114 | public void deactivate() { | 121 | public void deactivate() { |
| 115 | floatingIpStore.removeListener(floatingIpListener); | 122 | floatingIpStore.removeListener(floatingIpListener); |
| 116 | floatingIpStore.destroy(); | 123 | floatingIpStore.destroy(); |
| 124 | + floatingIpBindStore.destroy(); | ||
| 117 | listeners.clear(); | 125 | listeners.clear(); |
| 118 | log.info("Stopped"); | 126 | log.info("Stopped"); |
| 119 | } | 127 | } |
| ... | @@ -192,6 +200,8 @@ public class FloatingIpManager implements FloatingIpService { | ... | @@ -192,6 +200,8 @@ public class FloatingIpManager implements FloatingIpService { |
| 192 | boolean result = true; | 200 | boolean result = true; |
| 193 | for (FloatingIp floatingIp : floatingIps) { | 201 | for (FloatingIp floatingIp : floatingIps) { |
| 194 | verifyFloatingIpData(floatingIp); | 202 | verifyFloatingIpData(floatingIp); |
| 203 | + FloatingIp oldFloatingIp = floatingIpStore.get(floatingIp.id()); | ||
| 204 | + floatingIpBindStore.put(floatingIp.id(), oldFloatingIp); | ||
| 195 | floatingIpStore.put(floatingIp.id(), floatingIp); | 205 | floatingIpStore.put(floatingIp.id(), floatingIp); |
| 196 | if (!floatingIpStore.containsKey(floatingIp.id())) { | 206 | if (!floatingIpStore.containsKey(floatingIp.id())) { |
| 197 | log.debug("The floating Ip is updated failed whose identifier is {}", | 207 | log.debug("The floating Ip is updated failed whose identifier is {}", |
| ... | @@ -220,6 +230,7 @@ public class FloatingIpManager implements FloatingIpService { | ... | @@ -220,6 +230,7 @@ public class FloatingIpManager implements FloatingIpService { |
| 220 | return false; | 230 | return false; |
| 221 | } | 231 | } |
| 222 | floatingIpStore.remove(floatingIpId, floatingIp); | 232 | floatingIpStore.remove(floatingIpId, floatingIp); |
| 233 | + floatingIpBindStore.remove(floatingIpId); | ||
| 223 | if (floatingIpStore.containsKey(floatingIpId)) { | 234 | if (floatingIpStore.containsKey(floatingIpId)) { |
| 224 | log.debug("The floating Ip is deleted failed whose identifier is {}", | 235 | log.debug("The floating Ip is deleted failed whose identifier is {}", |
| 225 | floatingIpId.toString()); | 236 | floatingIpId.toString()); |
| ... | @@ -303,6 +314,18 @@ public class FloatingIpManager implements FloatingIpService { | ... | @@ -303,6 +314,18 @@ public class FloatingIpManager implements FloatingIpService { |
| 303 | notifyListeners(new FloatingIpEvent( | 314 | notifyListeners(new FloatingIpEvent( |
| 304 | FloatingIpEvent.Type.FLOATINGIP_PUT, | 315 | FloatingIpEvent.Type.FLOATINGIP_PUT, |
| 305 | floatingIp)); | 316 | floatingIp)); |
| 317 | + if (floatingIp.portId() != null) { | ||
| 318 | + notifyListeners(new FloatingIpEvent( | ||
| 319 | + FloatingIpEvent.Type.FLOATINGIP_BIND, | ||
| 320 | + floatingIp)); | ||
| 321 | + } else { | ||
| 322 | + FloatingIp oldFloatingIp = floatingIpBindStore.get(floatingIp.id()); | ||
| 323 | + if (oldFloatingIp != null) { | ||
| 324 | + notifyListeners(new FloatingIpEvent( | ||
| 325 | + FloatingIpEvent.Type.FLOATINGIP_UNBIND, | ||
| 326 | + oldFloatingIp)); | ||
| 327 | + } | ||
| 328 | + } | ||
| 306 | } | 329 | } |
| 307 | if (EventuallyConsistentMapEvent.Type.REMOVE == event.type()) { | 330 | if (EventuallyConsistentMapEvent.Type.REMOVE == event.type()) { |
| 308 | notifyListeners(new FloatingIpEvent( | 331 | notifyListeners(new FloatingIpEvent( | ... | ... |
| ... | @@ -221,6 +221,18 @@ public class VtnRscManager extends AbstractListenerManager<VtnRscEvent, VtnRscLi | ... | @@ -221,6 +221,18 @@ public class VtnRscManager extends AbstractListenerManager<VtnRscEvent, VtnRscLi |
| 221 | public void event(FloatingIpEvent event) { | 221 | public void event(FloatingIpEvent event) { |
| 222 | checkNotNull(event, EVENT_NOT_NULL); | 222 | checkNotNull(event, EVENT_NOT_NULL); |
| 223 | FloatingIp floatingIp = event.subject(); | 223 | FloatingIp floatingIp = event.subject(); |
| 224 | + if (FloatingIpEvent.Type.FLOATINGIP_BIND == event.type()) { | ||
| 225 | + notifyListeners(new VtnRscEvent( | ||
| 226 | + VtnRscEvent.Type.FLOATINGIP_BIND, | ||
| 227 | + new VtnRscEventFeedback( | ||
| 228 | + floatingIp))); | ||
| 229 | + } | ||
| 230 | + if (FloatingIpEvent.Type.FLOATINGIP_UNBIND == event.type()) { | ||
| 231 | + notifyListeners(new VtnRscEvent( | ||
| 232 | + VtnRscEvent.Type.FLOATINGIP_UNBIND, | ||
| 233 | + new VtnRscEventFeedback( | ||
| 234 | + floatingIp))); | ||
| 235 | + } | ||
| 224 | if (FloatingIpEvent.Type.FLOATINGIP_PUT == event.type()) { | 236 | if (FloatingIpEvent.Type.FLOATINGIP_PUT == event.type()) { |
| 225 | notifyListeners(new VtnRscEvent( | 237 | notifyListeners(new VtnRscEvent( |
| 226 | VtnRscEvent.Type.FLOATINGIP_PUT, | 238 | VtnRscEvent.Type.FLOATINGIP_PUT, | ... | ... |
-
Please register or login to post a comment