diff options
author | evasquez <eric.vasquez@calxeda.com> | 2013-04-26 15:18:28 -0500 |
---|---|---|
committer | evasquez <eric.vasquez@calxeda.com> | 2013-04-29 09:05:03 -0500 |
commit | c0fecd201d237acbb5a4da5124f6e48cce6d6159 (patch) | |
tree | d73df13a1f4663ede50ac8945d85b38ab70e8635 | |
parent | dd3b705f1104403c18204ee356e72d4c21887fd8 (diff) | |
download | cxmanage-c0fecd201d237acbb5a4da5124f6e48cce6d6159.tar.gz |
Added a _run_fabric_command() function.
REFACTOR:
This function will basically handle the calling of a node
command that may require a tftp server for data xport. You simply need
to call this function and parse the tftp output to your needs.
-rw-r--r-- | cxmanage_api/node.py | 154 | ||||
-rw-r--r-- | cxmanage_test/node_test.py | 26 |
2 files changed, 62 insertions, 118 deletions
diff --git a/cxmanage_api/node.py b/cxmanage_api/node.py index 584521d..9198cbc 100644 --- a/cxmanage_api/node.py +++ b/cxmanage_api/node.py @@ -877,32 +877,12 @@ class Node(object): :raises TftpException: If the TFTP transfer fails. """ - filename = temp_file() - basename = os.path.basename(filename) - try: - result = self.bmc.fabric_config_get_ip_info(basename) - if hasattr(result, "error"): - raise IpmiError(result.error) - self.ecme_tftp.get_file(basename, filename) - except (IpmiError, TftpException): - # Fall back and use our tftp server - try: - result = self.bmc.fabric_config_get_ip_info(basename, self.tftp_address) - except IpmiError as e: - raise IpmiError(self._parse_ipmierror(e)) - if hasattr(result, "error"): - raise IpmiError(result.error) - - deadline = time.time() + 10 - while time.time() < deadline: - try: - time.sleep(1) - self.tftp.get_file(src=basename, dest=filename) - if (os.path.getsize(filename) > 0): - break - except (TftpException, IOError): - pass + filename = self._run_fabric_command( + function_name='fabric_config_get_ip_info', + ) + except IpmiError as e: + raise IpmiError(self._parse_ipmierror(e)) # Parse addresses from ipinfo file results = {} @@ -1122,33 +1102,13 @@ class Node(object): :raises TftpException: If the TFTP transfer fails. """ - filename = temp_file() - basename = os.path.basename(filename) - try: - result = self.bmc.fabric_config_get_mac_addresses(basename) - if hasattr(result, "error"): - raise IpmiError(result.error) - self.ecme_tftp.get_file(basename, filename) - except (IpmiError, TftpException): - # Fall back and use our tftp server - try: - result = self.bmc.fabric_config_get_mac_addresses(basename, - self.tftp_address) - except IpmiError as e: - raise IpmiError(self._parse_ipmierror(e)) - if hasattr(result, "error"): - raise IpmiError(result.error) + filename = self._run_fabric_command( + function_name='fabric_config_get_mac_addresses' + ) - deadline = time.time() + 10 - while time.time() < deadline: - try: - time.sleep(1) - self.tftp.get_file(src=basename, dest=filename) - if (os.path.getsize(filename) > 0): - break - except (TftpException, IOError): - pass + except IpmiError as e: + raise IpmiError(self._parse_ipmierror(e)) # Parse addresses from ipinfo file results = {} @@ -1188,35 +1148,9 @@ class Node(object): :raises TftpException: If the TFTP transfer fails. """ - filename = temp_file() - basename = os.path.basename(filename) - # - # TODO: Use ECME as TFTP server first, when supported - # - # result = self.bmc.fabric_config_get_uplink_info(basename) - # - try: - result = self.bmc.fabric_config_get_uplink_info( - basename, - self.tftp_address - ) - - except IpmiError as e: - raise IpmiError(self._parse_ipmierror(e)) - - if hasattr(result, "error"): - raise IpmiError(result.error) - - deadline = time.time() + 10 - while (time.time() < deadline): - try: - time.sleep(1) - self.tftp.get_file(src=basename, dest=filename) - if (os.path.getsize(filename) > 0): - break - - except (TftpException, IOError): - pass + filename = self._run_fabric_command( + function_name='fabric_config_get_uplink_info' + ) # Parse addresses from ipinfo file results = {} @@ -1247,32 +1181,10 @@ class Node(object): :raises IpmiError: If the IPMI command fails. """ - filename = temp_file() - basename = os.path.basename(filename) - try: - result = self.bmc.fabric_get_link_stats( - filename=basename, - tftp_addr=self.tftp_address, - link=link - ) - - except IpmiError as e: - raise IpmiError(self._parse_ipmierror(e)) - - if hasattr(result, "error"): - raise IpmiError(result.error) - - deadline = time.time() + 10 - while (time.time() < deadline): - try: - time.sleep(1) - self.tftp.get_file(src=basename, dest=filename) - if (os.path.getsize(filename) > 0): - break - - except (TftpException, IOError): - pass - + filename = self._run_fabric_command( + function_name='fabric_get_link_stats', + link=link + ) results = {} for line in open(filename): if ('=' in line): @@ -1571,6 +1483,38 @@ class Node(object): except IpmiError as e: raise IpmiError(self._parse_ipmierror(e)) + def _run_fabric_command(self, function_name, **kwargs): + """Handles the basics of sending a node a command for fabric data.""" + filename = temp_file() + basename = os.path.basename(filename) + try: + getattr(self.bmc, function_name)(filename=basename, **kwargs) + self.ecme_tftp.get_file(basename, filename) + + except (IpmiError, TftpException) as e: + try: + getattr(self.bmc, function_name)( + filename=basename, + tftp_addr=self.tftp_address, + **kwargs + ) + + except IpmiError as e: + raise IpmiError(self._parse_ipmierror(e)) + + deadline = time.time() + 10 + while (time.time() < deadline): + try: + time.sleep(1) + self.tftp.get_file(src=basename, dest=filename) + if (os.path.getsize(filename) > 0): + break + + except (TftpException, IOError): + pass + + return filename + def _get_partition(self, fwinfo, image_type, partition_arg): """Get a partition for this image type based on the argument.""" # Filter partitions for this type diff --git a/cxmanage_test/node_test.py b/cxmanage_test/node_test.py index 0b76a91..00ad275 100644 --- a/cxmanage_test/node_test.py +++ b/cxmanage_test/node_test.py @@ -504,7 +504,7 @@ class DummyBMC(LanBMC): self.executed.append(('get_fabric_link_stats', link)) if not(tftp_addr): - raise IpmiError('ERROR: No TFTP Address!') + raise IpmiError('No tftp address!') link_stats = [] link_stats.append('Packet Counts for Link %s:' % link) @@ -544,12 +544,12 @@ class DummyBMC(LanBMC): shutil.rmtree(work_dir) - def fabric_config_get_ip_info(self, filename, tftp_address=None): + def fabric_config_get_ip_info(self, filename, tftp_addr=None): """ Upload an ipinfo file from the node to TFTP""" self.executed.append("fabric_config_get_ip_info") - if tftp_address == None: - raise IpmiError() + if not(tftp_addr): + raise IpmiError('No tftp address!') work_dir = tempfile.mkdtemp(prefix="cxmanage_test-") @@ -560,18 +560,18 @@ class DummyBMC(LanBMC): ipinfo.close() # Upload to tftp - address, port = tftp_address.split(":") + address, port = tftp_addr.split(":") port = int(port) tftp = ExternalTftp(address, port) tftp.put_file("%s/%s" % (work_dir, filename), filename) shutil.rmtree(work_dir) - def fabric_config_get_uplink_info(self, filename, tftp_address=None): + def fabric_config_get_uplink_info(self, filename, tftp_addr=None): self.executed.append("fabric_config_get_uplink_info") - if tftp_address == None: - raise IpmiError() + if not(tftp_addr): + raise IpmiError('No tftp address!') work_dir = tempfile.mkdtemp(prefix="cxmanage_test-") # Create uplink info file @@ -581,7 +581,7 @@ class DummyBMC(LanBMC): ulinfo.close() # Upload to tftp - address, port = tftp_address.split(":") + address, port = tftp_addr.split(":") port = int(port) tftp = ExternalTftp(address, port) tftp.put_file("%s/%s" % (work_dir, filename), filename) @@ -595,12 +595,12 @@ class DummyBMC(LanBMC): def fabric_config_set_uplink(self, uplink, iface): self.executed.append(("fabric_config_set_uplink", uplink, iface)) - def fabric_config_get_mac_addresses(self, filename, tftp_address=None): + def fabric_config_get_mac_addresses(self, filename, tftp_addr=None): """ Upload a macaddrs file from the node to TFTP""" self.executed.append("fabric_config_get_mac_addresses") - if tftp_address == None: - raise IpmiError() + if not(tftp_addr): + raise IpmiError('No tftp address!') work_dir = tempfile.mkdtemp(prefix="cxmanage_test-") @@ -613,7 +613,7 @@ class DummyBMC(LanBMC): macaddrs.close() # Upload to tftp - address, port = tftp_address.split(":") + address, port = tftp_addr.split(":") port = int(port) tftp = ExternalTftp(address, port) tftp.put_file("%s/%s" % (work_dir, filename), filename) |