Unify returned transport results
Change-Id: Iaaff589c220f54c0882ccea0f7d0a5a4ae4ace19
This commit is contained in:
parent
aea48b733e
commit
07e3ae1412
@ -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
|
||||
|
@ -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]:
|
||||
|
@ -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):
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user