Added SolarRunResult to wrap all Run transports results

This commit is contained in:
Jedrzej Nowak 2015-09-28 13:47:22 +02:00
parent 247777891c
commit 2103f8f606
5 changed files with 42 additions and 5 deletions

View File

@ -20,7 +20,6 @@ from solar.core.log import log
from solar.core.handlers.base import TempFileHandler
from solar import errors
# otherwise fabric will sys.exit(1) in case of errors
env.warn_only = True
@ -29,6 +28,7 @@ env.warn_only = True
# we would not need to render it there
# for now we redender it locally, sync to remote, run ansible on remote host as local
class AnsibleTemplate(TempFileHandler):
def action(self, resource, action_name):
inventory_file = self._create_inventory(resource)
playbook_file = self._create_playbook(resource, action_name)

View File

@ -58,6 +58,21 @@ class SolarTransport(object):
class SolarRunResult(object):
def __init__(self, result, failed=False):
self._result = result
self._failed = failed
@property
def failed(self):
return self._failed
@property
def result(self):
return self._result
class SyncTransport(SolarTransport):
"""
Transport that is responsible for file / directory syncing.
@ -116,6 +131,9 @@ class RunTransport(SolarTransport):
def __init__(self):
super(RunTransport, self).__init__()
def get_result(self, *args, **kwargs):
raise NotImplementedError()
def bind_with(self, other):
# we migth add there something later
# like compat checking etc

View File

@ -15,7 +15,7 @@
from solard.client import SolardClient
from solar.core.transports.base import RunTransport, SyncTransport, Executor
from solar.core.transports.base import RunTransport, SyncTransport, Executor, SolarRunResult
from solar.core.log import log
@ -50,13 +50,19 @@ class SolardSyncTransport(SyncTransport, SolardTransport):
self.executors.append(executor)
class SolardRunTransport(RunTransport, SolardTransport):
preffered_transport_name = 'solard'
def get_result(self, result, failed=False):
return SolarRunResult(result, failed)
def run(self, resource, *args, **kwargs):
log.debug("Solard run: %s", args)
client = self.get_client(resource)
return client.run(' '.join(args), **kwargs)
try:
res = client.run(' '.join(args), **kwargs)
return self.get_result(res, failed=False)
except Exception as ex:
return self.get_result(ex, failed=True)

View File

@ -20,6 +20,7 @@ from fabric.contrib import project as fabric_project
from solar.core.log import log
from solar.core.transports.base import RunTransport, SyncTransport, Executor
from solar.core.transports.base import SolarRunResult
class _SSHTransport(object):
@ -86,6 +87,15 @@ class SSHRunTransport(RunTransport, _SSHTransport):
preffered_transport_name = 'ssh'
def get_result(self, output):
"""
Needed for compatibility with other handlers / transports
"""
if output.failed:
return SolarRunResult(output, failed=True)
return SolarRunResult(output, failed=False)
def run(self, resource, *args, **kwargs):
log.debug('SSH: %s', args)
@ -109,4 +119,5 @@ class SSHRunTransport(RunTransport, _SSHTransport):
managers.append(fabric_api.warn_only())
with nested(*managers):
return executor(' '.join(args))
res = executor(' '.join(args))
return self.get_result(res)

View File

@ -3,6 +3,8 @@ import os
# TODO: handle errors
class SolardClient(object):
read_buffer = 4096