diff --git a/solar/core/handlers/naive_sync.py b/solar/core/handlers/naive_sync.py index c06b7236..b2c79a19 100644 --- a/solar/core/handlers/naive_sync.py +++ b/solar/core/handlers/naive_sync.py @@ -27,4 +27,4 @@ class NaiveSync(BaseHandler): # to understand where src comes from for item in args['sources']: self.transport_sync.copy(resource, item['src'], item['dst']) - self.transport_sync.sync_all() + self.transport_sync.sync_all() diff --git a/solar/core/transports/rsync.py b/solar/core/transports/rsync.py index ff69701e..a660d881 100644 --- a/solar/core/transports/rsync.py +++ b/solar/core/transports/rsync.py @@ -54,10 +54,14 @@ class RsyncSyncTransport(SyncTransport): def copy(self, resource, _from, _to, use_sudo=False): log.debug("RSYNC: %s -> %s", _from, _to) - if use_sudo: - rsync_path = "sudo rsync" + if os.path.isdir(_from): + r_dir_path = _to else: - rsync_path = "rsync" + r_dir_path = _to.rsplit('/', 1)[0] + if use_sudo: + rsync_path = "sudo mkdir -p {} && sudo rsync".format(r_dir_path) + else: + rsync_path = "mkdir -p {} && rsync".format(r_dir_path) rsync_props = self._rsync_props(resource) ssh_cmd = ' '.join(self._ssh_cmd(rsync_props)) diff --git a/solar/core/transports/ssh.py b/solar/core/transports/ssh.py index 2c25fd0b..eb3939c7 100644 --- a/solar/core/transports/ssh.py +++ b/solar/core/transports/ssh.py @@ -65,21 +65,38 @@ class SSHSyncTransport(SyncTransport, _SSHTransport): _SSHTransport.__init__(self) SyncTransport.__init__(self) + def _ensure_remote_dir_exists(self, resource, _from, _to, use_sudo=False): + # NOTE(jnowak): it's not efficient way to do so, but also this + # transport is not that efficient + if os.path.isdir(_from): + r_dir_path = _to + else: + r_dir_path = _to.rsplit('/', 1)[0] + self.other(resource).run(resource, + 'mkdir', + '-p', + r_dir_path, + use_sudo=use_sudo) + def _copy_file(self, resource, _from, _to, use_sudo=False): - executor = lambda transport: fabric_project.put( - remote_path=_to, - local_path=_from, - use_sudo=use_sudo - ) - return executor + def wrp(transport): + self._ensure_remote_dir_exists(resource, _from, _to, use_sudo) + return fabric_project.put( + remote_path=_to, + local_path=_from, + use_sudo=use_sudo + ) + return wrp def _copy_directory(self, resource, _from, _to, use_sudo=False): - executor = lambda transport: fabric_project.upload_project( - remote_dir=_to, - local_dir=_from, - use_sudo=use_sudo - ) - return executor + def wrp(transport): + self._ensure_remote_dir_exists(resource, _from, _to, use_sudo) + return fabric_project.upload_project( + remote_dir=_to, + local_dir=_from, + use_sudo=use_sudo + ) + return wrp def copy(self, resource, _from, _to, use_sudo=False): log.debug('SCP: %s -> %s', _from, _to)