From b449351a9f464cfeec90660ccc4ab8f7e547a27c Mon Sep 17 00:00:00 2001 From: Murali Reddy Date: Fri, 28 Oct 2016 17:50:36 +0530 Subject: [PATCH] CLOUDSTACK-9491: incorrect parsing of device list to find ethernet index of plugged NIC In 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. However 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. --- .../hypervisor/vmware/resource/VmwareResource.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java index 238ba3ed864a..abd5f3b00263 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java +++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java @@ -831,18 +831,19 @@ private int findRouterEthDeviceIndex(String domrName, String routerIp, String ma 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 result = SshHelper.sshExecute(routerIp, DefaultDomRSshPort, "root", mgr.getSystemVMKeyFile(), null, "ls /proc/sys/net/ipv4/conf"); + ArrayList skipInterfaces = new ArrayList(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 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()) @@ -853,8 +854,11 @@ private int findRouterEthDeviceIndex(String domrName, String routerIp, String ma 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); + } } } }