Unify returned transport results

Change-Id: Iaaff589c220f54c0882ccea0f7d0a5a4ae4ace19
This commit is contained in:
Jedrzej Nowak 2016-01-19 14:59:15 +01:00
parent aea48b733e
commit 07e3ae1412
6 changed files with 58 additions and 43 deletions

View File

@ -44,11 +44,12 @@ class BaseHandler(object):
self.transport_run.bind_with(self.transport_sync) self.transport_run.bind_with(self.transport_sync)
def verify_run_result(self, cmd, result): def verify_run_result(self, cmd, result):
rc, out, err = result rc, out, err = result.return_code, result.stdout, result.stderr
log.debug('CMD %r RC %s OUT %s ERR %s', cmd, rc, out, err) log.debug('CMD %r RC %s OUT %s ERR %s', cmd, rc, out, err)
if rc: if not result.success:
message = 'CMD %r failed RC %s ERR %s' % (cmd, rc, err) message = 'CMD %r failed RC %s ERR %s' % (cmd, rc, err)
raise errors.SolarError(message) log.error(message)
raise errors.SolarError(result.output)
def __enter__(self): def __enter__(self):
return self return self

View File

@ -48,7 +48,7 @@ class Puppet(TempFileHandler):
cmd_args.append('--modulepath={}'.format( cmd_args.append('--modulepath={}'.format(
resource.args['puppet_modules'])) resource.args['puppet_modules']))
rc, out, err = self.transport_run.run( res = self.transport_run.run(
resource, resource,
*cmd_args, *cmd_args,
env={ env={
@ -57,6 +57,7 @@ class Puppet(TempFileHandler):
use_sudo=True, use_sudo=True,
warn_only=True warn_only=True
) )
rc, out, err = res.return_code, res.stdout, res.stderr
log.debug('CMD %r RC %s OUT %s ERR %s', cmd_args, rc, out, err) log.debug('CMD %r RC %s OUT %s ERR %s', cmd_args, rc, out, err)
# 0 - no changes, 2 - successfull changes # 0 - no changes, 2 - successfull changes
if rc not in [0, 2]: if rc not in [0, 2]:

View File

@ -41,48 +41,56 @@ class Executor(object):
def run(self, transport): def run(self, transport):
if self.valid: if self.valid:
result = self._executor(transport) executor_result = self._executor(transport)
if isinstance(result, tuple) and len(result) == 3: if isinstance(executor_result, tuple) \
and len(executor_result) == 3:
# TODO Include file information in result # TODO Include file information in result
rc, out, err = result obj = SolarTransportResult.from_tuple(*executor_result)
log.debug('RC %s OUT %s ERR %s', rc, out, err) log.debug(
if rc: 'RC %s OUT %s ERR %s',
raise errors.SolarError(err) obj.return_code,
obj.stdout,
obj.stderr
)
if obj.success is False:
raise errors.SolarError(obj.output)
elif obj.success is None:
log.debug("Cannot verify result")
class SolarRunResultWrp(object): class SolarTransportResult(object):
def __init__(self, name): def __init__(self):
self.name = name self.return_code = None
self.stderr = None
self.stdout = None
def __get__(self, obj, objtype): @property
res = obj._result def success(self):
if isinstance(res, dict): if self.return_code is not None:
try: return self.return_code == 0
return res[self.name] return None
except KeyError:
# Let's keep the same exceptions
raise AttributeError(self.name)
return getattr(obj._result, self.name)
@property
def output(self):
if self.success:
return self.stdout
return self.stderr
class SolarRunResult(object): @classmethod
def from_tuple(cls, return_code, stdout, stderr):
obj = cls()
obj.return_code = return_code
obj.stdout = stdout
obj.stderr = stderr
return obj
def __init__(self, result): def from_fabric(cls, fabric_obj):
self._result = result obj = cls()
obj.return_code = fabric_obj['return_code']
failed = SolarRunResultWrp('failed') obj.stdout = fabric_obj['stdout']
stdout = SolarRunResultWrp('stdout') obj.stderr = fabric_obj['stderr']
stderr = SolarRunResultWrp('stderr') return obj
succeeded = SolarRunResultWrp('succeeded')
command = SolarRunResultWrp('command')
real_command = SolarRunResultWrp('real_command')
return_code = SolarRunResultWrp('return_code')
def __str__(self):
if self.failed:
return str(self.stderr)
return str(self.stdout)
def find_named_transport(resource, req_name): def find_named_transport(resource, req_name):

View File

@ -18,7 +18,7 @@ from solar_agent.client import SolarAgentClient
from solar.core.log import log from solar.core.log import log
from solar.core.transports.base import Executor from solar.core.transports.base import Executor
from solar.core.transports.base import RunTransport from solar.core.transports.base import RunTransport
from solar.core.transports.base import SolarRunResult from solar.core.transports.base import SolarTransportResult
from solar.core.transports.base import SyncTransport from solar.core.transports.base import SyncTransport
@ -59,7 +59,11 @@ class SolarAgentRunTransport(RunTransport, SolarAgentTransport):
preffered_transport_name = 'solar_agent' preffered_transport_name = 'solar_agent'
def get_result(self, result): def get_result(self, result):
return SolarRunResult(result) obj = SolarTransportResult()
obj.return_code = result['return_code']
obj.stderr = result['stderr']
obj.stdout = result['stdout']
return obj
def run(self, resource, *args, **kwargs): def run(self, resource, *args, **kwargs):
log.debug("SolarAgent run: %s", args) log.debug("SolarAgent run: %s", args)

View File

@ -21,7 +21,7 @@ from fabric.contrib import project as fabric_project
from solar.core.log import log from solar.core.log import log
from solar.core.transports.base import Executor from solar.core.transports.base import Executor
from solar.core.transports.base import RunTransport from solar.core.transports.base import RunTransport
from solar.core.transports.base import SolarRunResult from solar.core.transports.base import SolarTransportResult
from solar.core.transports.base import SyncTransport from solar.core.transports.base import SyncTransport
@ -102,7 +102,7 @@ class SSHRunTransport(RunTransport, _SSHTransport):
def get_result(self, output): def get_result(self, output):
"""Needed for compatibility with other handlers / transports""" """Needed for compatibility with other handlers / transports"""
return SolarRunResult(output) return SolarTransportResult.from_fabric(output)
def run(self, resource, *args, **kwargs): def run(self, resource, *args, **kwargs):
log.debug('SSH: %s', args) log.debug('SSH: %s', args)

View File

@ -17,6 +17,7 @@ import os
from solar.core.log import log from solar.core.log import log
from solar.core.transports.base import RunTransport from solar.core.transports.base import RunTransport
from solar.core.transports.base import SolarTransportResult
from solar.utils import execute from solar.utils import execute
@ -91,4 +92,4 @@ class RawSSHRunTransport(RunTransport, _RawSSHTransport):
res = execute(' '.join(ssh_cmd), shell=True, env=env) res = execute(' '.join(ssh_cmd), shell=True, env=env)
log.debug("Remote SSH result: %r", res) log.debug("Remote SSH result: %r", res)
return res return SolarTransportResult.from_tuple(*res)