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)
|
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
|
||||||
|
@ -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]:
|
||||||
|
@ -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):
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user