mirror of
https://github.com/apache/cloudstack.git
synced 2025-11-03 04:12:31 +01:00
Merge pull request #1681 from murali-reddy/router_eth_device_index
CLOUDSTACK-9491: incorrect parsing of device list to find ethernet index of plugged NICIn VmwareResource, findRouterEthDeviceIndex() method find ethernet interface index given the mac address. This method is used, once a nic is plugged to determine ethernet interface. "/proc/sys/net/ipv4/conf" from the VR and looped through the devices to find the right ethernet interface. Howver current logic read it once, and loops through the device list. Its observerd device may not show up '/proc/sys/net/ipv4/conf' immediatly once NIC is plugged in the VM from vCenter. Fix ensured, while waiting for 15 sec in the loop, read the latest content from /proc/sys/net/ipv4/conf , so that right device list is processed. Manual tested VPC scenarios of adding new tiers which uses findRouterEthDeviceIndex, to find the guest/public network ethernet index. * pr/1681: CLOUDSTACK-9491: incorrect parsing of device list to find ethernet index of plugged NIC Signed-off-by: Rohit Yadav <rohit.yadav@shapeblue.com>
This commit is contained in:
commit
1f2184800b
@ -833,18 +833,19 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
|
||||
VmwareManager mgr = getServiceContext().getStockObject(VmwareManager.CONTEXT_STOCK_NAME);
|
||||
|
||||
s_logger.info("findRouterEthDeviceIndex. mac: " + mac);
|
||||
|
||||
// TODO : this is a temporary very inefficient solution, will refactor it later
|
||||
Pair<Boolean, String> result = SshHelper.sshExecute(routerIp, DefaultDomRSshPort, "root", mgr.getSystemVMKeyFile(), null, "ls /proc/sys/net/ipv4/conf");
|
||||
ArrayList<String> skipInterfaces = new ArrayList<String>(Arrays.asList("all", "default", "lo"));
|
||||
|
||||
// when we dynamically plug in a new NIC into virtual router, it may take time to show up in guest OS
|
||||
// we use a waiting loop here as a workaround to synchronize activities in systems
|
||||
long startTick = System.currentTimeMillis();
|
||||
while (System.currentTimeMillis() - startTick < 15000) {
|
||||
|
||||
// TODO : this is a temporary very inefficient solution, will refactor it later
|
||||
Pair<Boolean, String> result = SshHelper.sshExecute(routerIp, DefaultDomRSshPort, "root", mgr.getSystemVMKeyFile(), null, "ls /proc/sys/net/ipv4/conf");
|
||||
if (result.first()) {
|
||||
String[] tokens = result.second().split("\\s+");
|
||||
for (String token : tokens) {
|
||||
if (!("all".equalsIgnoreCase(token) || "default".equalsIgnoreCase(token) || "lo".equalsIgnoreCase(token))) {
|
||||
if (!(skipInterfaces.contains(token))) {
|
||||
String cmd = String.format("ip address show %s | grep link/ether | sed -e 's/^[ \t]*//' | cut -d' ' -f2", token);
|
||||
|
||||
if (s_logger.isDebugEnabled())
|
||||
@ -855,8 +856,11 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
|
||||
if (s_logger.isDebugEnabled())
|
||||
s_logger.debug("result: " + result2.first() + ", output: " + result2.second());
|
||||
|
||||
if (result2.first() && result2.second().trim().equalsIgnoreCase(mac.trim()))
|
||||
if (result2.first() && result2.second().trim().equalsIgnoreCase(mac.trim())) {
|
||||
return Integer.parseInt(token.substring(3));
|
||||
} else {
|
||||
skipInterfaces.add(token);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user