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