118 lines
3.6 KiB
Python
118 lines
3.6 KiB
Python
from solar.core.transports.base import SyncTransport, RunTransport, SolarTransport
|
|
from solar.core.transports.ssh import SSHSyncTransport, SSHRunTransport
|
|
from solar.core.transports.rsync import RsyncSyncTransport
|
|
try:
|
|
from solar.core.transports.solard_transport import SolardRunTransport, SolardSyncTransport
|
|
except ImportError:
|
|
_solard_available = False
|
|
else:
|
|
_solard_available = True
|
|
|
|
try:
|
|
from solar.core.transports.torrent import TorrentSyncTransport
|
|
except ImportError:
|
|
_torrent_available = False
|
|
else:
|
|
_torrent_available = True
|
|
|
|
|
|
KNOWN_SYNC_TRANSPORTS = {
|
|
'rsync': RsyncSyncTransport,
|
|
'ssh': SSHSyncTransport
|
|
}
|
|
|
|
|
|
KNOWN_RUN_TRANSPORTS = {
|
|
'ssh': SSHRunTransport
|
|
}
|
|
|
|
|
|
if _torrent_available:
|
|
KNOWN_SYNC_TRANSPORTS['torrent'] = TorrentSyncTransport
|
|
if _solard_available:
|
|
KNOWN_SYNC_TRANSPORTS['solard'] = SolardSyncTransport
|
|
KNOWN_RUN_TRANSPORTS['solard'] = SolardRunTransport
|
|
|
|
|
|
class OnAll(object):
|
|
|
|
def __init__(self, target):
|
|
self._target = target
|
|
|
|
def __get__(self, obj, objtype):
|
|
def _inner(*args, **kwargs):
|
|
for transport in obj._used_transports:
|
|
getattr(transport, self._target)(*args, **kwargs)
|
|
return _inner
|
|
|
|
|
|
class BatTransport(SolarTransport):
|
|
|
|
_order = ()
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super(BatTransport, self).__init__(*args, **kwargs)
|
|
self._cache = {}
|
|
self._used_transports = []
|
|
self._other_remember = None
|
|
|
|
def select_valid_transport(self, resource, *args, **kwargs):
|
|
key_name = '_bat_transport_%s' % self._mode
|
|
try:
|
|
return getattr(resource, key_name)
|
|
except AttributeError:
|
|
transports = resource.transports()
|
|
for pref in self._order:
|
|
selected = next((x for x in transports if x['name'] == pref), None)
|
|
if selected:
|
|
break
|
|
if not selected:
|
|
raise Exception("No valid transport found")
|
|
instance = self._bat_transports[selected['name']]()
|
|
setattr(resource, '_used_transport_%s' % instance._mode, selected)
|
|
setattr(resource, key_name, instance)
|
|
self._used_transports.append(instance)
|
|
instance.bind_with(self._other_remember)
|
|
return instance
|
|
# return self._bat_transports[selected['name']]
|
|
|
|
def get_transport_data(self, resource, *args, **kwargs):
|
|
self.select_valid_transport(resource)
|
|
return super(BatTransport, self).get_transport_data(resource, *args, **kwargs)
|
|
|
|
def bind_with(self, other):
|
|
self._other_remember = other
|
|
|
|
|
|
class BatSyncTransport(SyncTransport, BatTransport):
|
|
|
|
preffered_transport_name = None
|
|
_order = ('torrent', 'solard', 'rsync', 'ssh')
|
|
_bat_transports = KNOWN_SYNC_TRANSPORTS
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
BatTransport.__init__(self)
|
|
SyncTransport.__init__(self, *args, **kwargs)
|
|
|
|
def copy(self, resource, *args, **kwargs):
|
|
transport = self.select_valid_transport(resource)
|
|
return transport.copy(resource, *args, **kwargs)
|
|
|
|
run_all = OnAll('run_all')
|
|
preprocess_all = OnAll('preprocess_all')
|
|
|
|
|
|
class BatRunTransport(RunTransport, BatTransport):
|
|
|
|
preffered_transport_name = None
|
|
_order = ('solard', 'ssh')
|
|
_bat_transports = KNOWN_RUN_TRANSPORTS
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
BatTransport.__init__(self)
|
|
RunTransport.__init__(self, *args, **kwargs)
|
|
|
|
def run(self, resource, *args, **kwargs):
|
|
transport = self.select_valid_transport(resource)
|
|
return transport.run(resource, *args, **kwargs)
|