Committed by
Gerrit Code Review
Fixed some bugs
- Update br-int rather than do nothing if it already exists - Make only the leader performs node bootstrap - Check mastership on HOST event not flow rule populator - Install/uninstall flow rules for vSG always from master, or the rules stay in PENDING_ADDED state Change-Id: I4bd5cf6f84bf36f2617288b2d843435819c76ba8
Showing
4 changed files
with
142 additions
and
79 deletions
| ... | @@ -145,6 +145,7 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro | ... | @@ -145,6 +145,7 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro |
| 145 | private static final String DATA_PLANE_IP = "dataPlaneIp"; | 145 | private static final String DATA_PLANE_IP = "dataPlaneIp"; |
| 146 | private static final String DATA_PLANE_INTF = "dataPlaneIntf"; | 146 | private static final String DATA_PLANE_INTF = "dataPlaneIntf"; |
| 147 | private static final String S_TAG = "stag"; | 147 | private static final String S_TAG = "stag"; |
| 148 | + private static final String VSG_HOST_ID = "vsgHostId"; | ||
| 148 | 149 | ||
| 149 | private static final Ip4Address DEFAULT_DNS = Ip4Address.valueOf("8.8.8.8"); | 150 | private static final Ip4Address DEFAULT_DNS = Ip4Address.valueOf("8.8.8.8"); |
| 150 | 151 | ||
| ... | @@ -175,7 +176,6 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro | ... | @@ -175,7 +176,6 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro |
| 175 | deviceService, | 176 | deviceService, |
| 176 | driverService, | 177 | driverService, |
| 177 | groupService, | 178 | groupService, |
| 178 | - mastershipService, | ||
| 179 | DEFAULT_TUNNEL); | 179 | DEFAULT_TUNNEL); |
| 180 | 180 | ||
| 181 | arpProxy = new CordVtnArpProxy(appId, packetService, hostService); | 181 | arpProxy = new CordVtnArpProxy(appId, packetService, hostService); |
| ... | @@ -301,30 +301,28 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro | ... | @@ -301,30 +301,28 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro |
| 301 | @Override | 301 | @Override |
| 302 | public void updateVirtualSubscriberGateways(HostId vSgHostId, String serviceVlan, | 302 | public void updateVirtualSubscriberGateways(HostId vSgHostId, String serviceVlan, |
| 303 | Map<IpAddress, MacAddress> vSgs) { | 303 | Map<IpAddress, MacAddress> vSgs) { |
| 304 | - Host vSgVm = hostService.getHost(vSgHostId); | 304 | + Host vSgHost = hostService.getHost(vSgHostId); |
| 305 | - | 305 | + if (vSgHost == null || !vSgHost.annotations().value(S_TAG).equals(serviceVlan)) { |
| 306 | - if (vSgVm == null || !vSgVm.annotations().value(S_TAG).equals(serviceVlan)) { | ||
| 307 | log.debug("Invalid vSG updates for {}", serviceVlan); | 306 | log.debug("Invalid vSG updates for {}", serviceVlan); |
| 308 | return; | 307 | return; |
| 309 | } | 308 | } |
| 310 | 309 | ||
| 311 | - log.info("Updates vSGs in {} with {}", vSgVm.id(), vSgs.toString()); | 310 | + log.info("Updates vSGs in {} with {}", vSgHost.id(), vSgs.toString()); |
| 312 | vSgs.entrySet().stream() | 311 | vSgs.entrySet().stream() |
| 312 | + .filter(entry -> hostService.getHostsByMac(entry.getValue()).isEmpty()) | ||
| 313 | .forEach(entry -> addVirtualSubscriberGateway( | 313 | .forEach(entry -> addVirtualSubscriberGateway( |
| 314 | - vSgVm, | 314 | + vSgHost, |
| 315 | entry.getKey(), | 315 | entry.getKey(), |
| 316 | entry.getValue(), | 316 | entry.getValue(), |
| 317 | serviceVlan)); | 317 | serviceVlan)); |
| 318 | 318 | ||
| 319 | - hostService.getConnectedHosts(vSgVm.location()).stream() | 319 | + hostService.getConnectedHosts(vSgHost.location()).stream() |
| 320 | - .filter(host -> !host.mac().equals(vSgVm.mac())) | 320 | + .filter(host -> !host.mac().equals(vSgHost.mac())) |
| 321 | .filter(host -> !vSgs.values().contains(host.mac())) | 321 | .filter(host -> !vSgs.values().contains(host.mac())) |
| 322 | .forEach(host -> { | 322 | .forEach(host -> { |
| 323 | log.info("Removed vSG {}", host.toString()); | 323 | log.info("Removed vSG {}", host.toString()); |
| 324 | hostProvider.hostVanished(host.id()); | 324 | hostProvider.hostVanished(host.id()); |
| 325 | }); | 325 | }); |
| 326 | - | ||
| 327 | - ruleInstaller.populateSubscriberGatewayRules(vSgVm, vSgs.keySet()); | ||
| 328 | } | 326 | } |
| 329 | 327 | ||
| 330 | /** | 328 | /** |
| ... | @@ -337,16 +335,12 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro | ... | @@ -337,16 +335,12 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro |
| 337 | */ | 335 | */ |
| 338 | private void addVirtualSubscriberGateway(Host vSgHost, IpAddress vSgIp, MacAddress vSgMac, | 336 | private void addVirtualSubscriberGateway(Host vSgHost, IpAddress vSgIp, MacAddress vSgMac, |
| 339 | String serviceVlan) { | 337 | String serviceVlan) { |
| 340 | - HostId hostId = HostId.hostId(vSgMac); | 338 | + log.info("vSG with IP({}) MAC({}) added", vSgIp.toString(), vSgMac.toString()); |
| 341 | - Host host = hostService.getHost(hostId); | ||
| 342 | - if (host != null) { | ||
| 343 | - log.trace("vSG with {} already exists", vSgMac.toString()); | ||
| 344 | - return; | ||
| 345 | - } | ||
| 346 | 339 | ||
| 347 | - log.info("vSG with IP({}) MAC({}) detected", vSgIp.toString(), vSgMac.toString()); | 340 | + HostId hostId = HostId.hostId(vSgMac); |
| 348 | DefaultAnnotations.Builder annotations = DefaultAnnotations.builder() | 341 | DefaultAnnotations.Builder annotations = DefaultAnnotations.builder() |
| 349 | - .set(S_TAG, serviceVlan); | 342 | + .set(S_TAG, serviceVlan) |
| 343 | + .set(VSG_HOST_ID, vSgHost.id().toString()); | ||
| 350 | 344 | ||
| 351 | HostDescription hostDesc = new DefaultHostDescription( | 345 | HostDescription hostDesc = new DefaultHostDescription( |
| 352 | vSgMac, | 346 | vSgMac, |
| ... | @@ -529,6 +523,11 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro | ... | @@ -529,6 +523,11 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro |
| 529 | * @param host host | 523 | * @param host host |
| 530 | */ | 524 | */ |
| 531 | private void serviceVmAdded(Host host) { | 525 | private void serviceVmAdded(Host host) { |
| 526 | + String serviceVlan = host.annotations().value(S_TAG); | ||
| 527 | + if (serviceVlan != null) { | ||
| 528 | + virtualSubscriberGatewayAdded(host, serviceVlan); | ||
| 529 | + } | ||
| 530 | + | ||
| 532 | String vNetId = host.annotations().value(SERVICE_ID); | 531 | String vNetId = host.annotations().value(SERVICE_ID); |
| 533 | if (vNetId == null) { | 532 | if (vNetId == null) { |
| 534 | // ignore this host, it is not the service VM, or it's a vSG | 533 | // ignore this host, it is not the service VM, or it's a vSG |
| ... | @@ -538,8 +537,7 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro | ... | @@ -538,8 +537,7 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro |
| 538 | OpenstackNetwork vNet = openstackService.network(vNetId); | 537 | OpenstackNetwork vNet = openstackService.network(vNetId); |
| 539 | if (vNet == null) { | 538 | if (vNet == null) { |
| 540 | log.warn("Failed to get OpenStack network {} for VM {}({}).", | 539 | log.warn("Failed to get OpenStack network {} for VM {}({}).", |
| 541 | - vNetId, | 540 | + vNetId, host.id(), |
| 542 | - host.id(), | ||
| 543 | host.annotations().value(OPENSTACK_VM_ID)); | 541 | host.annotations().value(OPENSTACK_VM_ID)); |
| 544 | return; | 542 | return; |
| 545 | } | 543 | } |
| ... | @@ -572,20 +570,6 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro | ... | @@ -572,20 +570,6 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro |
| 572 | 570 | ||
| 573 | registerDhcpLease(host, service); | 571 | registerDhcpLease(host, service); |
| 574 | ruleInstaller.populateBasicConnectionRules(host, getTunnelIp(host), vNet); | 572 | ruleInstaller.populateBasicConnectionRules(host, getTunnelIp(host), vNet); |
| 575 | - | ||
| 576 | - String serviceVlan = host.annotations().value(S_TAG); | ||
| 577 | - if (serviceVlan != null) { | ||
| 578 | - log.debug("vSG VM detected {}", host.id()); | ||
| 579 | - Map<IpAddress, MacAddress> vSgs = getSubscriberGateways(host); | ||
| 580 | - vSgs.entrySet().stream() | ||
| 581 | - .forEach(entry -> addVirtualSubscriberGateway( | ||
| 582 | - host, | ||
| 583 | - entry.getKey(), | ||
| 584 | - entry.getValue(), | ||
| 585 | - serviceVlan)); | ||
| 586 | - | ||
| 587 | - ruleInstaller.populateSubscriberGatewayRules(host, vSgs.keySet()); | ||
| 588 | - } | ||
| 589 | } | 573 | } |
| 590 | 574 | ||
| 591 | /** | 575 | /** |
| ... | @@ -594,21 +578,21 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro | ... | @@ -594,21 +578,21 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro |
| 594 | * @param host host | 578 | * @param host host |
| 595 | */ | 579 | */ |
| 596 | private void serviceVmRemoved(Host host) { | 580 | private void serviceVmRemoved(Host host) { |
| 581 | + String serviceVlan = host.annotations().value(S_TAG); | ||
| 582 | + if (serviceVlan != null) { | ||
| 583 | + virtualSubscriberGatewayRemoved(host); | ||
| 584 | + } | ||
| 585 | + | ||
| 597 | String vNetId = host.annotations().value(SERVICE_ID); | 586 | String vNetId = host.annotations().value(SERVICE_ID); |
| 598 | if (vNetId == null) { | 587 | if (vNetId == null) { |
| 599 | // ignore it, it's not the service VM or it's a vSG | 588 | // ignore it, it's not the service VM or it's a vSG |
| 600 | - String serviceVlan = host.annotations().value(S_TAG); | ||
| 601 | - if (serviceVlan != null) { | ||
| 602 | - log.info("vSG {} removed", host.id()); | ||
| 603 | - } | ||
| 604 | return; | 589 | return; |
| 605 | } | 590 | } |
| 606 | 591 | ||
| 607 | OpenstackNetwork vNet = openstackService.network(vNetId); | 592 | OpenstackNetwork vNet = openstackService.network(vNetId); |
| 608 | if (vNet == null) { | 593 | if (vNet == null) { |
| 609 | log.warn("Failed to get OpenStack network {} for VM {}({}).", | 594 | log.warn("Failed to get OpenStack network {} for VM {}({}).", |
| 610 | - vNetId, | 595 | + vNetId, host.id(), |
| 611 | - host.id(), | ||
| 612 | host.annotations().value(OPENSTACK_VM_ID)); | 596 | host.annotations().value(OPENSTACK_VM_ID)); |
| 613 | return; | 597 | return; |
| 614 | } | 598 | } |
| ... | @@ -642,6 +626,62 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro | ... | @@ -642,6 +626,62 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro |
| 642 | } | 626 | } |
| 643 | } | 627 | } |
| 644 | 628 | ||
| 629 | + | ||
| 630 | + /** | ||
| 631 | + * Handles virtual subscriber gateway VM or container. | ||
| 632 | + * | ||
| 633 | + * @param host new host with stag, it can be vsg VM or vsg | ||
| 634 | + * @param serviceVlan service vlan | ||
| 635 | + */ | ||
| 636 | + private void virtualSubscriberGatewayAdded(Host host, String serviceVlan) { | ||
| 637 | + Map<IpAddress, MacAddress> vSgs; | ||
| 638 | + Host vSgHost; | ||
| 639 | + | ||
| 640 | + String vSgHostId = host.annotations().value(VSG_HOST_ID); | ||
| 641 | + if (vSgHostId == null) { | ||
| 642 | + log.debug("vSG VM detected {}", host.id()); | ||
| 643 | + | ||
| 644 | + vSgHost = host; | ||
| 645 | + vSgs = getSubscriberGateways(vSgHost); | ||
| 646 | + vSgs.entrySet().stream().forEach(entry -> addVirtualSubscriberGateway( | ||
| 647 | + vSgHost, | ||
| 648 | + entry.getKey(), | ||
| 649 | + entry.getValue(), | ||
| 650 | + serviceVlan)); | ||
| 651 | + } else { | ||
| 652 | + vSgHost = hostService.getHost(HostId.hostId(vSgHostId)); | ||
| 653 | + if (vSgHost == null) { | ||
| 654 | + return; | ||
| 655 | + } | ||
| 656 | + | ||
| 657 | + log.debug("vSG detected {}", host.id()); | ||
| 658 | + vSgs = getSubscriberGateways(vSgHost); | ||
| 659 | + } | ||
| 660 | + | ||
| 661 | + ruleInstaller.populateSubscriberGatewayRules(vSgHost, vSgs.keySet()); | ||
| 662 | + } | ||
| 663 | + | ||
| 664 | + /** | ||
| 665 | + * Handles virtual subscriber gateway removed. | ||
| 666 | + * | ||
| 667 | + * @param vSg vsg host to remove | ||
| 668 | + */ | ||
| 669 | + private void virtualSubscriberGatewayRemoved(Host vSg) { | ||
| 670 | + String vSgHostId = vSg.annotations().value(VSG_HOST_ID); | ||
| 671 | + if (vSgHostId == null) { | ||
| 672 | + return; | ||
| 673 | + } | ||
| 674 | + | ||
| 675 | + Host vSgHost = hostService.getHost(HostId.hostId(vSgHostId)); | ||
| 676 | + if (vSgHost == null) { | ||
| 677 | + return; | ||
| 678 | + } | ||
| 679 | + | ||
| 680 | + log.info("vSG removed {}", vSg.id()); | ||
| 681 | + Map<IpAddress, MacAddress> vSgs = getSubscriberGateways(vSgHost); | ||
| 682 | + ruleInstaller.populateSubscriberGatewayRules(vSgHost, vSgs.keySet()); | ||
| 683 | + } | ||
| 684 | + | ||
| 645 | /** | 685 | /** |
| 646 | * Sets service network gateway MAC address and sends out gratuitous ARP to all | 686 | * Sets service network gateway MAC address and sends out gratuitous ARP to all |
| 647 | * VMs to update the gateway MAC address. | 687 | * VMs to update the gateway MAC address. |
| ... | @@ -709,10 +749,14 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro | ... | @@ -709,10 +749,14 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro |
| 709 | 749 | ||
| 710 | switch (event.type()) { | 750 | switch (event.type()) { |
| 711 | case HOST_ADDED: | 751 | case HOST_ADDED: |
| 712 | - eventExecutor.submit(() -> serviceVmAdded(host)); | 752 | + if (mastershipService.isLocalMaster(host.location().deviceId())) { |
| 753 | + eventExecutor.submit(() -> serviceVmAdded(host)); | ||
| 754 | + } | ||
| 713 | break; | 755 | break; |
| 714 | case HOST_REMOVED: | 756 | case HOST_REMOVED: |
| 715 | - eventExecutor.submit(() -> serviceVmRemoved(host)); | 757 | + if (mastershipService.isLocalMaster(host.location().deviceId())) { |
| 758 | + eventExecutor.submit(() -> serviceVmRemoved(host)); | ||
| 759 | + } | ||
| 716 | break; | 760 | break; |
| 717 | default: | 761 | default: |
| 718 | break; | 762 | break; | ... | ... |
| ... | @@ -27,9 +27,10 @@ import org.onlab.packet.IpAddress; | ... | @@ -27,9 +27,10 @@ import org.onlab.packet.IpAddress; |
| 27 | import org.onlab.util.ItemNotFoundException; | 27 | import org.onlab.util.ItemNotFoundException; |
| 28 | import org.onlab.util.KryoNamespace; | 28 | import org.onlab.util.KryoNamespace; |
| 29 | import org.onosproject.cluster.ClusterService; | 29 | import org.onosproject.cluster.ClusterService; |
| 30 | +import org.onosproject.cluster.LeadershipService; | ||
| 31 | +import org.onosproject.cluster.NodeId; | ||
| 30 | import org.onosproject.core.ApplicationId; | 32 | import org.onosproject.core.ApplicationId; |
| 31 | import org.onosproject.core.CoreService; | 33 | import org.onosproject.core.CoreService; |
| 32 | -import org.onosproject.mastership.MastershipService; | ||
| 33 | import org.onosproject.net.ConnectPoint; | 34 | import org.onosproject.net.ConnectPoint; |
| 34 | import org.onosproject.net.DefaultAnnotations; | 35 | import org.onosproject.net.DefaultAnnotations; |
| 35 | import org.onosproject.net.Device; | 36 | import org.onosproject.net.Device; |
| ... | @@ -70,6 +71,7 @@ import java.util.ArrayList; | ... | @@ -70,6 +71,7 @@ import java.util.ArrayList; |
| 70 | import java.util.HashMap; | 71 | import java.util.HashMap; |
| 71 | import java.util.List; | 72 | import java.util.List; |
| 72 | import java.util.Map; | 73 | import java.util.Map; |
| 74 | +import java.util.Objects; | ||
| 73 | import java.util.Set; | 75 | import java.util.Set; |
| 74 | import java.util.concurrent.ExecutorService; | 76 | import java.util.concurrent.ExecutorService; |
| 75 | import java.util.stream.Collectors; | 77 | import java.util.stream.Collectors; |
| ... | @@ -149,7 +151,7 @@ public class CordVtnNodeManager { | ... | @@ -149,7 +151,7 @@ public class CordVtnNodeManager { |
| 149 | protected FlowRuleService flowRuleService; | 151 | protected FlowRuleService flowRuleService; |
| 150 | 152 | ||
| 151 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 153 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
| 152 | - protected MastershipService mastershipService; | 154 | + protected LeadershipService leadershipService; |
| 153 | 155 | ||
| 154 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 156 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
| 155 | protected GroupService groupService; | 157 | protected GroupService groupService; |
| ... | @@ -169,6 +171,7 @@ public class CordVtnNodeManager { | ... | @@ -169,6 +171,7 @@ public class CordVtnNodeManager { |
| 169 | private ConsistentMap<String, CordVtnNode> nodeStore; | 171 | private ConsistentMap<String, CordVtnNode> nodeStore; |
| 170 | private CordVtnRuleInstaller ruleInstaller; | 172 | private CordVtnRuleInstaller ruleInstaller; |
| 171 | private ApplicationId appId; | 173 | private ApplicationId appId; |
| 174 | + private NodeId localNodeId; | ||
| 172 | 175 | ||
| 173 | private enum NodeState implements CordVtnNodeState { | 176 | private enum NodeState implements CordVtnNodeState { |
| 174 | 177 | ||
| ... | @@ -217,6 +220,9 @@ public class CordVtnNodeManager { | ... | @@ -217,6 +220,9 @@ public class CordVtnNodeManager { |
| 217 | @Activate | 220 | @Activate |
| 218 | protected void active() { | 221 | protected void active() { |
| 219 | appId = coreService.getAppId(CordVtnService.CORDVTN_APP_ID); | 222 | appId = coreService.getAppId(CordVtnService.CORDVTN_APP_ID); |
| 223 | + localNodeId = clusterService.getLocalNode().id(); | ||
| 224 | + leadershipService.runForLeadership(appId.name()); | ||
| 225 | + | ||
| 220 | nodeStore = storageService.<String, CordVtnNode>consistentMapBuilder() | 226 | nodeStore = storageService.<String, CordVtnNode>consistentMapBuilder() |
| 221 | .withSerializer(Serializer.using(NODE_SERIALIZER.build())) | 227 | .withSerializer(Serializer.using(NODE_SERIALIZER.build())) |
| 222 | .withName("cordvtn-nodestore") | 228 | .withName("cordvtn-nodestore") |
| ... | @@ -227,7 +233,6 @@ public class CordVtnNodeManager { | ... | @@ -227,7 +233,6 @@ public class CordVtnNodeManager { |
| 227 | deviceService, | 233 | deviceService, |
| 228 | driverService, | 234 | driverService, |
| 229 | groupService, | 235 | groupService, |
| 230 | - mastershipService, | ||
| 231 | DEFAULT_TUNNEL); | 236 | DEFAULT_TUNNEL); |
| 232 | 237 | ||
| 233 | deviceService.addListener(deviceListener); | 238 | deviceService.addListener(deviceListener); |
| ... | @@ -242,6 +247,7 @@ public class CordVtnNodeManager { | ... | @@ -242,6 +247,7 @@ public class CordVtnNodeManager { |
| 242 | 247 | ||
| 243 | eventExecutor.shutdown(); | 248 | eventExecutor.shutdown(); |
| 244 | nodeStore.clear(); | 249 | nodeStore.clear(); |
| 250 | + leadershipService.withdraw(appId.name()); | ||
| 245 | } | 251 | } |
| 246 | 252 | ||
| 247 | /** | 253 | /** |
| ... | @@ -285,6 +291,13 @@ public class CordVtnNodeManager { | ... | @@ -285,6 +291,13 @@ public class CordVtnNodeManager { |
| 285 | return; | 291 | return; |
| 286 | } | 292 | } |
| 287 | 293 | ||
| 294 | + NodeId leaderNodeId = leadershipService.getLeader(appId.name()); | ||
| 295 | + log.debug("Node init requested, local: {} leader: {}", localNodeId, leaderNodeId); | ||
| 296 | + if (!Objects.equals(localNodeId, leaderNodeId)) { | ||
| 297 | + // only the leader performs node init | ||
| 298 | + return; | ||
| 299 | + } | ||
| 300 | + | ||
| 288 | NodeState state = getNodeState(node); | 301 | NodeState state = getNodeState(node); |
| 289 | log.debug("Init node: {} state: {}", node.hostname(), state.toString()); | 302 | log.debug("Init node: {} state: {}", node.hostname(), state.toString()); |
| 290 | state.process(this, node); | 303 | state.process(this, node); |
| ... | @@ -839,6 +852,12 @@ public class CordVtnNodeManager { | ... | @@ -839,6 +852,12 @@ public class CordVtnNodeManager { |
| 839 | @Override | 852 | @Override |
| 840 | public void event(DeviceEvent event) { | 853 | public void event(DeviceEvent event) { |
| 841 | 854 | ||
| 855 | + NodeId leaderNodeId = leadershipService.getLeader(appId.name()); | ||
| 856 | + if (!Objects.equals(localNodeId, leaderNodeId)) { | ||
| 857 | + // only the leader processes events | ||
| 858 | + return; | ||
| 859 | + } | ||
| 860 | + | ||
| 842 | Device device = event.subject(); | 861 | Device device = event.subject(); |
| 843 | ConnectionHandler<Device> handler = | 862 | ConnectionHandler<Device> handler = |
| 844 | (device.type().equals(SWITCH) ? bridgeHandler : ovsdbHandler); | 863 | (device.type().equals(SWITCH) ? bridgeHandler : ovsdbHandler); | ... | ... |
| ... | @@ -30,7 +30,6 @@ import org.onlab.util.ItemNotFoundException; | ... | @@ -30,7 +30,6 @@ import org.onlab.util.ItemNotFoundException; |
| 30 | import org.onosproject.core.ApplicationId; | 30 | import org.onosproject.core.ApplicationId; |
| 31 | import org.onosproject.core.DefaultGroupId; | 31 | import org.onosproject.core.DefaultGroupId; |
| 32 | import org.onosproject.core.GroupId; | 32 | import org.onosproject.core.GroupId; |
| 33 | -import org.onosproject.mastership.MastershipService; | ||
| 34 | import org.onosproject.net.Device; | 33 | import org.onosproject.net.Device; |
| 35 | import org.onosproject.net.DeviceId; | 34 | import org.onosproject.net.DeviceId; |
| 36 | import org.onosproject.net.Host; | 35 | import org.onosproject.net.Host; |
| ... | @@ -120,13 +119,13 @@ public class CordVtnRuleInstaller { | ... | @@ -120,13 +119,13 @@ public class CordVtnRuleInstaller { |
| 120 | private static final String PORT_NAME = "portName"; | 119 | private static final String PORT_NAME = "portName"; |
| 121 | private static final String DATA_PLANE_INTF = "dataPlaneIntf"; | 120 | private static final String DATA_PLANE_INTF = "dataPlaneIntf"; |
| 122 | private static final String S_TAG = "stag"; | 121 | private static final String S_TAG = "stag"; |
| 122 | + private static final String OVS_HW_VERSION = "Open vSwitch"; | ||
| 123 | 123 | ||
| 124 | private final ApplicationId appId; | 124 | private final ApplicationId appId; |
| 125 | private final FlowRuleService flowRuleService; | 125 | private final FlowRuleService flowRuleService; |
| 126 | private final DeviceService deviceService; | 126 | private final DeviceService deviceService; |
| 127 | private final DriverService driverService; | 127 | private final DriverService driverService; |
| 128 | private final GroupService groupService; | 128 | private final GroupService groupService; |
| 129 | - private final MastershipService mastershipService; | ||
| 130 | private final String tunnelType; | 129 | private final String tunnelType; |
| 131 | 130 | ||
| 132 | /** | 131 | /** |
| ... | @@ -137,7 +136,6 @@ public class CordVtnRuleInstaller { | ... | @@ -137,7 +136,6 @@ public class CordVtnRuleInstaller { |
| 137 | * @param deviceService device service | 136 | * @param deviceService device service |
| 138 | * @param driverService driver service | 137 | * @param driverService driver service |
| 139 | * @param groupService group service | 138 | * @param groupService group service |
| 140 | - * @param mastershipService mastership service | ||
| 141 | * @param tunnelType tunnel type | 139 | * @param tunnelType tunnel type |
| 142 | */ | 140 | */ |
| 143 | public CordVtnRuleInstaller(ApplicationId appId, | 141 | public CordVtnRuleInstaller(ApplicationId appId, |
| ... | @@ -145,14 +143,12 @@ public class CordVtnRuleInstaller { | ... | @@ -145,14 +143,12 @@ public class CordVtnRuleInstaller { |
| 145 | DeviceService deviceService, | 143 | DeviceService deviceService, |
| 146 | DriverService driverService, | 144 | DriverService driverService, |
| 147 | GroupService groupService, | 145 | GroupService groupService, |
| 148 | - MastershipService mastershipService, | ||
| 149 | String tunnelType) { | 146 | String tunnelType) { |
| 150 | this.appId = appId; | 147 | this.appId = appId; |
| 151 | this.flowRuleService = flowRuleService; | 148 | this.flowRuleService = flowRuleService; |
| 152 | this.deviceService = deviceService; | 149 | this.deviceService = deviceService; |
| 153 | this.driverService = driverService; | 150 | this.driverService = driverService; |
| 154 | this.groupService = groupService; | 151 | this.groupService = groupService; |
| 155 | - this.mastershipService = mastershipService; | ||
| 156 | this.tunnelType = checkNotNull(tunnelType); | 152 | this.tunnelType = checkNotNull(tunnelType); |
| 157 | } | 153 | } |
| 158 | 154 | ||
| ... | @@ -187,10 +183,6 @@ public class CordVtnRuleInstaller { | ... | @@ -187,10 +183,6 @@ public class CordVtnRuleInstaller { |
| 187 | checkNotNull(vNet); | 183 | checkNotNull(vNet); |
| 188 | 184 | ||
| 189 | DeviceId deviceId = host.location().deviceId(); | 185 | DeviceId deviceId = host.location().deviceId(); |
| 190 | - if (!mastershipService.isLocalMaster(deviceId)) { | ||
| 191 | - return; | ||
| 192 | - } | ||
| 193 | - | ||
| 194 | PortNumber inPort = host.location().port(); | 186 | PortNumber inPort = host.location().port(); |
| 195 | MacAddress dstMac = host.mac(); | 187 | MacAddress dstMac = host.mac(); |
| 196 | IpAddress hostIp = host.ipAddresses().stream().findFirst().get(); | 188 | IpAddress hostIp = host.ipAddresses().stream().findFirst().get(); |
| ... | @@ -225,10 +217,6 @@ public class CordVtnRuleInstaller { | ... | @@ -225,10 +217,6 @@ public class CordVtnRuleInstaller { |
| 225 | PortNumber port = host.location().port(); | 217 | PortNumber port = host.location().port(); |
| 226 | IpAddress ip = host.ipAddresses().stream().findFirst().orElse(null); | 218 | IpAddress ip = host.ipAddresses().stream().findFirst().orElse(null); |
| 227 | 219 | ||
| 228 | - if (!mastershipService.isLocalMaster(deviceId)) { | ||
| 229 | - return; | ||
| 230 | - } | ||
| 231 | - | ||
| 232 | for (FlowRule flowRule : flowRuleService.getFlowRulesById(appId)) { | 220 | for (FlowRule flowRule : flowRuleService.getFlowRulesById(appId)) { |
| 233 | if (flowRule.deviceId().equals(deviceId)) { | 221 | if (flowRule.deviceId().equals(deviceId)) { |
| 234 | PortNumber inPort = getInPort(flowRule); | 222 | PortNumber inPort = getInPort(flowRule); |
| ... | @@ -284,6 +272,10 @@ public class CordVtnRuleInstaller { | ... | @@ -284,6 +272,10 @@ public class CordVtnRuleInstaller { |
| 284 | Map<DeviceId, Set<PortNumber>> inPorts = Maps.newHashMap(); | 272 | Map<DeviceId, Set<PortNumber>> inPorts = Maps.newHashMap(); |
| 285 | 273 | ||
| 286 | for (Device device : deviceService.getAvailableDevices(SWITCH)) { | 274 | for (Device device : deviceService.getAvailableDevices(SWITCH)) { |
| 275 | + if (!device.hwVersion().equals(OVS_HW_VERSION)) { | ||
| 276 | + continue; | ||
| 277 | + } | ||
| 278 | + | ||
| 287 | GroupId groupId = createServiceGroup(device.id(), pService); | 279 | GroupId groupId = createServiceGroup(device.id(), pService); |
| 288 | outGroups.put(device.id(), groupId); | 280 | outGroups.put(device.id(), groupId); |
| 289 | 281 | ||
| ... | @@ -320,12 +312,16 @@ public class CordVtnRuleInstaller { | ... | @@ -320,12 +312,16 @@ public class CordVtnRuleInstaller { |
| 320 | Map<DeviceId, GroupId> outGroups = Maps.newHashMap(); | 312 | Map<DeviceId, GroupId> outGroups = Maps.newHashMap(); |
| 321 | GroupKey groupKey = new DefaultGroupKey(pService.id().id().getBytes()); | 313 | GroupKey groupKey = new DefaultGroupKey(pService.id().id().getBytes()); |
| 322 | 314 | ||
| 323 | - deviceService.getAvailableDevices(SWITCH).forEach(device -> { | 315 | + for (Device device : deviceService.getAvailableDevices(SWITCH)) { |
| 316 | + if (!device.hwVersion().equals(OVS_HW_VERSION)) { | ||
| 317 | + continue; | ||
| 318 | + } | ||
| 319 | + | ||
| 324 | Group group = groupService.getGroup(device.id(), groupKey); | 320 | Group group = groupService.getGroup(device.id(), groupKey); |
| 325 | if (group != null) { | 321 | if (group != null) { |
| 326 | outGroups.put(device.id(), group.id()); | 322 | outGroups.put(device.id(), group.id()); |
| 327 | } | 323 | } |
| 328 | - }); | 324 | + } |
| 329 | 325 | ||
| 330 | for (FlowRule flowRule : flowRuleService.getFlowRulesById(appId)) { | 326 | for (FlowRule flowRule : flowRuleService.getFlowRulesById(appId)) { |
| 331 | IpPrefix dstIp = getDstIpFromSelector(flowRule); | 327 | IpPrefix dstIp = getDstIpFromSelector(flowRule); |
| ... | @@ -368,11 +364,11 @@ public class CordVtnRuleInstaller { | ... | @@ -368,11 +364,11 @@ public class CordVtnRuleInstaller { |
| 368 | GroupKey groupKey = getGroupKey(service.id()); | 364 | GroupKey groupKey = getGroupKey(service.id()); |
| 369 | 365 | ||
| 370 | for (Device device : deviceService.getAvailableDevices(SWITCH)) { | 366 | for (Device device : deviceService.getAvailableDevices(SWITCH)) { |
| 371 | - DeviceId deviceId = device.id(); | 367 | + if (!device.hwVersion().equals(OVS_HW_VERSION)) { |
| 372 | - if (!mastershipService.isLocalMaster(deviceId)) { | ||
| 373 | continue; | 368 | continue; |
| 374 | } | 369 | } |
| 375 | 370 | ||
| 371 | + DeviceId deviceId = device.id(); | ||
| 376 | Group group = groupService.getGroup(deviceId, groupKey); | 372 | Group group = groupService.getGroup(deviceId, groupKey); |
| 377 | if (group == null) { | 373 | if (group == null) { |
| 378 | log.trace("No group exists for service {} in {}, do nothing.", service.id(), deviceId); | 374 | log.trace("No group exists for service {} in {}, do nothing.", service.id(), deviceId); |
| ... | @@ -421,10 +417,6 @@ public class CordVtnRuleInstaller { | ... | @@ -421,10 +417,6 @@ public class CordVtnRuleInstaller { |
| 421 | DeviceId deviceId = host.location().deviceId(); | 417 | DeviceId deviceId = host.location().deviceId(); |
| 422 | IpAddress hostIp = host.ipAddresses().stream().findFirst().get(); | 418 | IpAddress hostIp = host.ipAddresses().stream().findFirst().get(); |
| 423 | 419 | ||
| 424 | - if (!mastershipService.isLocalMaster(deviceId)) { | ||
| 425 | - return; | ||
| 426 | - } | ||
| 427 | - | ||
| 428 | TrafficSelector selector = DefaultTrafficSelector.builder() | 420 | TrafficSelector selector = DefaultTrafficSelector.builder() |
| 429 | .matchEthType(Ethernet.TYPE_ARP) | 421 | .matchEthType(Ethernet.TYPE_ARP) |
| 430 | .matchArpTpa(mService.serviceIp().getIp4Address()) | 422 | .matchArpTpa(mService.serviceIp().getIp4Address()) |
| ... | @@ -520,10 +512,6 @@ public class CordVtnRuleInstaller { | ... | @@ -520,10 +512,6 @@ public class CordVtnRuleInstaller { |
| 520 | */ | 512 | */ |
| 521 | public void removeManagementNetworkRules(Host host, CordService mService) { | 513 | public void removeManagementNetworkRules(Host host, CordService mService) { |
| 522 | checkNotNull(mService); | 514 | checkNotNull(mService); |
| 523 | - | ||
| 524 | - if (!mastershipService.isLocalMaster(host.location().deviceId())) { | ||
| 525 | - return; | ||
| 526 | - } | ||
| 527 | // TODO remove management network specific rules | 515 | // TODO remove management network specific rules |
| 528 | } | 516 | } |
| 529 | 517 | ||
| ... | @@ -980,6 +968,10 @@ public class CordVtnRuleInstaller { | ... | @@ -980,6 +968,10 @@ public class CordVtnRuleInstaller { |
| 980 | .build(); | 968 | .build(); |
| 981 | 969 | ||
| 982 | for (Device device : deviceService.getAvailableDevices(SWITCH)) { | 970 | for (Device device : deviceService.getAvailableDevices(SWITCH)) { |
| 971 | + if (!device.hwVersion().equals(OVS_HW_VERSION)) { | ||
| 972 | + continue; | ||
| 973 | + } | ||
| 974 | + | ||
| 983 | FlowRule flowRuleDirect = DefaultFlowRule.builder() | 975 | FlowRule flowRuleDirect = DefaultFlowRule.builder() |
| 984 | .fromApp(appId) | 976 | .fromApp(appId) |
| 985 | .withSelector(selector) | 977 | .withSelector(selector) |
| ... | @@ -1011,6 +1003,10 @@ public class CordVtnRuleInstaller { | ... | @@ -1011,6 +1003,10 @@ public class CordVtnRuleInstaller { |
| 1011 | .build(); | 1003 | .build(); |
| 1012 | 1004 | ||
| 1013 | for (Device device : deviceService.getAvailableDevices(SWITCH)) { | 1005 | for (Device device : deviceService.getAvailableDevices(SWITCH)) { |
| 1006 | + if (!device.hwVersion().equals(OVS_HW_VERSION)) { | ||
| 1007 | + continue; | ||
| 1008 | + } | ||
| 1009 | + | ||
| 1014 | FlowRule flowRuleDirect = DefaultFlowRule.builder() | 1010 | FlowRule flowRuleDirect = DefaultFlowRule.builder() |
| 1015 | .fromApp(appId) | 1011 | .fromApp(appId) |
| 1016 | .withSelector(selector) | 1012 | .withSelector(selector) |
| ... | @@ -1138,6 +1134,10 @@ public class CordVtnRuleInstaller { | ... | @@ -1138,6 +1134,10 @@ public class CordVtnRuleInstaller { |
| 1138 | processFlowRule(true, flowRule); | 1134 | processFlowRule(true, flowRule); |
| 1139 | 1135 | ||
| 1140 | for (Device device : deviceService.getAvailableDevices(SWITCH)) { | 1136 | for (Device device : deviceService.getAvailableDevices(SWITCH)) { |
| 1137 | + if (!device.hwVersion().equals(OVS_HW_VERSION)) { | ||
| 1138 | + continue; | ||
| 1139 | + } | ||
| 1140 | + | ||
| 1141 | if (device.id().equals(deviceId)) { | 1141 | if (device.id().equals(deviceId)) { |
| 1142 | continue; | 1142 | continue; |
| 1143 | } | 1143 | } | ... | ... |
| ... | @@ -578,11 +578,6 @@ public class DefaultOvsdbClient | ... | @@ -578,11 +578,6 @@ public class DefaultOvsdbClient |
| 578 | return false; | 578 | return false; |
| 579 | } | 579 | } |
| 580 | 580 | ||
| 581 | - String bridgeUuid = getBridgeUuid(bridgeName); | ||
| 582 | - if (bridgeUuid != null) { | ||
| 583 | - return false; | ||
| 584 | - } | ||
| 585 | - | ||
| 586 | Bridge bridge = (Bridge) TableGenerator.createTable(dbSchema, OvsdbTable.BRIDGE); | 581 | Bridge bridge = (Bridge) TableGenerator.createTable(dbSchema, OvsdbTable.BRIDGE); |
| 587 | Set<String> failMode = new HashSet<>(Arrays.asList("secure")); | 582 | Set<String> failMode = new HashSet<>(Arrays.asList("secure")); |
| 588 | bridge.setFailMode(failMode); | 583 | bridge.setFailMode(failMode); |
| ... | @@ -594,10 +589,15 @@ public class DefaultOvsdbClient | ... | @@ -594,10 +589,15 @@ public class DefaultOvsdbClient |
| 594 | options.put("datapath-id", dpid); | 589 | options.put("datapath-id", dpid); |
| 595 | bridge.setOtherConfig(options); | 590 | bridge.setOtherConfig(options); |
| 596 | 591 | ||
| 597 | - bridge.setName(bridgeName); | 592 | + String bridgeUuid = getBridgeUuid(bridgeName); |
| 598 | - bridgeUuid = insertConfig(OvsdbConstant.BRIDGE, "_uuid", | 593 | + if (bridgeUuid == null) { |
| 599 | - OvsdbConstant.DATABASENAME, "bridges", | 594 | + bridge.setName(bridgeName); |
| 600 | - ovsUuid, bridge.getRow()); | 595 | + bridgeUuid = insertConfig(OvsdbConstant.BRIDGE, "_uuid", |
| 596 | + OvsdbConstant.DATABASENAME, "bridges", | ||
| 597 | + ovsUuid, bridge.getRow()); | ||
| 598 | + } else { | ||
| 599 | + updateConfig(OvsdbConstant.BRIDGE, "_uuid", bridgeUuid, bridge.getRow()); | ||
| 600 | + } | ||
| 601 | 601 | ||
| 602 | if (bridgeUuid != null) { | 602 | if (bridgeUuid != null) { |
| 603 | createPort(bridgeName, bridgeName); | 603 | createPort(bridgeName, bridgeName); | ... | ... |
-
Please register or login to post a comment