Skip to content

Commit e64e94a

Browse files
abh1sarweizhouapacheDaanHoogland
authored
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 <daan.hoogland@gmail.com> * 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 <weizhou@apache.org> Co-authored-by: dahn <daan.hoogland@gmail.com>
1 parent 5d32492 commit e64e94a

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
@@ -1797,6 +1797,20 @@ private String matchPifFileInDirectory(final String bridgeName) {
17971797
return "";
17981798
}
17991799

1800+
public Integer getVlanIdForBridge(final String bridge) {
1801+
String pif = matchPifFileInDirectory(bridge);
1802+
final File vlanfile = new File("/proc/net/vlan/" + pif);
1803+
if (vlanfile.isFile()) {
1804+
String vlan = Script.runSimpleBashScript("awk '/VID:/ {print $3}' /proc/net/vlan/" + pif);
1805+
try {
1806+
return Integer.parseInt(vlan);
1807+
} catch (final NumberFormatException e) {
1808+
return null;
1809+
}
1810+
}
1811+
return null;
1812+
}
1813+
18001814
static String [] ifNamePatterns = {
18011815
"^eth",
18021816
"^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
@@ -132,7 +132,7 @@ private UnmanagedInstanceTO getUnmanagedInstance(LibvirtComputingResource libvir
132132
}
133133
instance.setPowerState(getPowerState(libvirtComputingResource.getVmState(conn,domain.getName())));
134134
instance.setMemory((int) LibvirtComputingResource.getDomainMemory(domain) / 1024);
135-
instance.setNics(getUnmanagedInstanceNics(parser.getInterfaces()));
135+
instance.setNics(getUnmanagedInstanceNics(libvirtComputingResource, parser.getInterfaces()));
136136
instance.setDisks(getUnmanagedInstanceDisks(parser.getDisks(),libvirtComputingResource, conn, domain.getName()));
137137
instance.setVncPassword(getFormattedVncPassword(parser.getVncPasswd()));
138138
if (parser.getBootType() != null) {
@@ -169,7 +169,7 @@ private UnmanagedInstanceTO.PowerState getPowerState(VirtualMachine.PowerState v
169169
}
170170
}
171171

172-
private List<UnmanagedInstanceTO.Nic> getUnmanagedInstanceNics(List<LibvirtVMDef.InterfaceDef> interfaces) {
172+
private List<UnmanagedInstanceTO.Nic> getUnmanagedInstanceNics(LibvirtComputingResource libvirtComputingResource, List<LibvirtVMDef.InterfaceDef> interfaces) {
173173
final ArrayList<UnmanagedInstanceTO.Nic> nics = new ArrayList<>(interfaces.size());
174174
int counter = 0;
175175
for (LibvirtVMDef.InterfaceDef interfaceDef : interfaces) {
@@ -180,6 +180,10 @@ private List<UnmanagedInstanceTO.Nic> getUnmanagedInstanceNics(List<LibvirtVMDef
180180
nic.setNetwork(interfaceDef.getDevName());
181181
nic.setPciSlot(interfaceDef.getSlot().toString());
182182
nic.setVlan(interfaceDef.getVlanTag());
183+
if (nic.getVlan() == -1
184+
&& LibvirtVMDef.InterfaceDef.GuestNetType.BRIDGE.equals(interfaceDef.getNetType())) {
185+
nic.setVlan(libvirtComputingResource.getVlanIdForBridge(interfaceDef.getBrName()));
186+
}
183187
nics.add(nic);
184188
}
185189
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)