[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