SONA: OpenstackSwitching - remove flows
- Remove the corresponding flows when VMs are removed. - Remove the IP mapping of the VM removed from the DHCP service (even when doNotPushFlows is true) - Updated the network config json file to reflect the change of cordvtn Change-Id: I4c359d456422ece37b93e6366f2fd4daaf081a37
Showing
6 changed files
with
195 additions
and
51 deletions
| ... | @@ -35,13 +35,14 @@ public interface OpenstackSwitchingService { | ... | @@ -35,13 +35,14 @@ public interface OpenstackSwitchingService { |
| 35 | * Removes flow rules corresponding to the port removed by Openstack. | 35 | * Removes flow rules corresponding to the port removed by Openstack. |
| 36 | * | 36 | * |
| 37 | */ | 37 | */ |
| 38 | - void deletePorts(); | 38 | + void deletePort(String uuid); |
| 39 | 39 | ||
| 40 | /** | 40 | /** |
| 41 | * Updates flow rules corresponding to the port information updated by Openstack. | 41 | * Updates flow rules corresponding to the port information updated by Openstack. |
| 42 | * | 42 | * |
| 43 | + * @param openstackPort | ||
| 43 | */ | 44 | */ |
| 44 | - void updatePorts(); | 45 | + void updatePort(OpenstackPort openstackPort); |
| 45 | 46 | ||
| 46 | /** | 47 | /** |
| 47 | * Stores the network information created by openstack. | 48 | * Stores the network information created by openstack. | ... | ... |
| ... | @@ -40,6 +40,9 @@ | ... | @@ -40,6 +40,9 @@ |
| 40 | </api.description> | 40 | </api.description> |
| 41 | <api.package>org.onosproject.openstackswitching.web</api.package> | 41 | <api.package>org.onosproject.openstackswitching.web</api.package> |
| 42 | <onos.app.origin>SKT, Inc.</onos.app.origin> | 42 | <onos.app.origin>SKT, Inc.</onos.app.origin> |
| 43 | + <onos.app.requires> | ||
| 44 | + org.onosproject.dhcp | ||
| 45 | + </onos.app.requires> | ||
| 43 | </properties> | 46 | </properties> |
| 44 | 47 | ||
| 45 | 48 | ... | ... |
| ... | @@ -25,11 +25,14 @@ import org.apache.felix.scr.annotations.ReferenceCardinality; | ... | @@ -25,11 +25,14 @@ import org.apache.felix.scr.annotations.ReferenceCardinality; |
| 25 | import org.apache.felix.scr.annotations.Service; | 25 | import org.apache.felix.scr.annotations.Service; |
| 26 | import org.onlab.packet.Ethernet; | 26 | import org.onlab.packet.Ethernet; |
| 27 | import org.onlab.packet.Ip4Address; | 27 | import org.onlab.packet.Ip4Address; |
| 28 | +import org.onlab.packet.IpAddress; | ||
| 28 | import org.onosproject.core.ApplicationId; | 29 | import org.onosproject.core.ApplicationId; |
| 29 | import org.onosproject.core.CoreService; | 30 | import org.onosproject.core.CoreService; |
| 30 | import org.onosproject.dhcp.DhcpService; | 31 | import org.onosproject.dhcp.DhcpService; |
| 32 | +import org.onosproject.event.AbstractEvent; | ||
| 31 | import org.onosproject.net.Device; | 33 | import org.onosproject.net.Device; |
| 32 | import org.onosproject.net.DeviceId; | 34 | import org.onosproject.net.DeviceId; |
| 35 | +import org.onosproject.net.Host; | ||
| 33 | import org.onosproject.net.Port; | 36 | import org.onosproject.net.Port; |
| 34 | import org.onosproject.net.config.ConfigFactory; | 37 | import org.onosproject.net.config.ConfigFactory; |
| 35 | import org.onosproject.net.config.NetworkConfigEvent; | 38 | import org.onosproject.net.config.NetworkConfigEvent; |
| ... | @@ -39,7 +42,16 @@ import org.onosproject.net.device.DeviceEvent; | ... | @@ -39,7 +42,16 @@ import org.onosproject.net.device.DeviceEvent; |
| 39 | import org.onosproject.net.device.DeviceListener; | 42 | import org.onosproject.net.device.DeviceListener; |
| 40 | import org.onosproject.net.device.DeviceService; | 43 | import org.onosproject.net.device.DeviceService; |
| 41 | import org.onosproject.net.driver.DriverService; | 44 | import org.onosproject.net.driver.DriverService; |
| 45 | +import org.onosproject.net.flow.FlowEntry; | ||
| 46 | +import org.onosproject.net.flow.FlowRuleService; | ||
| 47 | +import org.onosproject.net.flow.criteria.Criterion; | ||
| 48 | +import org.onosproject.net.flow.criteria.IPCriterion; | ||
| 49 | +import org.onosproject.net.flow.instructions.Instruction; | ||
| 50 | +import org.onosproject.net.flow.instructions.L2ModificationInstruction; | ||
| 42 | import org.onosproject.net.flowobjective.FlowObjectiveService; | 51 | import org.onosproject.net.flowobjective.FlowObjectiveService; |
| 52 | +import org.onosproject.net.host.HostEvent; | ||
| 53 | +import org.onosproject.net.host.HostListener; | ||
| 54 | +import org.onosproject.net.host.HostService; | ||
| 43 | import org.onosproject.net.packet.InboundPacket; | 55 | import org.onosproject.net.packet.InboundPacket; |
| 44 | import org.onosproject.net.packet.PacketContext; | 56 | import org.onosproject.net.packet.PacketContext; |
| 45 | import org.onosproject.net.packet.PacketProcessor; | 57 | import org.onosproject.net.packet.PacketProcessor; |
| ... | @@ -48,6 +60,7 @@ import org.slf4j.Logger; | ... | @@ -48,6 +60,7 @@ import org.slf4j.Logger; |
| 48 | import org.slf4j.LoggerFactory; | 60 | import org.slf4j.LoggerFactory; |
| 49 | import java.util.List; | 61 | import java.util.List; |
| 50 | import java.util.Collection; | 62 | import java.util.Collection; |
| 63 | +import java.util.NoSuchElementException; | ||
| 51 | import java.util.Set; | 64 | import java.util.Set; |
| 52 | import java.util.concurrent.ExecutorService; | 65 | import java.util.concurrent.ExecutorService; |
| 53 | import java.util.concurrent.Executors; | 66 | import java.util.concurrent.Executors; |
| ... | @@ -76,6 +89,9 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -76,6 +89,9 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
| 76 | protected DeviceService deviceService; | 89 | protected DeviceService deviceService; |
| 77 | 90 | ||
| 78 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 91 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
| 92 | + protected HostService hostService; | ||
| 93 | + | ||
| 94 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 79 | protected FlowObjectiveService flowObjectiveService; | 95 | protected FlowObjectiveService flowObjectiveService; |
| 80 | 96 | ||
| 81 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 97 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
| ... | @@ -87,6 +103,8 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -87,6 +103,8 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
| 87 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 103 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
| 88 | protected DriverService driverService; | 104 | protected DriverService driverService; |
| 89 | 105 | ||
| 106 | + protected FlowRuleService flowRuleService; | ||
| 107 | + | ||
| 90 | private ApplicationId appId; | 108 | private ApplicationId appId; |
| 91 | private boolean doNotPushFlows; | 109 | private boolean doNotPushFlows; |
| 92 | private Ip4Address neutronServer; | 110 | private Ip4Address neutronServer; |
| ... | @@ -101,6 +119,7 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -101,6 +119,7 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
| 101 | private InternalPacketProcessor internalPacketProcessor = new InternalPacketProcessor(); | 119 | private InternalPacketProcessor internalPacketProcessor = new InternalPacketProcessor(); |
| 102 | private InternalDeviceListener internalDeviceListener = new InternalDeviceListener(); | 120 | private InternalDeviceListener internalDeviceListener = new InternalDeviceListener(); |
| 103 | private InternalConfigListener internalConfigListener = new InternalConfigListener(); | 121 | private InternalConfigListener internalConfigListener = new InternalConfigListener(); |
| 122 | + private InternalHostListener internalHostListener = new InternalHostListener(); | ||
| 104 | private final Set<ConfigFactory> factories = ImmutableSet.of( | 123 | private final Set<ConfigFactory> factories = ImmutableSet.of( |
| 105 | new ConfigFactory<ApplicationId, OpenstackSwitchingConfig>(APP_SUBJECT_FACTORY, | 124 | new ConfigFactory<ApplicationId, OpenstackSwitchingConfig>(APP_SUBJECT_FACTORY, |
| 106 | OpenstackSwitchingConfig.class, | 125 | OpenstackSwitchingConfig.class, |
| ... | @@ -120,6 +139,7 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -120,6 +139,7 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
| 120 | factories.forEach(cfgService::registerConfigFactory); | 139 | factories.forEach(cfgService::registerConfigFactory); |
| 121 | packetService.addProcessor(internalPacketProcessor, PacketProcessor.director(1)); | 140 | packetService.addProcessor(internalPacketProcessor, PacketProcessor.director(1)); |
| 122 | deviceService.addListener(internalDeviceListener); | 141 | deviceService.addListener(internalDeviceListener); |
| 142 | + hostService.addListener(internalHostListener); | ||
| 123 | cfgService.addListener(internalConfigListener); | 143 | cfgService.addListener(internalConfigListener); |
| 124 | 144 | ||
| 125 | internalConfigListener.configureNetwork(); | 145 | internalConfigListener.configureNetwork(); |
| ... | @@ -132,6 +152,7 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -132,6 +152,7 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
| 132 | packetService.removeProcessor(internalPacketProcessor); | 152 | packetService.removeProcessor(internalPacketProcessor); |
| 133 | deviceService.removeListener(internalDeviceListener); | 153 | deviceService.removeListener(internalDeviceListener); |
| 134 | cfgService.removeListener(internalConfigListener); | 154 | cfgService.removeListener(internalConfigListener); |
| 155 | + factories.forEach(cfgService::unregisterConfigFactory); | ||
| 135 | 156 | ||
| 136 | deviceEventExcutorService.shutdown(); | 157 | deviceEventExcutorService.shutdown(); |
| 137 | 158 | ||
| ... | @@ -144,13 +165,12 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -144,13 +165,12 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
| 144 | } | 165 | } |
| 145 | 166 | ||
| 146 | @Override | 167 | @Override |
| 147 | - public void deletePorts() { | 168 | + public void deletePort(String uuid) { |
| 148 | 169 | ||
| 149 | } | 170 | } |
| 150 | 171 | ||
| 151 | @Override | 172 | @Override |
| 152 | - public void updatePorts() { | 173 | + public void updatePort(OpenstackPort openstackPort) { |
| 153 | - | ||
| 154 | } | 174 | } |
| 155 | 175 | ||
| 156 | @Override | 176 | @Override |
| ... | @@ -201,7 +221,8 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -201,7 +221,8 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
| 201 | } | 221 | } |
| 202 | 222 | ||
| 203 | private void processPortAdded(Device device, Port port) { | 223 | private void processPortAdded(Device device, Port port) { |
| 204 | - if (!port.annotations().value("portName").equals("vxlan")) { | 224 | + if (!port.annotations().value("portName").equals("vxlan") |
| 225 | + && port.isEnabled() && !doNotPushFlows) { | ||
| 205 | OpenstackSwitchingRulePopulator rulePopulator = | 226 | OpenstackSwitchingRulePopulator rulePopulator = |
| 206 | new OpenstackSwitchingRulePopulator(appId, flowObjectiveService, | 227 | new OpenstackSwitchingRulePopulator(appId, flowObjectiveService, |
| 207 | deviceService, restHandler, driverService); | 228 | deviceService, restHandler, driverService); |
| ... | @@ -210,7 +231,6 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -210,7 +231,6 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
| 210 | } | 231 | } |
| 211 | 232 | ||
| 212 | private void processPortRemoved(Device device, Port port) { | 233 | private void processPortRemoved(Device device, Port port) { |
| 213 | - // TODO: Remove flow rules for the VM removed | ||
| 214 | log.debug("port {} is removed", port.toString()); | 234 | log.debug("port {} is removed", port.toString()); |
| 215 | } | 235 | } |
| 216 | 236 | ||
| ... | @@ -238,6 +258,50 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -238,6 +258,50 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
| 238 | ); | 258 | ); |
| 239 | } | 259 | } |
| 240 | 260 | ||
| 261 | + private void processHostRemoved(Host host) { | ||
| 262 | + log.debug("host {} was removed", host.toString()); | ||
| 263 | + | ||
| 264 | + try { | ||
| 265 | + if (!doNotPushFlows) { | ||
| 266 | + IpAddress hostIp = host.ipAddresses().stream(). | ||
| 267 | + filter(ip -> ip.isIp4()).findAny().orElse(null); | ||
| 268 | + OpenstackSwitchingRulePopulator rulePopulator = | ||
| 269 | + new OpenstackSwitchingRulePopulator(appId, flowObjectiveService, | ||
| 270 | + deviceService, restHandler, driverService); | ||
| 271 | + rulePopulator.removeSwitchingRules(host.location().deviceId(), | ||
| 272 | + hostIp.getIp4Address()); | ||
| 273 | + } | ||
| 274 | + | ||
| 275 | + dhcpService.removeStaticMapping(host.mac()); | ||
| 276 | + } catch (NoSuchElementException e) { | ||
| 277 | + log.error("No IP address is assigned."); | ||
| 278 | + } | ||
| 279 | + } | ||
| 280 | + | ||
| 281 | + private long getVniFromFlowRules(DeviceId deviceId, Ip4Address hostIp) { | ||
| 282 | + | ||
| 283 | + for (FlowEntry flowEntry: flowRuleService.getFlowEntries(deviceId)) { | ||
| 284 | + Criterion c = flowEntry.selector().getCriterion(Criterion.Type.IPV4_DST); | ||
| 285 | + if (c != null) { | ||
| 286 | + IPCriterion destIpCriterion = (IPCriterion) c; | ||
| 287 | + if (destIpCriterion.ip().getIp4Prefix().address().equals(hostIp)) { | ||
| 288 | + for (Instruction i : flowEntry.treatment().immediate()) { | ||
| 289 | + if (i.type().equals(Instruction.Type.L2MODIFICATION)) { | ||
| 290 | + L2ModificationInstruction l2m = (L2ModificationInstruction) i; | ||
| 291 | + if (l2m.subtype().equals(L2ModificationInstruction.L2SubType.TUNNEL_ID)) { | ||
| 292 | + L2ModificationInstruction.ModTunnelIdInstruction setTunnelInstr = | ||
| 293 | + (L2ModificationInstruction.ModTunnelIdInstruction) l2m; | ||
| 294 | + return setTunnelInstr.tunnelId(); | ||
| 295 | + } | ||
| 296 | + } | ||
| 297 | + } | ||
| 298 | + } | ||
| 299 | + } | ||
| 300 | + } | ||
| 301 | + | ||
| 302 | + return 0; | ||
| 303 | + } | ||
| 304 | + | ||
| 241 | private void registerDhcpInfo(OpenstackPort openstackPort) { | 305 | private void registerDhcpInfo(OpenstackPort openstackPort) { |
| 242 | Ip4Address ip4Address; | 306 | Ip4Address ip4Address; |
| 243 | Ip4Address subnetMask; | 307 | Ip4Address subnetMask; |
| ... | @@ -301,6 +365,14 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -301,6 +365,14 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
| 301 | } | 365 | } |
| 302 | } | 366 | } |
| 303 | 367 | ||
| 368 | + private class InternalHostListener implements HostListener { | ||
| 369 | + | ||
| 370 | + @Override | ||
| 371 | + public void event(HostEvent hostEvent) { | ||
| 372 | + deviceEventExcutorService.execute(new InternalEventHandler(hostEvent)); | ||
| 373 | + } | ||
| 374 | + } | ||
| 375 | + | ||
| 304 | private class InternalDeviceListener implements DeviceListener { | 376 | private class InternalDeviceListener implements DeviceListener { |
| 305 | 377 | ||
| 306 | @Override | 378 | @Override |
| ... | @@ -311,46 +383,56 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -311,46 +383,56 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
| 311 | 383 | ||
| 312 | private class InternalEventHandler implements Runnable { | 384 | private class InternalEventHandler implements Runnable { |
| 313 | 385 | ||
| 314 | - volatile DeviceEvent deviceEvent; | 386 | + volatile AbstractEvent event; |
| 315 | 387 | ||
| 316 | - InternalEventHandler(DeviceEvent deviceEvent) { | 388 | + InternalEventHandler(AbstractEvent event) { |
| 317 | - this.deviceEvent = deviceEvent; | 389 | + this.event = event; |
| 318 | } | 390 | } |
| 319 | 391 | ||
| 320 | @Override | 392 | @Override |
| 321 | public void run() { | 393 | public void run() { |
| 322 | 394 | ||
| 323 | - if (doNotPushFlows) { | 395 | + if (event instanceof DeviceEvent) { |
| 324 | - return; | 396 | + DeviceEvent deviceEvent = (DeviceEvent) event; |
| 325 | - } | 397 | + |
| 326 | - | 398 | + switch (deviceEvent.type()) { |
| 327 | - switch (deviceEvent.type()) { | 399 | + case DEVICE_ADDED: |
| 328 | - case DEVICE_ADDED: | 400 | + processDeviceAdded((Device) deviceEvent.subject()); |
| 329 | - processDeviceAdded((Device) deviceEvent.subject()); | 401 | + break; |
| 330 | - break; | 402 | + case DEVICE_UPDATED: |
| 331 | - case DEVICE_UPDATED: | 403 | + Port port = (Port) deviceEvent.subject(); |
| 332 | - Port port = (Port) deviceEvent.subject(); | 404 | + if (port.isEnabled()) { |
| 333 | - if (port.isEnabled()) { | 405 | + processPortAdded((Device) deviceEvent.subject(), deviceEvent.port()); |
| 406 | + } | ||
| 407 | + break; | ||
| 408 | + case DEVICE_AVAILABILITY_CHANGED: | ||
| 409 | + Device device = (Device) deviceEvent.subject(); | ||
| 410 | + if (deviceService.isAvailable(device.id())) { | ||
| 411 | + processDeviceAdded(device); | ||
| 412 | + } | ||
| 413 | + break; | ||
| 414 | + case PORT_ADDED: | ||
| 334 | processPortAdded((Device) deviceEvent.subject(), deviceEvent.port()); | 415 | processPortAdded((Device) deviceEvent.subject(), deviceEvent.port()); |
| 335 | - } | 416 | + break; |
| 336 | - break; | 417 | + case PORT_UPDATED: |
| 337 | - case DEVICE_AVAILABILITY_CHANGED: | 418 | + processPortAdded((Device) deviceEvent.subject(), deviceEvent.port()); |
| 338 | - Device device = (Device) deviceEvent.subject(); | 419 | + break; |
| 339 | - if (deviceService.isAvailable(device.id())) { | 420 | + case PORT_REMOVED: |
| 340 | - processDeviceAdded(device); | 421 | + processPortRemoved((Device) deviceEvent.subject(), deviceEvent.port()); |
| 341 | - } | 422 | + break; |
| 342 | - break; | 423 | + default: |
| 343 | - case PORT_ADDED: | 424 | + break; |
| 344 | - processPortAdded((Device) deviceEvent.subject(), deviceEvent.port()); | 425 | + } |
| 345 | - break; | 426 | + } else if (event instanceof HostEvent) { |
| 346 | - case PORT_UPDATED: | 427 | + HostEvent hostEvent = (HostEvent) event; |
| 347 | - processPortAdded((Device) deviceEvent.subject(), deviceEvent.port()); | 428 | + |
| 348 | - break; | 429 | + switch (hostEvent.type()) { |
| 349 | - case PORT_REMOVED: | 430 | + case HOST_REMOVED: |
| 350 | - processPortRemoved((Device) deviceEvent.subject(), deviceEvent.port()); | 431 | + processHostRemoved((Host) hostEvent.subject()); |
| 351 | - break; | 432 | + break; |
| 352 | - default: | 433 | + default: |
| 353 | - break; | 434 | + break; |
| 435 | + } | ||
| 354 | } | 436 | } |
| 355 | } | 437 | } |
| 356 | } | 438 | } |
| ... | @@ -395,5 +477,4 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { | ... | @@ -395,5 +477,4 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { |
| 395 | this.hostIp = hostIp; | 477 | this.hostIp = hostIp; |
| 396 | } | 478 | } |
| 397 | } | 479 | } |
| 398 | - | ||
| 399 | } | 480 | } |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| ... | @@ -131,6 +131,21 @@ public class OpenstackSwitchingRulePopulator { | ... | @@ -131,6 +131,21 @@ public class OpenstackSwitchingRulePopulator { |
| 131 | } | 131 | } |
| 132 | 132 | ||
| 133 | /** | 133 | /** |
| 134 | + * Remove flows rules for the VM removed. | ||
| 135 | + * | ||
| 136 | + * @param deviceId device to remove rules | ||
| 137 | + * @param vmIp IP address of the VM removed | ||
| 138 | + */ | ||
| 139 | + public void removeSwitchingRules(DeviceId deviceId, Ip4Address vmIp) { | ||
| 140 | + removeFlowRuleForVMsInSameCnode(deviceId, vmIp); | ||
| 141 | + deviceService.getAvailableDevices().forEach(device -> { | ||
| 142 | + if (!device.id().equals(deviceId)) { | ||
| 143 | + removeVxLanFlowRule(device.id(), vmIp); | ||
| 144 | + } | ||
| 145 | + }); | ||
| 146 | + } | ||
| 147 | + | ||
| 148 | + /** | ||
| 134 | * Populates the flow rules for traffic to VMs in the same Cnode as the sender. | 149 | * Populates the flow rules for traffic to VMs in the same Cnode as the sender. |
| 135 | * | 150 | * |
| 136 | * @param device device to put the rules | 151 | * @param device device to put the rules |
| ... | @@ -170,9 +185,10 @@ public class OpenstackSwitchingRulePopulator { | ... | @@ -170,9 +185,10 @@ public class OpenstackSwitchingRulePopulator { |
| 170 | Ip4Address hostIpx = Ip4Address.valueOf(cidx.split(":")[0]); | 185 | Ip4Address hostIpx = Ip4Address.valueOf(cidx.split(":")[0]); |
| 171 | MacAddress vmMacx = getVmMacAddressForPort(pName); | 186 | MacAddress vmMacx = getVmMacAddressForPort(pName); |
| 172 | Ip4Address fixedIpx = getFixedIpAddressForPort(pName); | 187 | Ip4Address fixedIpx = getFixedIpAddressForPort(pName); |
| 173 | - | 188 | + if (port.isEnabled()) { |
| 174 | - setVxLanFlowRule(vni, device.id(), hostIpx, fixedIpx, vmMacx); | 189 | + setVxLanFlowRule(vni, device.id(), hostIpx, fixedIpx, vmMacx); |
| 175 | - setVxLanFlowRule(vni, d.id(), hostIpAddress, fixedIp, vmMac); | 190 | + setVxLanFlowRule(vni, d.id(), hostIpAddress, fixedIp, vmMac); |
| 191 | + } | ||
| 176 | } | 192 | } |
| 177 | }); | 193 | }); |
| 178 | } | 194 | } |
| ... | @@ -246,7 +262,7 @@ public class OpenstackSwitchingRulePopulator { | ... | @@ -246,7 +262,7 @@ public class OpenstackSwitchingRulePopulator { |
| 246 | .findFirst().orElse(null); | 262 | .findFirst().orElse(null); |
| 247 | 263 | ||
| 248 | if (port == null) { | 264 | if (port == null) { |
| 249 | - log.error("There is port information for port name {}", portName); | 265 | + log.error("There is no port information for port name {}", portName); |
| 250 | return null; | 266 | return null; |
| 251 | } | 267 | } |
| 252 | 268 | ||
| ... | @@ -341,6 +357,40 @@ public class OpenstackSwitchingRulePopulator { | ... | @@ -341,6 +357,40 @@ public class OpenstackSwitchingRulePopulator { |
| 341 | flowObjectiveService.forward(id, fo); | 357 | flowObjectiveService.forward(id, fo); |
| 342 | } | 358 | } |
| 343 | 359 | ||
| 360 | + private void removeFlowRuleForVMsInSameCnode(DeviceId id, Ip4Address vmIp) { | ||
| 361 | + TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder(); | ||
| 362 | + | ||
| 363 | + sBuilder.matchEthType(Ethernet.TYPE_IPV4) | ||
| 364 | + .matchIPDst(vmIp.toIpPrefix()); | ||
| 365 | + | ||
| 366 | + ForwardingObjective fo = DefaultForwardingObjective.builder() | ||
| 367 | + .withSelector(sBuilder.build()) | ||
| 368 | + .withTreatment(DefaultTrafficTreatment.builder().build()) | ||
| 369 | + .withFlag(ForwardingObjective.Flag.VERSATILE) | ||
| 370 | + .withPriority(SWITCHING_RULE_PRIORITY) | ||
| 371 | + .fromApp(appId) | ||
| 372 | + .remove(); | ||
| 373 | + | ||
| 374 | + flowObjectiveService.forward(id, fo); | ||
| 375 | + } | ||
| 376 | + | ||
| 377 | + private void removeVxLanFlowRule(DeviceId id, Ip4Address vmIp) { | ||
| 378 | + TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder(); | ||
| 379 | + // XXX: Later, more matches will be added when multiple table is implemented. | ||
| 380 | + sBuilder.matchEthType(Ethernet.TYPE_IPV4) | ||
| 381 | + .matchIPDst(vmIp.toIpPrefix()); | ||
| 382 | + | ||
| 383 | + ForwardingObjective fo = DefaultForwardingObjective.builder() | ||
| 384 | + .withSelector(sBuilder.build()) | ||
| 385 | + .withTreatment(DefaultTrafficTreatment.builder().build()) | ||
| 386 | + .withFlag(ForwardingObjective.Flag.VERSATILE) | ||
| 387 | + .withPriority(SWITCHING_RULE_PRIORITY) | ||
| 388 | + .fromApp(appId) | ||
| 389 | + .remove(); | ||
| 390 | + | ||
| 391 | + flowObjectiveService.forward(id, fo); | ||
| 392 | + } | ||
| 393 | + | ||
| 344 | private ExtensionTreatment buildNiciraExtenstion(DeviceId id, Ip4Address hostIp) { | 394 | private ExtensionTreatment buildNiciraExtenstion(DeviceId id, Ip4Address hostIp) { |
| 345 | Driver driver = driverService.getDriver(id); | 395 | Driver driver = driverService.getDriver(id); |
| 346 | DriverHandler driverHandler = new DefaultDriverHandler(new DefaultDriverData(driver, id)); | 396 | DriverHandler driverHandler = new DefaultDriverHandler(new DefaultDriverData(driver, id)); | ... | ... |
| ... | @@ -28,6 +28,7 @@ import javax.ws.rs.DELETE; | ... | @@ -28,6 +28,7 @@ import javax.ws.rs.DELETE; |
| 28 | import javax.ws.rs.POST; | 28 | import javax.ws.rs.POST; |
| 29 | import javax.ws.rs.PUT; | 29 | import javax.ws.rs.PUT; |
| 30 | import javax.ws.rs.Path; | 30 | import javax.ws.rs.Path; |
| 31 | +import javax.ws.rs.PathParam; | ||
| 31 | import javax.ws.rs.Produces; | 32 | import javax.ws.rs.Produces; |
| 32 | import javax.ws.rs.core.MediaType; | 33 | import javax.ws.rs.core.MediaType; |
| 33 | import javax.ws.rs.core.Response; | 34 | import javax.ws.rs.core.Response; |
| ... | @@ -68,12 +69,9 @@ public class OpenstackPortWebResource extends AbstractWebResource { | ... | @@ -68,12 +69,9 @@ public class OpenstackPortWebResource extends AbstractWebResource { |
| 68 | } | 69 | } |
| 69 | } | 70 | } |
| 70 | 71 | ||
| 72 | + @Path("{portUUID}") | ||
| 71 | @DELETE | 73 | @DELETE |
| 72 | - @Path("{id}") | 74 | + public Response deletePorts(@PathParam("portUUID") String id) { |
| 73 | - @Consumes(MediaType.APPLICATION_JSON) | ||
| 74 | - @Produces(MediaType.APPLICATION_JSON) | ||
| 75 | - public Response deletesPorts(InputStream input) { | ||
| 76 | - log.debug("REST API ports is called with {}", input.toString()); | ||
| 77 | return Response.status(Response.Status.OK).build(); | 75 | return Response.status(Response.Status.OK).build(); |
| 78 | } | 76 | } |
| 79 | 77 | ||
| ... | @@ -82,7 +80,6 @@ public class OpenstackPortWebResource extends AbstractWebResource { | ... | @@ -82,7 +80,6 @@ public class OpenstackPortWebResource extends AbstractWebResource { |
| 82 | @Consumes(MediaType.APPLICATION_JSON) | 80 | @Consumes(MediaType.APPLICATION_JSON) |
| 83 | @Produces(MediaType.APPLICATION_JSON) | 81 | @Produces(MediaType.APPLICATION_JSON) |
| 84 | public Response updatePorts(InputStream input) { | 82 | public Response updatePorts(InputStream input) { |
| 85 | - log.info("REST API ports is called with {}", input.toString()); | ||
| 86 | return Response.status(Response.Status.OK).build(); | 83 | return Response.status(Response.Status.OK).build(); |
| 87 | } | 84 | } |
| 88 | } | 85 | } | ... | ... |
| ... | @@ -32,19 +32,31 @@ | ... | @@ -32,19 +32,31 @@ |
| 32 | "nodes" : [ | 32 | "nodes" : [ |
| 33 | { | 33 | { |
| 34 | "hostname" : "compute-01", | 34 | "hostname" : "compute-01", |
| 35 | +<<<<<<< HEAD | ||
| 35 | "ovsdbIp" : "10.40.101.208", | 36 | "ovsdbIp" : "10.40.101.208", |
| 37 | +======= | ||
| 38 | + "ovsdbIp" : "127.0.0.1", | ||
| 39 | +>>>>>>> 6a78e2e... SONA: OpenstackSwitching - remove flows | ||
| 36 | "ovsdbPort" : "6640", | 40 | "ovsdbPort" : "6640", |
| 37 | "bridgeId" : "of:0000000000000001" | 41 | "bridgeId" : "of:0000000000000001" |
| 38 | }, | 42 | }, |
| 39 | { | 43 | { |
| 40 | "hostname" : "compute-02", | 44 | "hostname" : "compute-02", |
| 45 | +<<<<<<< HEAD | ||
| 41 | "ovsdbIp" : "10.40.101.227", | 46 | "ovsdbIp" : "10.40.101.227", |
| 47 | +======= | ||
| 48 | + "ovsdbIp" : "127.0.0.1", | ||
| 49 | +>>>>>>> 6a78e2e... SONA: OpenstackSwitching - remove flows | ||
| 42 | "ovsdbPort" : "6640", | 50 | "ovsdbPort" : "6640", |
| 43 | "bridgeId" : "of:0000000000000002" | 51 | "bridgeId" : "of:0000000000000002" |
| 44 | }, | 52 | }, |
| 45 | { | 53 | { |
| 46 | "hostname" : "network", | 54 | "hostname" : "network", |
| 55 | +<<<<<<< HEAD | ||
| 47 | "ovsdbIp" : "10.40.101.209", | 56 | "ovsdbIp" : "10.40.101.209", |
| 57 | +======= | ||
| 58 | + "ovsdbIp" : "127.0.0.1", | ||
| 59 | +>>>>>>> 6a78e2e... SONA: OpenstackSwitching - remove flows | ||
| 48 | "ovsdbPort" : "6640", | 60 | "ovsdbPort" : "6640", |
| 49 | "bridgeId" : "of:0000000000000003" | 61 | "bridgeId" : "of:0000000000000003" |
| 50 | } | 62 | } | ... | ... |
-
Please register or login to post a comment