lishuai

[ONOS-3726] Update L3's bug about unbinding floating ip. When we do joid

installer, we find this bug.

Change-Id: Ice216d5e045c40122a1b9574ec1f144f25f7298b
...@@ -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,
......