summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorevasquez <eric.vasquez@calxeda.com>2013-04-26 15:18:28 -0500
committerevasquez <eric.vasquez@calxeda.com>2013-04-29 09:05:03 -0500
commitc0fecd201d237acbb5a4da5124f6e48cce6d6159 (patch)
treed73df13a1f4663ede50ac8945d85b38ab70e8635
parentdd3b705f1104403c18204ee356e72d4c21887fd8 (diff)
downloadcxmanage-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.py154
-rw-r--r--cxmanage_test/node_test.py26
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)