Committed by
Gerrit Code Review
[ONOS-4926] floating Ip flow rules handling when restarting ONOS
Change-Id: I844ebf8c0ef48289675124c79c96edd886bbff16
Showing
1 changed file
with
30 additions
and
14 deletions
... | @@ -40,6 +40,8 @@ import org.onosproject.net.flowobjective.FlowObjectiveService; | ... | @@ -40,6 +40,8 @@ import org.onosproject.net.flowobjective.FlowObjectiveService; |
40 | import org.onosproject.net.flowobjective.ForwardingObjective; | 40 | import org.onosproject.net.flowobjective.ForwardingObjective; |
41 | import org.onosproject.net.host.HostService; | 41 | import org.onosproject.net.host.HostService; |
42 | import org.onosproject.openstackinterface.OpenstackFloatingIP; | 42 | import org.onosproject.openstackinterface.OpenstackFloatingIP; |
43 | +import org.onosproject.openstackinterface.OpenstackInterfaceService; | ||
44 | +import org.onosproject.openstacknetworking.AbstractVmHandler; | ||
43 | import org.onosproject.openstacknetworking.Constants; | 45 | import org.onosproject.openstacknetworking.Constants; |
44 | import org.onosproject.openstacknetworking.OpenstackFloatingIpService; | 46 | import org.onosproject.openstacknetworking.OpenstackFloatingIpService; |
45 | import org.onosproject.openstacknetworking.RulePopulatorUtil; | 47 | import org.onosproject.openstacknetworking.RulePopulatorUtil; |
... | @@ -70,7 +72,7 @@ import static org.onosproject.openstacknode.OpenstackNodeService.NodeType.GATEWA | ... | @@ -70,7 +72,7 @@ import static org.onosproject.openstacknode.OpenstackNodeService.NodeType.GATEWA |
70 | 72 | ||
71 | @Service | 73 | @Service |
72 | @Component(immediate = true) | 74 | @Component(immediate = true) |
73 | -public class OpenstackFloatingIpManager implements OpenstackFloatingIpService { | 75 | +public class OpenstackFloatingIpManager extends AbstractVmHandler implements OpenstackFloatingIpService { |
74 | 76 | ||
75 | private final Logger log = LoggerFactory.getLogger(getClass()); | 77 | private final Logger log = LoggerFactory.getLogger(getClass()); |
76 | 78 | ||
... | @@ -95,6 +97,9 @@ public class OpenstackFloatingIpManager implements OpenstackFloatingIpService { | ... | @@ -95,6 +97,9 @@ public class OpenstackFloatingIpManager implements OpenstackFloatingIpService { |
95 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 97 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
96 | protected ScalableGatewayService gatewayService; | 98 | protected ScalableGatewayService gatewayService; |
97 | 99 | ||
100 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
101 | + protected OpenstackInterfaceService openstackService; | ||
102 | + | ||
98 | private static final String NOT_ASSOCIATED = "null"; | 103 | private static final String NOT_ASSOCIATED = "null"; |
99 | private static final KryoNamespace.Builder FLOATING_IP_SERIALIZER = | 104 | private static final KryoNamespace.Builder FLOATING_IP_SERIALIZER = |
100 | KryoNamespace.newBuilder().register(KryoNamespaces.API); | 105 | KryoNamespace.newBuilder().register(KryoNamespaces.API); |
... | @@ -108,6 +113,7 @@ public class OpenstackFloatingIpManager implements OpenstackFloatingIpService { | ... | @@ -108,6 +113,7 @@ public class OpenstackFloatingIpManager implements OpenstackFloatingIpService { |
108 | 113 | ||
109 | @Activate | 114 | @Activate |
110 | protected void activate() { | 115 | protected void activate() { |
116 | + super.activate(); | ||
111 | appId = coreService.registerApplication(ROUTING_APP_ID); | 117 | appId = coreService.registerApplication(ROUTING_APP_ID); |
112 | nodeService.addListener(nodeListener); | 118 | nodeService.addListener(nodeListener); |
113 | floatingIpMap = storageService.<IpAddress, Host>consistentMapBuilder() | 119 | floatingIpMap = storageService.<IpAddress, Host>consistentMapBuilder() |
... | @@ -121,11 +127,34 @@ public class OpenstackFloatingIpManager implements OpenstackFloatingIpService { | ... | @@ -121,11 +127,34 @@ public class OpenstackFloatingIpManager implements OpenstackFloatingIpService { |
121 | 127 | ||
122 | @Deactivate | 128 | @Deactivate |
123 | protected void deactivate() { | 129 | protected void deactivate() { |
130 | + super.deactivate(); | ||
124 | nodeService.removeListener(nodeListener); | 131 | nodeService.removeListener(nodeListener); |
125 | log.info("Stopped"); | 132 | log.info("Stopped"); |
126 | } | 133 | } |
127 | 134 | ||
128 | @Override | 135 | @Override |
136 | + protected void hostDetected(Host host) { | ||
137 | + IpAddress hostIp = host.ipAddresses().stream().findFirst().get(); | ||
138 | + Optional<OpenstackFloatingIP> floatingIp = openstackService.floatingIps().stream() | ||
139 | + .filter(fip -> fip.fixedIpAddress() != null && fip.fixedIpAddress().equals(hostIp)) | ||
140 | + .findFirst(); | ||
141 | + if (floatingIp.isPresent()) { | ||
142 | + eventExecutor.execute(() -> associateFloatingIp(floatingIp.get())); | ||
143 | + } | ||
144 | + } | ||
145 | + | ||
146 | + @Override | ||
147 | + protected void hostRemoved(Host host) { | ||
148 | + IpAddress hostIp = host.ipAddresses().stream().findFirst().get(); | ||
149 | + Optional<OpenstackFloatingIP> floatingIp = openstackService.floatingIps().stream() | ||
150 | + .filter(fip -> fip.fixedIpAddress() != null && fip.fixedIpAddress().equals(hostIp)) | ||
151 | + .findFirst(); | ||
152 | + if (floatingIp.isPresent()) { | ||
153 | + eventExecutor.execute(() -> disassociateFloatingIp(floatingIp.get())); | ||
154 | + } | ||
155 | + } | ||
156 | + | ||
157 | + @Override | ||
129 | public void createFloatingIp(OpenstackFloatingIP floatingIp) { | 158 | public void createFloatingIp(OpenstackFloatingIP floatingIp) { |
130 | } | 159 | } |
131 | 160 | ||
... | @@ -285,18 +314,6 @@ public class OpenstackFloatingIpManager implements OpenstackFloatingIpService { | ... | @@ -285,18 +314,6 @@ public class OpenstackFloatingIpManager implements OpenstackFloatingIpService { |
285 | }); | 314 | }); |
286 | } | 315 | } |
287 | 316 | ||
288 | - private void reloadFloatingIpRules() { | ||
289 | - floatingIpMap.entrySet().stream().forEach(entry -> { | ||
290 | - IpAddress floatingIp = entry.getKey(); | ||
291 | - Host associatedVm = entry.getValue().value(); | ||
292 | - | ||
293 | - populateFloatingIpRules(floatingIp, associatedVm); | ||
294 | - log.debug("Reload floating IP {} mapped to {}", | ||
295 | - floatingIp, associatedVm.ipAddresses()); | ||
296 | - }); | ||
297 | - } | ||
298 | - | ||
299 | - // TODO apply existing floating IPs on service start-up by handling host event | ||
300 | // TODO consider the case that port with associated floating IP is attached to a VM | 317 | // TODO consider the case that port with associated floating IP is attached to a VM |
301 | 318 | ||
302 | private class InternalNodeListener implements OpenstackNodeListener { | 319 | private class InternalNodeListener implements OpenstackNodeListener { |
... | @@ -316,7 +333,6 @@ public class OpenstackFloatingIpManager implements OpenstackFloatingIpService { | ... | @@ -316,7 +333,6 @@ public class OpenstackFloatingIpManager implements OpenstackFloatingIpService { |
316 | .uplinkIntf(node.externalPortName().get()) | 333 | .uplinkIntf(node.externalPortName().get()) |
317 | .build(); | 334 | .build(); |
318 | gatewayService.addGatewayNode(gnode); | 335 | gatewayService.addGatewayNode(gnode); |
319 | - reloadFloatingIpRules(); | ||
320 | }); | 336 | }); |
321 | } | 337 | } |
322 | break; | 338 | break; | ... | ... |
-
Please register or login to post a comment