This is an automated email from the ASF dual-hosted git repository.

Pearl1594 pushed a commit to branch support-multi-vlan-guestnet
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/support-multi-vlan-guestnet by 
this push:
     new 0dcc9be4499 Remove stray default VLAN 1 membership when plugging VLAN 
nics on libvirt<11 vlan_filtering hosts
0dcc9be4499 is described below

commit 0dcc9be44992e616d93cab4757df4c460422a850
Author: Pearl1594 <[email protected]>
AuthorDate: Mon Oct 19 10:23:02 2026 -0400

    Remove stray default VLAN 1 membership when plugging VLAN nics on 
libvirt<11 vlan_filtering hosts
---
 .../hypervisor/kvm/resource/BridgeVifDriver.java      |  4 +---
 .../hypervisor/kvm/resource/BridgeVifDriverTest.java  | 19 +++++++++++++++++++
 2 files changed, 20 insertions(+), 3 deletions(-)

diff --git 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/BridgeVifDriver.java
 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/BridgeVifDriver.java
index 7f235bf6a52..7fb4d622294 100644
--- 
a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/BridgeVifDriver.java
+++ 
b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/BridgeVifDriver.java
@@ -307,9 +307,7 @@ public class BridgeVifDriver extends VifDriverBase {
             throw new InternalErrorException("Cannot apply manual VLAN trunk 
membership: tap device name unknown for nic " + nic.getMac());
         }
         Integer primaryVlanTag = parseVlanTag(nic.getBroadcastUri(), "primary 
network of nic " + nic.getMac());
-        for (Integer vlanTag : collectTrunkVlanTags(nic)) {
-            runBridgeVlanCommand("add", tapName, String.valueOf(vlanTag), 
vlanTag.equals(primaryVlanTag));
-        }
+        applyVlanTrunkMembershipDiff(tapName, collectTrunkVlanTags(nic), 
primaryVlanTag);
     }
 
     protected void runBridgeVlanCommand(String operation, String dev, String 
vid, boolean pvidUntagged) throws InternalErrorException {
diff --git 
a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/BridgeVifDriverTest.java
 
b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/BridgeVifDriverTest.java
index e5e092d3aa0..b7a682f8a81 100644
--- 
a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/BridgeVifDriverTest.java
+++ 
b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/BridgeVifDriverTest.java
@@ -211,6 +211,7 @@ public class BridgeVifDriverTest {
         nic.setTrunkVlan(false);
         LibvirtVMDef.InterfaceDef intf = new LibvirtVMDef.InterfaceDef();
         intf.setDevName("vnet5");
+        
Mockito.doReturn(Collections.emptyMap()).when(driver).readCurrentVlanMembership("vnet5");
 
         driver.ensureVlanTrunkMembership(intf, nic);
 
@@ -236,6 +237,7 @@ public class BridgeVifDriverTest {
         NicTO nic = buildTrunkNic(100, Collections.singletonList(200));
         LibvirtVMDef.InterfaceDef intf = new LibvirtVMDef.InterfaceDef();
         intf.setDevName("vnet5");
+        
Mockito.doReturn(Collections.emptyMap()).when(driver).readCurrentVlanMembership("vnet5");
 
         driver.ensureVlanTrunkMembership(intf, nic);
 
@@ -243,6 +245,23 @@ public class BridgeVifDriverTest {
         Mockito.verify(driver).runBridgeVlanCommand("add", "vnet5", "200", 
false);
     }
 
+    @Test
+    public void ensureVlanTrunkMembershipRemovesDefaultVlanOneOnOldLibvirt() 
throws InternalErrorException {
+        
Mockito.when(libvirtComputingResource.hostSupportsVlanTrunkXml()).thenReturn(false);
+        NicTO nic = buildTrunkNic(100, Collections.singletonList(200));
+        LibvirtVMDef.InterfaceDef intf = new LibvirtVMDef.InterfaceDef();
+        intf.setDevName("vnet5");
+        Map<Integer, Boolean> currentMembership = new HashMap<>();
+        currentMembership.put(1, true);
+        
Mockito.doReturn(currentMembership).when(driver).readCurrentVlanMembership("vnet5");
+
+        driver.ensureVlanTrunkMembership(intf, nic);
+
+        Mockito.verify(driver).runBridgeVlanCommand("del", "vnet5", "1", 
false);
+        Mockito.verify(driver).runBridgeVlanCommand("add", "vnet5", "100", 
true);
+        Mockito.verify(driver).runBridgeVlanCommand("add", "vnet5", "200", 
false);
+    }
+
     @Test(expected = InternalErrorException.class)
     public void ensureVlanTrunkMembershipFailsWhenTapNameUnknown() throws 
InternalErrorException {
         
Mockito.when(libvirtComputingResource.hostSupportsVlanTrunkXml()).thenReturn(false);

Reply via email to