Skip to content

Commit b69dff7

Browse files
committed
Merge pull request #973 from DaanHoogland/interfacePatternCheck
CLOUDSTACK-8838 Interface pattern checkthsi closes #812 and #966 as well * pr/973: unit test for interface patterns in libvirt compute resource Added support for KVM teamd devices to LibvirtComputingResource.java. This will allow users to utilze teamd nic teaming devices named team*. CLOUDSTACK-8838: Allow ensX enoX enpX enxX format for nics in CentOS 7 Signed-off-by: Remi Bergsma <github@remi.nl>
2 parents 8a09f88 + 5a134a6 commit b69dff7

2 files changed

Lines changed: 44 additions & 4 deletions

File tree

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

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1160,16 +1160,43 @@ private String matchPifFileInDirectory(final String bridgeName) {
11601160
for (int i = 0; i < interfaces.length; i++) {
11611161
final String fname = interfaces[i].getName();
11621162
s_logger.debug("matchPifFileInDirectory: file name '" + fname + "'");
1163-
if (fname.startsWith("eth") || fname.startsWith("bond") || fname.startsWith("vlan") || fname.startsWith("vx") || fname.startsWith("em") ||
1164-
fname.matches("^p\\d+p\\d+.*")) {
1163+
if (isInterface(fname)) {
11651164
return fname;
11661165
}
11671166
}
11681167

1169-
s_logger.debug("failing to get physical interface from bridge " + bridgeName + ", did not find an eth*, bond*, vlan*, em*, or p*p* in " + brif.getAbsolutePath());
1168+
s_logger.debug("failing to get physical interface from bridge " + bridgeName + ", did not find an eth*, bond*, team*, vlan*, em*, p*p*, ens*, eno*, enp*, or enx* in " + brif.getAbsolutePath());
11701169
return "";
11711170
}
11721171

1172+
String [] _ifNamePrefixes = {
1173+
"eth",
1174+
"bond",
1175+
"vlan",
1176+
"vx",
1177+
"em",
1178+
"ens",
1179+
"eno",
1180+
"enp",
1181+
"team",
1182+
"enx",
1183+
"^p\\d+p\\d+"
1184+
};
1185+
/**
1186+
* @param fname
1187+
* @return
1188+
*/
1189+
boolean isInterface(final String fname) {
1190+
StringBuffer commonPattern = new StringBuffer();
1191+
for (String ifNamePrefix : _ifNamePrefixes) {
1192+
commonPattern.append("|(").append(ifNamePrefix).append(".*)");
1193+
}
1194+
if(fname.matches(commonPattern.toString())) {
1195+
return true;
1196+
}
1197+
return false;
1198+
}
1199+
11731200
public boolean checkNetwork(final String networkName) {
11741201
if (networkName == null) {
11751202
return true;
@@ -1450,7 +1477,7 @@ private String getBroadcastUriFromBridge(final String brName) {
14501477
if (!matcher.group(4).isEmpty()) {
14511478
return BroadcastDomainType.Vlan.toUri(matcher.group(4)).toString();
14521479
} else {
1453-
//untagged or not matching (eth|bond)#.#
1480+
//untagged or not matching (eth|bond|team)#.#
14541481
s_logger.debug("failed to get vNet id from bridge " + brName
14551482
+ "attached to physical interface" + pif + ", perhaps untagged interface");
14561483
return "";

plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4999,4 +4999,17 @@ public void testUpdateHostPasswordCommandFail() {
49994999

50005000
assertFalse(answer.getResult());
50015001
}
5002+
5003+
@Test
5004+
public void testIsInterface () {
5005+
LibvirtComputingResource lvcr = new LibvirtComputingResource();
5006+
assertFalse(lvcr.isInterface("bla"));
5007+
assertTrue(lvcr.isInterface("p99p00"));
5008+
for (String ifNamePrefix : lvcr._ifNamePrefixes) {
5009+
// excluding regexps as "\\\\d+" won't replace with String.replaceAll(String,String);
5010+
if (!ifNamePrefix.contains("\\")) {
5011+
assertTrue(lvcr.isInterface(ifNamePrefix + "0"));
5012+
}
5013+
}
5014+
}
50025015
}

0 commit comments

Comments
 (0)