Bug 4752 - Distributed arp only needed on compute nodes that have tenant net
authorFlavio Fernandes <ffernand@redhat.com>
Thu, 10 Dec 2015 15:57:38 +0000 (10:57 -0500)
committerFlavio Fernandes <ffernand@redhat.com>
Thu, 10 Dec 2015 21:54:59 +0000 (16:54 -0500)
Missing logic to avoid adding unnecessary rules for distributed arp in
compute nodes that did not have any tenant vms for a particular
segmentation id

Patch set 2: Fix UT

Change-Id: Ib9183be4bdc6a23e0b748acfff13992e6a36c684
Signed-off-by: Flavio Fernandes <ffernand@redhat.com>
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/NeutronL3Adapter.java
openstack/net-virt/src/test/java/org/opendaylight/ovsdb/openstack/netvirt/impl/NeutronL3AdapterTest.java

index 62a7987ae8ab3e66c20031c636e3e4b6439df2e9..dfcfdaa8cc5d464b58781ddff5741b89b82ac1eb 100644 (file)
@@ -817,7 +817,10 @@ public class NeutronL3Adapter implements ConfigInterface {
 
                 // Configure distributed ARP responder
                 if (flgDistributedARPEnabled) {
-                    programStaticArpStage1(dpid, providerSegmentationId, tenantMac, tenantIpStr, action);
+                    // Arp rule is only needed when segmentation exists in the given node (bug 4752).
+                    boolean arpNeeded = tenantNetworkManager.isTenantNetworkPresentInNode(node, providerSegmentationId);
+                    final Action actionForNode = arpNeeded ? action : Action.DELETE;
+                    programStaticArpStage1(dpid, providerSegmentationId, tenantMac, tenantIpStr, actionForNode);
                 }
             }
         }
index c0d6a019f396f60d42fe443132dbb5bc70b32eac..fc9a266f80cb7917c6c721b0c37d10f32cb3bdfc 100644 (file)
@@ -491,6 +491,9 @@ public class NeutronL3AdapterTest {
         when(neutronNetwork.getProviderSegmentationID()).thenReturn(ID);
         List<Node> nodes = new ArrayList<>();
         nodes.add(mock(Node.class));
+        TenantNetworkManager tenantNetworkManager = mock(TenantNetworkManager.class);
+        MemberModifier.field(NeutronL3Adapter.class, "tenantNetworkManager").set(neutronL3Adapter , tenantNetworkManager);
+        when(tenantNetworkManager.isTenantNetworkPresentInNode(any(Node.class), eq(ID))).thenReturn(true);
         PowerMockito.doReturn(15L).when(neutronL3Adapter, "getDpidForIntegrationBridge", any(Node.class));
 
         // init instance variables