actions: Allow not printing error when an action fails

Reviewed-by: Joseph Nuthalapati <njoseph@thoughtworks.com>
This commit is contained in:
Vikas Singh 2018-01-10 10:46:22 +05:30 committed by Joseph Nuthalapati
parent 63e67b5688
commit 5c83dea442
No known key found for this signature in database
GPG Key ID: 5398F00A2FA43C35
3 changed files with 34 additions and 13 deletions

View File

@ -109,12 +109,12 @@ def run(action, options=None, input=None, async=False):
return _run(action, options, input, async, False) return _run(action, options, input, async, False)
def superuser_run(action, options=None, input=None, async=False): def superuser_run(action, options=None, input=None, async=False, log_error=True):
"""Safely run a specific action as root. """Safely run a specific action as root.
See actions._run for more information. See actions._run for more information.
""" """
return _run(action, options, input, async, True) return _run(action, options, input, async, True, log_error=log_error)
def run_as_user(action, options=None, input=None, async=False, def run_as_user(action, options=None, input=None, async=False,
@ -127,7 +127,7 @@ def run_as_user(action, options=None, input=None, async=False,
def _run(action, options=None, input=None, async=False, run_as_root=False, def _run(action, options=None, input=None, async=False, run_as_root=False,
become_user=None): become_user=None, log_error=True):
"""Safely run a specific action as a normal user or root. """Safely run a specific action as a normal user or root.
Actions are pulled from the actions directory. Actions are pulled from the actions directory.
@ -186,8 +186,9 @@ def _run(action, options=None, input=None, async=False, run_as_root=False,
output, error = proc.communicate(input=input) output, error = proc.communicate(input=input)
output, error = output.decode(), error.decode() output, error = output.decode(), error.decode()
if proc.returncode != 0: if proc.returncode != 0:
LOGGER.error('Error executing command - %s, %s, %s', cmd, output, if log_error:
error) LOGGER.error('Error executing command - %s, %s, %s', cmd, output,
error)
raise ActionError(action, output, error) raise ActionError(action, output, error)
return output return output

View File

@ -92,9 +92,9 @@ class Transaction(object):
process.stdin.close() process.stdin.close()
stdout_thread = threading.Thread(target=self._read_stdout, stdout_thread = threading.Thread(target=self._read_stdout,
args=(process,)) args=(process, ))
stderr_thread = threading.Thread(target=self._read_stderr, stderr_thread = threading.Thread(target=self._read_stderr,
args=(process,)) args=(process, ))
stdout_thread.start() stdout_thread.start()
stderr_thread.start() stderr_thread.start()
stdout_thread.join() stdout_thread.join()
@ -123,11 +123,14 @@ class Transaction(object):
return return
status_map = { status_map = {
'pmstatus': _('installing'), 'pmstatus':
'dlstatus': _('downloading'), _('installing'),
'media-change': _('media change'), 'dlstatus':
'pmconffile': _('configuration file: {file}').format( _('downloading'),
file=parts[1]), 'media-change':
_('media change'),
'pmconffile':
_('configuration file: {file}').format(file=parts[1]),
} }
self.status_string = status_map.get(parts[0], '') self.status_string = status_map.get(parts[0], '')
self.percentage = int(float(parts[2])) self.percentage = int(float(parts[2]))
@ -136,7 +139,8 @@ class Transaction(object):
def is_package_manager_busy(): def is_package_manager_busy():
"""Return whether a package manager is running.""" """Return whether a package manager is running."""
try: try:
actions.superuser_run('packages', ['is-package-manager-busy']) actions.superuser_run('packages', ['is-package-manager-busy'],
log_error=False)
return True return True
except actions.ActionError: except actions.ActionError:
return False return False

View File

@ -19,10 +19,13 @@
Test module for actions utilities that modify configuration. Test module for actions utilities that modify configuration.
""" """
import apt_pkg
import os
import shutil import shutil
import tempfile import tempfile
import unittest import unittest
from plinth.errors import ActionError
from plinth.actions import superuser_run, run from plinth.actions import superuser_run, run
from plinth import cfg from plinth import cfg
@ -40,6 +43,7 @@ class TestPrivileged(unittest.TestCase):
cls.action_directory = tempfile.TemporaryDirectory() cls.action_directory = tempfile.TemporaryDirectory()
cfg.actions_dir = cls.action_directory.name cfg.actions_dir = cls.action_directory.name
shutil.copy(os.path.join(os.path.dirname(__file__), '..', '..', 'actions', 'packages'), cfg.actions_dir)
shutil.copy('/bin/echo', cfg.actions_dir) shutil.copy('/bin/echo', cfg.actions_dir)
shutil.copy('/usr/bin/id', cfg.actions_dir) shutil.copy('/usr/bin/id', cfg.actions_dir)
@ -143,3 +147,15 @@ class TestPrivileged(unittest.TestCase):
output = run('echo', tuple(options.split())) output = run('echo', tuple(options.split()))
output = output.rstrip('\n') output = output.rstrip('\n')
self.assertEqual(options, output) self.assertEqual(options, output)
def test_error_handling_for_superuser(self):
"""Test that errors are raised only when expected."""
with apt_pkg.SystemLock():
with self.assertRaises(ActionError):
superuser_run('packages', ['is-package-manager-busy'],
log_error=True)
with self.assertRaises(ActionError):
superuser_run('packages', ['is-package-manager-busy'],
log_error=False)
with self.assertRaises(ActionError):
superuser_run('packages', ['is-package-manager-busy'])