Skip to content

Commit 490f2ff

Browse files
abh1sarweizhouapacheDaanHoogland
authored andcommitted
Import KVM VM: Autodetect vlan id from bridge name (apache#11507)
* Get vlan from bridge name while importing kvm instances * Fix LibvirtReplugNicCommandWrapperTest * Cleanup MultiNetworkSelection.vue * getting the vlanid from the /proc/net/vlan/<pif> file instead of the bridge name * Update plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetUnmanagedInstancesCommandWrapper.java Co-authored-by: dahn <[email protected]> * Don't call sendValuesTimed from getDefaultNetwork as it's causing an infinte loop * set default network values in setDefaultValues instead of getDefaultNetwork --------- Co-authored-by: Wei Zhou <[email protected]> Co-authored-by: dahn <[email protected]>
1 parent ecf7e79 commit 490f2ff

File tree

3 files changed

+34
-4
lines changed

3 files changed

+34
-4
lines changed

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2060,6 +2060,20 @@ private String matchPifFileInDirectory(final String bridgeName) {
20602060
return "";
20612061
}
20622062

2063+
public Integer getVlanIdForBridge(final String bridge) {
2064+
String pif = matchPifFileInDirectory(bridge);
2065+
final File vlanfile = new File("/proc/net/vlan/" + pif);
2066+
if (vlanfile.isFile()) {
2067+
String vlan = Script.runSimpleBashScript("awk '/VID:/ {print $3}' /proc/net/vlan/" + pif);
2068+
try {
2069+
return Integer.parseInt(vlan);
2070+
} catch (final NumberFormatException e) {
2071+
return null;
2072+
}
2073+
}
2074+
return null;
2075+
}
2076+
20632077
static String [] ifNamePatterns = {
20642078
"^eth",
20652079
"^bond",

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetUnmanagedInstancesCommandWrapper.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ private UnmanagedInstanceTO getUnmanagedInstance(LibvirtComputingResource libvir
136136
}
137137
instance.setPowerState(getPowerState(libvirtComputingResource.getVmState(conn,domain.getName())));
138138
instance.setMemory((int) LibvirtComputingResource.getDomainMemory(domain) / 1024);
139-
instance.setNics(getUnmanagedInstanceNics(parser.getInterfaces()));
139+
instance.setNics(getUnmanagedInstanceNics(libvirtComputingResource, parser.getInterfaces()));
140140
instance.setDisks(getUnmanagedInstanceDisks(parser.getDisks(),libvirtComputingResource, conn, domain.getName()));
141141
instance.setVncPassword(getFormattedVncPassword(parser.getVncPasswd()));
142142
if (parser.getBootType() != null) {
@@ -173,7 +173,7 @@ private UnmanagedInstanceTO.PowerState getPowerState(VirtualMachine.PowerState v
173173
}
174174
}
175175

176-
private List<UnmanagedInstanceTO.Nic> getUnmanagedInstanceNics(List<LibvirtVMDef.InterfaceDef> interfaces) {
176+
private List<UnmanagedInstanceTO.Nic> getUnmanagedInstanceNics(LibvirtComputingResource libvirtComputingResource, List<LibvirtVMDef.InterfaceDef> interfaces) {
177177
final ArrayList<UnmanagedInstanceTO.Nic> nics = new ArrayList<>(interfaces.size());
178178
int counter = 0;
179179
for (LibvirtVMDef.InterfaceDef interfaceDef : interfaces) {
@@ -184,6 +184,10 @@ private List<UnmanagedInstanceTO.Nic> getUnmanagedInstanceNics(List<LibvirtVMDef
184184
nic.setNetwork(interfaceDef.getDevName());
185185
nic.setPciSlot(interfaceDef.getSlot().toString());
186186
nic.setVlan(interfaceDef.getVlanTag());
187+
if (nic.getVlan() == -1
188+
&& LibvirtVMDef.InterfaceDef.GuestNetType.BRIDGE.equals(interfaceDef.getNetType())) {
189+
nic.setVlan(libvirtComputingResource.getVlanIdForBridge(interfaceDef.getBrName()));
190+
}
187191
nics.add(nic);
188192
}
189193
return nics;

ui/src/views/compute/wizard/MultiNetworkSelection.vue

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
<a-select
4848
style="width: 100%"
4949
v-if="validNetworks[record.id] && validNetworks[record.id].length > 0"
50-
:defaultValue="validNetworks[record.id][0].id"
50+
:defaultValue="getDefaultNetwork(record)"
5151
@change="val => handleNetworkChange(record, val)"
5252
showSearch
5353
optionFilterProp="label"
@@ -265,7 +265,16 @@ export default {
265265
this.values = {}
266266
this.ipAddresses = {}
267267
for (const item of this.items) {
268-
var network = this.validNetworks[item.id]?.[0] || null
268+
let network = null
269+
if (item.vlanid && item.vlanid !== -1) {
270+
const matched = this.validNetworks[item.id].filter(x => Number(x.vlan) === item.vlanid)
271+
if (matched.length > 0) {
272+
network = matched[0]
273+
}
274+
}
275+
if (!network) {
276+
network = this.validNetworks[item.id]?.[0] || null
277+
}
269278
this.values[item.id] = network ? network.id : ''
270279
this.ipAddresses[item.id] = (!network || network.type === 'L2') ? null : 'auto'
271280
this.setIpAddressEnabled(item, network)
@@ -280,6 +289,9 @@ export default {
280289
}
281290
this.sendValuesTimed()
282291
},
292+
getDefaultNetwork (record) {
293+
return this.values[record.id] || this.validNetworks[record.id]?.[0]?.id
294+
},
283295
sendValuesTimed () {
284296
clearTimeout(this.sendValuesTimer)
285297
this.sendValuesTimer = setTimeout(() => {

0 commit comments

Comments
 (0)