From c5df7070af638c5aaf4d6d2ab626475cc3610c0b Mon Sep 17 00:00:00 2001 From: Jim Rollenhagen Date: Thu, 12 Jun 2014 06:47:16 -0700 Subject: [PATCH] Better errors for execute() failures Exceptions raised due to processutils.execute() failing now include stdout and stderr. Change-Id: Id5d1b5bc51d377f9f3c338cd7303ea800f76e5cd --- ironic_python_agent/errors.py | 22 ++++++++++++---------- ironic_python_agent/extensions/standby.py | 9 ++++++--- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/ironic_python_agent/errors.py b/ironic_python_agent/errors.py index a02b80b2f..be61bdb64 100644 --- a/ironic_python_agent/errors.py +++ b/ironic_python_agent/errors.py @@ -159,10 +159,11 @@ class ImageWriteError(RESTError): message = 'Error writing image to device.' - def __init__(self, exit_code, device): + def __init__(self, device, exit_code, stdout, stderr): super(ImageWriteError, self).__init__() - self.details = 'Writing image to device {0} failed with exit code {1}.' - self.details = self.details.format(device, exit_code) + self.details = ('Writing image to device {0} failed with exit code ' + '{1}. stdout: {2}. stderr: {3}') + self.details = self.details.format(device, exit_code, stdout, stderr) class ConfigDriveTooLargeError(RESTError): @@ -183,10 +184,10 @@ class ConfigDriveWriteError(RESTError): message = 'Error writing configdrive to device.' - def __init__(self, exit_code, device): - details = 'Writing configdrive to device {0} failed with exit code ' \ - '{1}.' - details = details.format(device, exit_code) + def __init__(self, device, exit_code, stdout, stderr): + details = ('Writing configdrive to device {0} failed with exit code ' + '{1}. stdout: {2}. stderr: {3}.') + details = details.format(device, exit_code, stdout, stderr) super(ConfigDriveWriteError, self).__init__(details) self.details = details @@ -196,10 +197,11 @@ class SystemRebootError(RESTError): message = 'Error rebooting system.' - def __init__(self, exit_code): + def __init__(self, exit_code, stdout, stderr): super(SystemRebootError, self).__init__() - self.details = 'Reboot script failed with exit code {0}.' - self.details = self.details.format(exit_code) + self.details = ('Reboot script failed with exit code {0}. stdout: ' + '{1}. stderr: {2}.') + self.details = self.details.format(exit_code, stdout, stderr) class BlockDeviceEraseError(RESTError): diff --git a/ironic_python_agent/extensions/standby.py b/ironic_python_agent/extensions/standby.py index 7a3d05b96..5feb23983 100644 --- a/ironic_python_agent/extensions/standby.py +++ b/ironic_python_agent/extensions/standby.py @@ -54,7 +54,7 @@ def _write_image(image_info, device): try: stdout, stderr = utils.execute(*command, check_exit_code=[0]) except processutils.ProcessExecutionError as e: - raise errors.ImageWriteError(e.exit_code, device) + raise errors.ImageWriteError(device, e.exit_code, e.stdout, e.stderr) totaltime = time.time() - starttime LOG.info('Image {0} written to device {1} in {2} seconds'.format( image, device, totaltime)) @@ -88,7 +88,10 @@ def _write_configdrive_to_partition(configdrive, device): try: stdout, stderr = utils.execute(*command, check_exit_code=[0]) except processutils.ProcessExecutionError as e: - raise errors.ConfigDriveWriteError(e.exit_code, device) + raise errors.ConfigDriveWriteError(device, + e.exit_code, + e.stdout, + e.stderr) totaltime = time.time() - starttime LOG.info('configdrive copied from {0} to {1} in {2} seconds'.format( @@ -209,4 +212,4 @@ class StandbyExtension(base.BaseAgentExtension): try: stdout, stderr = utils.execute(*command, check_exit_code=[0]) except processutils.ProcessExecutionError as e: - raise errors.SystemRebootError(e.exit_code) + raise errors.SystemRebootError(e.exit_code, e.stdout, e.stderr)