Committed by
Gerrit Code Review
[Falcon] SONA : Supports routers
Adds the flow rules for router to the network node and compute nodes when a router is added. Change-Id: I6e159b813a32f8e8b48f488d66731f882cf867ed
Showing
2 changed files
with
40 additions
and
27 deletions
... | @@ -31,6 +31,7 @@ import org.onosproject.core.CoreService; | ... | @@ -31,6 +31,7 @@ import org.onosproject.core.CoreService; |
31 | import org.onosproject.dhcp.DhcpService; | 31 | import org.onosproject.dhcp.DhcpService; |
32 | import org.onosproject.event.AbstractEvent; | 32 | import org.onosproject.event.AbstractEvent; |
33 | import org.onosproject.net.Device; | 33 | import org.onosproject.net.Device; |
34 | +import org.onosproject.net.DeviceId; | ||
34 | import org.onosproject.net.Host; | 35 | import org.onosproject.net.Host; |
35 | import org.onosproject.net.Port; | 36 | import org.onosproject.net.Port; |
36 | import org.onosproject.net.config.ConfigFactory; | 37 | import org.onosproject.net.config.ConfigFactory; |
... | @@ -98,6 +99,11 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -98,6 +99,11 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
98 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 99 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
99 | protected DriverService driverService; | 100 | protected DriverService driverService; |
100 | 101 | ||
102 | + public static final String PORTNAME_PREFIX_VM = "tap"; | ||
103 | + public static final String PORTNAME_PREFIX_ROUTER = "qr"; | ||
104 | + public static final String PORTNAME_PREFIX_TUNNEL = "vxlan"; | ||
105 | + public static final String PORTNAME = "portName"; | ||
106 | + | ||
101 | private ApplicationId appId; | 107 | private ApplicationId appId; |
102 | private boolean doNotPushFlows; | 108 | private boolean doNotPushFlows; |
103 | private Ip4Address neutronServer; | 109 | private Ip4Address neutronServer; |
... | @@ -195,7 +201,7 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -195,7 +201,7 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
195 | @Override | 201 | @Override |
196 | public OpenstackPort port(Port port) { | 202 | public OpenstackPort port(Port port) { |
197 | Collection<OpenstackPort> ports = restHandler.getPorts(); | 203 | Collection<OpenstackPort> ports = restHandler.getPorts(); |
198 | - String uuid = port.annotations().value("portName").substring(3); | 204 | + String uuid = port.annotations().value(PORTNAME).substring(3); |
199 | return ports.stream() | 205 | return ports.stream() |
200 | .filter(p -> p.id().startsWith(uuid)) | 206 | .filter(p -> p.id().startsWith(uuid)) |
201 | .findFirst().orElse(null); | 207 | .findFirst().orElse(null); |
... | @@ -253,37 +259,23 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -253,37 +259,23 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
253 | } | 259 | } |
254 | 260 | ||
255 | private void processPortUpdated(Device device, Port port) { | 261 | private void processPortUpdated(Device device, Port port) { |
256 | - if (!port.annotations().value("portName").equals("vxlan") && !doNotPushFlows) { | 262 | + if (!port.annotations().value(PORTNAME).equals(PORTNAME_PREFIX_TUNNEL) && !doNotPushFlows) { |
257 | - if (port.isEnabled()) { | 263 | + if (port.isEnabled() || port.annotations().value(PORTNAME).startsWith(PORTNAME_PREFIX_ROUTER)) { |
258 | OpenstackSwitchingRulePopulator rulePopulator = | 264 | OpenstackSwitchingRulePopulator rulePopulator = |
259 | new OpenstackSwitchingRulePopulator(appId, flowObjectiveService, | 265 | new OpenstackSwitchingRulePopulator(appId, flowObjectiveService, |
260 | deviceService, restHandler, driverService); | 266 | deviceService, restHandler, driverService); |
261 | rulePopulator.populateSwitchingRules(device, port); | 267 | rulePopulator.populateSwitchingRules(device, port); |
268 | + updatePortMap(device.id(), port, restHandler.getNetworks(), rulePopulator.openstackPort(port)); | ||
262 | 269 | ||
263 | - OpenstackPort openstackPort = port(port); | 270 | + //In case portupdate event is driven by vm shutoff from openstack |
264 | - | 271 | + } else if (!port.isEnabled() && openstackPortInfoMap.containsKey(port.annotations().value(PORTNAME))) { |
265 | - long vni = Long.parseLong(restHandler.getNetworks().stream() | ||
266 | - .filter(n -> n.id().equals(openstackPort.networkId())) | ||
267 | - .findAny().orElse(null).segmentId()); | ||
268 | - | ||
269 | - OpenstackPortInfo.Builder portBuilder = OpenstackPortInfo.builder() | ||
270 | - .setDeviceId(device.id()) | ||
271 | - .setHostIp((Ip4Address) openstackPort.fixedIps().values().stream().findFirst().orElse(null)) | ||
272 | - .setVNI(vni); | ||
273 | - | ||
274 | - openstackPortInfoMap.putIfAbsent(port.annotations().value("portName"), | ||
275 | - portBuilder.build()); | ||
276 | - } | ||
277 | - | ||
278 | - //In case portupdate event is driven by vm shutoff from openstack | ||
279 | - if (!port.isEnabled() && openstackPortInfoMap.containsKey(port.annotations().value("portName"))) { | ||
280 | log.debug("Flowrules according to the port {} were removed", port.number().toString()); | 272 | log.debug("Flowrules according to the port {} were removed", port.number().toString()); |
281 | OpenstackSwitchingRulePopulator rulePopulator = | 273 | OpenstackSwitchingRulePopulator rulePopulator = |
282 | new OpenstackSwitchingRulePopulator(appId, flowObjectiveService, | 274 | new OpenstackSwitchingRulePopulator(appId, flowObjectiveService, |
283 | deviceService, restHandler, driverService); | 275 | deviceService, restHandler, driverService); |
284 | - openstackPortInfoMap.get(port.annotations().value("portName")); | 276 | + openstackPortInfoMap.get(port.annotations().value(PORTNAME)); |
285 | rulePopulator.removeSwitchingRules(port, openstackPortInfoMap); | 277 | rulePopulator.removeSwitchingRules(port, openstackPortInfoMap); |
286 | - openstackPortInfoMap.remove(port.annotations().value("portName")); | 278 | + openstackPortInfoMap.remove(port.annotations().value(PORTNAME)); |
287 | } | 279 | } |
288 | } | 280 | } |
289 | } | 281 | } |
... | @@ -297,16 +289,20 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -297,16 +289,20 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
297 | new OpenstackSwitchingRulePopulator(appId, flowObjectiveService, | 289 | new OpenstackSwitchingRulePopulator(appId, flowObjectiveService, |
298 | deviceService, restHandler, driverService); | 290 | deviceService, restHandler, driverService); |
299 | 291 | ||
292 | + Collection<OpenstackNetwork> networks = restHandler.getNetworks(); | ||
293 | + | ||
300 | deviceService.getDevices().forEach(device -> { | 294 | deviceService.getDevices().forEach(device -> { |
301 | log.debug("device {} num of ports {} ", device.id(), | 295 | log.debug("device {} num of ports {} ", device.id(), |
302 | deviceService.getPorts(device.id()).size()); | 296 | deviceService.getPorts(device.id()).size()); |
303 | deviceService.getPorts(device.id()).stream() | 297 | deviceService.getPorts(device.id()).stream() |
304 | - .filter(port -> port.annotations().value("portName").startsWith("tap")) | 298 | + .filter(port -> port.annotations().value(PORTNAME).startsWith(PORTNAME_PREFIX_VM) || |
299 | + port.annotations().value(PORTNAME).startsWith(PORTNAME_PREFIX_ROUTER)) | ||
305 | .forEach(vmPort -> { | 300 | .forEach(vmPort -> { |
306 | OpenstackPort osPort = rulePopulator.openstackPort(vmPort); | 301 | OpenstackPort osPort = rulePopulator.openstackPort(vmPort); |
307 | if (osPort != null) { | 302 | if (osPort != null) { |
308 | if (!doNotPushFlows) { | 303 | if (!doNotPushFlows) { |
309 | rulePopulator.populateSwitchingRules(device, vmPort); | 304 | rulePopulator.populateSwitchingRules(device, vmPort); |
305 | + updatePortMap(device.id(), vmPort, networks, osPort); | ||
310 | } | 306 | } |
311 | registerDhcpInfo(osPort); | 307 | registerDhcpInfo(osPort); |
312 | } else { | 308 | } else { |
... | @@ -318,6 +314,21 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -318,6 +314,21 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
318 | ); | 314 | ); |
319 | } | 315 | } |
320 | 316 | ||
317 | + private void updatePortMap(DeviceId deviceId, Port port, Collection<OpenstackNetwork> networks, | ||
318 | + OpenstackPort openstackPort) { | ||
319 | + long vni = Long.parseLong(networks.stream() | ||
320 | + .filter(n -> n.id().equals(openstackPort.networkId())) | ||
321 | + .findAny().orElse(null).segmentId()); | ||
322 | + | ||
323 | + OpenstackPortInfo.Builder portBuilder = OpenstackPortInfo.builder() | ||
324 | + .setDeviceId(deviceId) | ||
325 | + .setHostIp((Ip4Address) openstackPort.fixedIps().values().stream().findFirst().orElse(null)) | ||
326 | + .setVNI(vni); | ||
327 | + | ||
328 | + openstackPortInfoMap.putIfAbsent(port.annotations().value(PORTNAME), | ||
329 | + portBuilder.build()); | ||
330 | + } | ||
331 | + | ||
321 | private void processHostRemoved(Host host) { | 332 | private void processHostRemoved(Host host) { |
322 | log.debug("host {} was removed", host.toString()); | 333 | log.debug("host {} was removed", host.toString()); |
323 | } | 334 | } |
... | @@ -325,8 +336,8 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -325,8 +336,8 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
325 | private void registerDhcpInfo(OpenstackPort openstackPort) { | 336 | private void registerDhcpInfo(OpenstackPort openstackPort) { |
326 | Ip4Address ip4Address; | 337 | Ip4Address ip4Address; |
327 | Ip4Address subnetMask; | 338 | Ip4Address subnetMask; |
328 | - Ip4Address dhcpServer; | ||
329 | Ip4Address gatewayIPAddress; | 339 | Ip4Address gatewayIPAddress; |
340 | + Ip4Address dhcpServer; | ||
330 | Ip4Address domainServer; | 341 | Ip4Address domainServer; |
331 | OpenstackSubnet openstackSubnet; | 342 | OpenstackSubnet openstackSubnet; |
332 | 343 | ||
... | @@ -480,6 +491,5 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -480,6 +491,5 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
480 | networkEventExcutorService.execute(this::configureNetwork); | 491 | networkEventExcutorService.execute(this::configureNetwork); |
481 | } | 492 | } |
482 | } | 493 | } |
483 | - | ||
484 | } | 494 | } |
485 | } | 495 | } |
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
... | @@ -208,7 +208,9 @@ public class OpenstackSwitchingRulePopulator { | ... | @@ -208,7 +208,9 @@ public class OpenstackSwitchingRulePopulator { |
208 | String cidx = d.annotations().value("channelId"); | 208 | String cidx = d.annotations().value("channelId"); |
209 | Ip4Address hostIpx = Ip4Address.valueOf(cidx.split(":")[0]); | 209 | Ip4Address hostIpx = Ip4Address.valueOf(cidx.split(":")[0]); |
210 | Ip4Address fixedIpx = getFixedIpAddressForPort(pName); | 210 | Ip4Address fixedIpx = getFixedIpAddressForPort(pName); |
211 | - if (port.isEnabled()) { | 211 | + if (port.isEnabled() || |
212 | + port.annotations().value("portName").startsWith( | ||
213 | + OpenstackSwitchingManager.PORTNAME_PREFIX_ROUTER)) { | ||
212 | setVxLanFlowRule(vni, device.id(), hostIpx, fixedIpx); | 214 | setVxLanFlowRule(vni, device.id(), hostIpx, fixedIpx); |
213 | setVxLanFlowRule(vni, d.id(), hostIpAddress, fixedIp); | 215 | setVxLanFlowRule(vni, d.id(), hostIpAddress, fixedIp); |
214 | } | 216 | } |
... | @@ -475,7 +477,8 @@ public class OpenstackSwitchingRulePopulator { | ... | @@ -475,7 +477,8 @@ public class OpenstackSwitchingRulePopulator { |
475 | 477 | ||
476 | private PortNumber getTunnelPort(DeviceId deviceId) { | 478 | private PortNumber getTunnelPort(DeviceId deviceId) { |
477 | Port port = deviceService.getPorts(deviceId).stream() | 479 | Port port = deviceService.getPorts(deviceId).stream() |
478 | - .filter(p -> p.annotations().value("portName").equals("vxlan")) | 480 | + .filter(p -> p.annotations().value("portName").equals( |
481 | + OpenstackSwitchingManager.PORTNAME_PREFIX_TUNNEL)) | ||
479 | .findAny().orElse(null); | 482 | .findAny().orElse(null); |
480 | 483 | ||
481 | if (port == null) { | 484 | if (port == null) { | ... | ... |
-
Please register or login to post a comment