refactored _parse_arp_table split _parse_arp_table into 1 general and 2 specialized functions
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/fa63096a Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/fa63096a Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/fa63096a Branch: refs/heads/trunk Commit: fa63096af079ff39873d7b62c3da8b93aab9d617 Parents: 20c924b Author: Rene Kjellerup <rk.katana.st...@gmail.com> Authored: Fri Jun 3 17:02:19 2016 -0700 Committer: Anthony Shaw <anthonys...@apache.org> Committed: Fri Jun 24 14:27:46 2016 +1000 ---------------------------------------------------------------------- libcloud/compute/drivers/libvirt_driver.py | 39 ++++++++++++++++++------- 1 file changed, 28 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/libcloud/blob/fa63096a/libcloud/compute/drivers/libvirt_driver.py ---------------------------------------------------------------------- diff --git a/libcloud/compute/drivers/libvirt_driver.py b/libcloud/compute/drivers/libvirt_driver.py index c8a6a7c..9d4e1a0 100644 --- a/libcloud/compute/drivers/libvirt_driver.py +++ b/libcloud/compute/drivers/libvirt_driver.py @@ -306,15 +306,14 @@ class LibvirtNodeDriver(NodeDriver): child = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, _ = child.communicate() - arp_table = self._parse_arp_table(arp_output=stdout) + arp_table = self._parse_ip_table_arp(arp_output=stdout) except OSError as e: if e.errno == 2: cmd = ['ip', 'neigh'] child = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, _ = child.communicate() - arp_table = self._parse_arp_table(arp_output=stdout, - arp_cmd='ip') + arp_table = self._parse_ip_table_neigh(arp_output=stdout) for mac_address in mac_addresses: if mac_address in arp_table: @@ -361,23 +360,41 @@ class LibvirtNodeDriver(NodeDriver): return result - def _parse_arp_table(self, arp_output, arp_cmd='arp'): + def _parse_ip_table_arp(self, arp_output): """ - Parse arp command output and return a dictionary which maps mac address + Sets up the regexp for parsing out IP addresses from the 'arp -an' + command and pass it along to the parser function. + + :return: Dictionary from the parsing funtion + :rtype: ``dict`` + """ + arp_regex = re.compile('.*?\((.*?)\) at (.*?)\s+') + return self._parse_mac_addr_table(arp_output, arp_regex) + + def _parse_ip_table_neigh(self, ip_output): + """ + Sets up the regexp for parsing out IP addresses from the 'ip neighbor' + command and pass it along to the parser function. + + :return: Dictionary from the parsing funtion + :rtype: ``dict`` + """ + ip_regex = re.compile('(.*?)\s+.*lladdr\s+(.*?)\s+') + return self._parse_mac_addr_table(ip_output, ip_regex) + + def _parse_mac_addr_table(self, cmd_output, mac_regex): + """ + Parse the command output and return a dictionary which maps mac address to an IP address. :return: Dictionary which maps mac address to IP address. :rtype: ``dict`` """ - re_match = {} - re_match['arp'] = '.*?\((.*?)\) at (.*?)\s+' - re_match['ip'] = '(.*?)\s+.*lladdr\s+(.*?)\s+' - ip_mac = re.compile(re_match[arp_cmd]) - lines = arp_output.split('\n') + lines = cmd_output.split('\n') arp_table = defaultdict(list) for line in lines: - match = ip_mac.match(line) + match = mac_regex.match(line) if not match: continue