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)
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)
if rc:
if not result.success:
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):
return self

View File

@ -48,7 +48,7 @@ class Puppet(TempFileHandler):
cmd_args.append('--modulepath={}'.format(
resource.args['puppet_modules']))
rc, out, err = self.transport_run.run(
res = self.transport_run.run(
resource,
*cmd_args,
env={
@ -57,6 +57,7 @@ class Puppet(TempFileHandler):
use_sudo=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)
# 0 - no changes, 2 - successfull changes
if rc not in [0, 2]:

View File

@ -41,48 +41,56 @@ class Executor(object):
def run(self, transport):
if self.valid:
result = self._executor(transport)
if isinstance(result, tuple) and len(result) == 3:
executor_result = self._executor(transport)
if isinstance(executor_result, tuple) \
and len(executor_result) == 3:
# TODO Include file information in result
rc, out, err = result
log.debug('RC %s OUT %s ERR %s', rc, out, err)
if rc:
raise errors.SolarError(err)
obj = SolarTransportResult.from_tuple(*executor_result)
log.debug(
'RC %s OUT %s ERR %s',
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):
self.name = name
def __init__(self):
self.return_code = None
self.stderr = None
self.stdout = None
def __get__(self, obj, objtype):
res = obj._result
if isinstance(res, dict):
try:
return res[self.name]
except KeyError:
# Let's keep the same exceptions
raise AttributeError(self.name)
return getattr(obj._result, self.name)
@property
def success(self):
if self.return_code is not None:
return self.return_code == 0
return None
@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):
self._result = result
failed = SolarRunResultWrp('failed')
stdout = SolarRunResultWrp('stdout')
stderr = SolarRunResultWrp('stderr')
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 from_fabric(cls, fabric_obj):
obj = cls()
obj.return_code = fabric_obj['return_code']
obj.stdout = fabric_obj['stdout']
obj.stderr = fabric_obj['stderr']
return obj
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.transports.base import Executor
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
@ -59,7 +59,11 @@ class SolarAgentRunTransport(RunTransport, SolarAgentTransport):
preffered_transport_name = 'solar_agent'
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):
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.transports.base import Executor
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
@ -102,7 +102,7 @@ class SSHRunTransport(RunTransport, _SSHTransport):
def get_result(self, output):
"""Needed for compatibility with other handlers / transports"""
return SolarRunResult(output)
return SolarTransportResult.from_fabric(output)
def run(self, resource, *args, **kwargs):
log.debug('SSH: %s', args)

View File

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