diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java index 19c6e7145a6..2d63a669661 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java @@ -1797,6 +1797,20 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv return ""; } + public Integer getVlanIdForBridge(final String bridge) { + String pif = matchPifFileInDirectory(bridge); + final File vlanfile = new File("/proc/net/vlan/" + pif); + if (vlanfile.isFile()) { + String vlan = Script.runSimpleBashScript("awk '/VID:/ {print $3}' /proc/net/vlan/" + pif); + try { + return Integer.parseInt(vlan); + } catch (final NumberFormatException e) { + return null; + } + } + return null; + } + static String [] ifNamePatterns = { "^eth", "^bond", diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetUnmanagedInstancesCommandWrapper.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetUnmanagedInstancesCommandWrapper.java index e807bf3c821..b382613f8ab 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetUnmanagedInstancesCommandWrapper.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetUnmanagedInstancesCommandWrapper.java @@ -132,7 +132,7 @@ public final class LibvirtGetUnmanagedInstancesCommandWrapper extends CommandWra } instance.setPowerState(getPowerState(libvirtComputingResource.getVmState(conn,domain.getName()))); instance.setMemory((int) LibvirtComputingResource.getDomainMemory(domain) / 1024); - instance.setNics(getUnmanagedInstanceNics(parser.getInterfaces())); + instance.setNics(getUnmanagedInstanceNics(libvirtComputingResource, parser.getInterfaces())); instance.setDisks(getUnmanagedInstanceDisks(parser.getDisks(),libvirtComputingResource, conn, domain.getName())); instance.setVncPassword(getFormattedVncPassword(parser.getVncPasswd())); if (parser.getBootType() != null) { @@ -169,7 +169,7 @@ public final class LibvirtGetUnmanagedInstancesCommandWrapper extends CommandWra } } - private List getUnmanagedInstanceNics(List interfaces) { + private List getUnmanagedInstanceNics(LibvirtComputingResource libvirtComputingResource, List interfaces) { final ArrayList nics = new ArrayList<>(interfaces.size()); int counter = 0; for (LibvirtVMDef.InterfaceDef interfaceDef : interfaces) { @@ -180,6 +180,10 @@ public final class LibvirtGetUnmanagedInstancesCommandWrapper extends CommandWra nic.setNetwork(interfaceDef.getDevName()); nic.setPciSlot(interfaceDef.getSlot().toString()); nic.setVlan(interfaceDef.getVlanTag()); + if (nic.getVlan() == -1 + && LibvirtVMDef.InterfaceDef.GuestNetType.BRIDGE.equals(interfaceDef.getNetType())) { + nic.setVlan(libvirtComputingResource.getVlanIdForBridge(interfaceDef.getBrName())); + } nics.add(nic); } return nics; diff --git a/ui/src/views/compute/wizard/MultiNetworkSelection.vue b/ui/src/views/compute/wizard/MultiNetworkSelection.vue index 92d4a437599..0e9983bc356 100644 --- a/ui/src/views/compute/wizard/MultiNetworkSelection.vue +++ b/ui/src/views/compute/wizard/MultiNetworkSelection.vue @@ -47,7 +47,7 @@ Number(x.vlan) === item.vlanid) + if (matched.length > 0) { + network = matched[0] + } + } + if (!network) { + network = this.validNetworks[item.id]?.[0] || null + } this.values[item.id] = network ? network.id : '' this.ipAddresses[item.id] = (!network || network.type === 'L2') ? null : 'auto' this.setIpAddressEnabled(item, network) @@ -280,6 +289,9 @@ export default { } this.sendValuesTimed() }, + getDefaultNetwork (record) { + return this.values[record.id] || this.validNetworks[record.id]?.[0]?.id + }, sendValuesTimed () { clearTimeout(this.sendValuesTimer) this.sendValuesTimer = setTimeout(() => {