def test_symlink_file2(self): """ Symlnik a single file into a non-existing folder """ src = os.path.join(self.rootdir,"folder0","folder1","file2") target = os.path.join( self.targetdir, "these","folders","should","be","created") self.assertTrue(transfer.SymlinkAgent(src,target).transfer())
def stage_delivery(self): """ Stage a delivery by symlinking source paths to destination paths according to the returned tuples from the gather_files function. Checksums will be written to a digest file in the staging path. Failure to stage individual files will be logged as warnings but will not terminate the staging. :raises DelivererError: if an unexpected error occurred """ digestpath = self.staging_digestfile() filelistpath = self.staging_filelist() create_folder(os.path.dirname(digestpath)) try: with open(digestpath, 'w') as dh, open(filelistpath, 'w') as fh: agent = transfer.SymlinkAgent(None, None, relative=True) for src, dst, digest in self.gather_files(): agent.src_path = src agent.dest_path = dst try: agent.transfer() except (transfer.TransferError, transfer.SymlinkError) as e: logger.warning("failed to stage file '{}' when " "delivering {} - reason: {}".format(src, str(self), e)) fpath = os.path.relpath(dst, self.expand_path(self.stagingpath)) fh.write("{}\n".format(fpath)) if digest is not None: dh.write("{} {}\n".format(digest, fpath)) # finally, include the digestfile in the list of files to deliver fh.write("{}\n".format(os.path.basename(digestpath))) except (IOError, fs.FileNotFoundException, fs.PatternNotMatchedException) as e: raise DelivererError( "failed to stage delivery - reason: {}".format(e)) return True
def test_symlink_folder3(self): """ Don't overwrite a mount point """ src = os.path.join(self.rootdir) target = os.path.join(self.targetdir) with mock.patch.object(transfer.os.path, 'ismount', return_value=True): with self.assertRaises(transfer.SymlinkError): transfer.SymlinkAgent(src, target).transfer()
def test_symlink_file4(self): """ Don't replace an existing file without overwrite """ src = os.path.join(self.rootdir, "file0") target = os.path.join(self.targetdir, os.path.basename(src)) open(target, 'w').close() self.assertFalse( transfer.SymlinkAgent(src, target, overwrite=False).transfer())
def test_symlink_folder5(self): """ Failing to create parent folder structure should raise SymlinkError """ src = self.rootdir target = os.path.join(self.targetdir,"non-existing-folder","target-file") with mock.patch.object(transfer,'create_folder',return_value=False): with self.assertRaises(transfer.SymlinkError): transfer.SymlinkAgent(src,target).transfer()
def test_symlink_folder_unexpected(self): """An unexpected exception should propagate upwards.""" src = self.rootdir target = self.targetdir with mock.patch.object(transfer.os.path, 'exists', side_effect=Exception('Mocked error')): with self.assertRaises(Exception): transfer.SymlinkAgent(src, target).transfer()
def test_symlink_folder_symlink_error(self): """Failing to create symlink should raise SymlinkError.""" src = self.rootdir target = os.path.join(self.targetdir, os.path.basename(src)) with mock.patch.object(transfer.os, 'symlink', side_effect=OSError('Mocked error')): with self.assertRaises(transfer.SymlinkError): transfer.SymlinkAgent(src, target).transfer()
def test_symlink_folder_rmtree_fail(self): """Failing to remove existing folder should raise SymlinkError.""" src = self.rootdir target = self.targetdir with mock.patch.object(transfer.shutil, 'rmtree', side_effect=OSError('Mocked error')): with self.assertRaises(transfer.SymlinkError): transfer.SymlinkAgent(src, target).transfer()
def test_symlink_file_unlink_fail(self): """Failing to remove existing file should raise SymlinkError.""" src = self.rootdir target = os.path.join(self.targetdir, 'target-file') open(target, 'w').close() with mock.patch.object(transfer.os, 'unlink', side_effect=OSError('Mocked error')): with self.assertRaises(transfer.SymlinkError): transfer.SymlinkAgent(src, target).transfer()
def test_symlink_folder_not_overwrite(self): """Don't overwrite other existing paths.""" src = os.path.join(self.rootdir) target = os.path.join(self.targetdir) with mock.patch('taca.utils.transfer.os.path') as mockobj: mockobj.ismount.return_value = False mockobj.isfile.return_value = False mockobj.islink.return_value = False mockobj.isdir.return_value = False with self.assertRaises(transfer.SymlinkError): transfer.SymlinkAgent(src, target).transfer()
def test_symlink_folder4(self): """ Don't overwrite an existing path that is neither a mount point, file, link or directory """ src = os.path.join(self.rootdir) target = os.path.join(self.targetdir) with mock.patch('taca.utils.transfer.os.path') as mockobj: mockobj.ismount.return_value = False mockobj.isfile.return_value = False mockobj.islink.return_value = False mockobj.isdir.return_value = False with self.assertRaises(transfer.SymlinkError): transfer.SymlinkAgent(src, target).transfer()
def test_symlink_file_make_dir(self): """Symlink a single file into a non-existing folder.""" src = os.path.join(self.rootdir, 'folder0', 'folder1', 'file2') target = os.path.join(self.targetdir, 'these', 'folders', 'should', 'be', 'created') self.assertTrue(transfer.SymlinkAgent(src, target).transfer())
def test_symlink_folder2(self): """ Replace an existing folder with overwrite """ src = os.path.join(self.rootdir, "folder0") target = os.path.join(self.targetdir, os.path.basename(src)) shutil.copytree(src, target) self.assertTrue(transfer.SymlinkAgent(src, target).transfer())
def test_symlink_validate_transfer(self): """Verify that the dest_path was created.""" src = os.path.join(self.rootdir, 'file0') dst = os.path.join(self.targetdir, 'file0') os.symlink(src, dst) self.assertTrue(transfer.SymlinkAgent(src, dst).validate_transfer())
def test_symlink_folder1(self): """ Symlinking a top-level folder """ src = os.path.join(self.rootdir, "folder0") target = os.path.join(self.targetdir, os.path.basename(src)) self.assertTrue(transfer.SymlinkAgent(src, target).transfer())
def test_symlink_file5(self): """ Don't create a broken symlink """ src = os.path.join(self.rootdir, "non-existing-file") target = os.path.join(self.targetdir, os.path.basename(src)) with self.assertRaises(transfer.TransferError): transfer.SymlinkAgent(src, target).transfer()
def test_symlink_file_overwrite(self): """Replace an existing file with overwrite.""" src = os.path.join(self.rootdir, 'file0') target = os.path.join(self.targetdir, os.path.basename(src)) open(target, 'w').close() self.assertTrue(transfer.SymlinkAgent(src, target).transfer())
def test_symlink_file1(self): """ Symlink a single file in the top folder """ src = os.path.join(self.rootdir, "file0") target = os.path.join(self.targetdir, os.path.basename(src)) self.assertTrue(transfer.SymlinkAgent(src, target).transfer())
def test_symlink_validate_transfer(self): src = os.path.join(self.rootdir, "file0") dst = os.path.join(self.targetdir, "file0") os.symlink(src, dst) self.assertTrue(transfer.SymlinkAgent(src, dst).validate_transfer())