On Wed, 2011-06-29 at 03:08 -0400, Cleber Rosa wrote: > The save_build() has a rather specific name, but its purpose is really > general in nature: to archive a given directory (build dir) as a tarball > file somewhere (dest_dir). > > This patch: > * Renames save_build() to archive_as_tarball() > * Moves it to virt_utils > * Adds more flexiblity with regards to naming the tarball > * Adds more flexiblity with regards to compression > * Avoids using external 'tar' command by using 'tarfile' module > * Adds more unittests
Applied, thanks: http://autotest.kernel.org/changeset/5469 > Signed-off-by: Cleber Rosa <[email protected]> > --- > client/virt/kvm_installer.py | 8 ++-- > client/virt/virt_installer.py | 9 ----- > client/virt/virt_utils.py | 64 > +++++++++++++++++++++++++++++++++++- > client/virt/virt_utils_unittest.py | 21 ++++++++++++ > 4 files changed, 88 insertions(+), 14 deletions(-) > > diff --git a/client/virt/kvm_installer.py b/client/virt/kvm_installer.py > index 2dca976..e79c9fc 100644 > --- a/client/virt/kvm_installer.py > +++ b/client/virt/kvm_installer.py > @@ -347,7 +347,7 @@ class YumInstaller(BaseInstaller): > unittest=self.unittest_prefix) > self.reload_modules_if_needed() > if self.save_results: > - virt_installer.save_build(self.srcdir, self.results_dir) > + virt_utils.archive_as_tarball(self.srcdir, self.results_dir) > > > class KojiInstaller(YumInstaller): > @@ -403,7 +403,7 @@ class KojiInstaller(YumInstaller): > unittest=self.unittest_prefix) > self.reload_modules_if_needed() > if self.save_results: > - virt_installer.save_build(self.srcdir, self.results_dir) > + virt_utils.archive_as_tarball(self.srcdir, self.results_dir) > > > def _get_rpm_names(self): > @@ -565,7 +565,7 @@ class SourceDirInstaller(BaseInstaller): > self._install() > self.reload_modules_if_needed() > if self.save_results: > - virt_installer.save_build(self.srcdir, self.results_dir) > + virt_utils.archive_as_tarball(self.srcdir, self.results_dir) > > class GitRepo(object): > def __init__(self, installer, prefix, > @@ -717,7 +717,7 @@ class GitInstaller(SourceDirInstaller): > self._install() > self.reload_modules_if_needed() > if self.save_results: > - virt_installer.save_build(self.srcdir, self.results_dir) > + virt_utils.archive_as_tarball(self.srcdir, self.results_dir) > > > class PreInstalledKvm(BaseInstaller): > diff --git a/client/virt/virt_installer.py b/client/virt/virt_installer.py > index 5ee128c..49d277e 100644 > --- a/client/virt/virt_installer.py > +++ b/client/virt/virt_installer.py > @@ -21,12 +21,3 @@ def check_configure_options(script_path): > option_list.append(option) > > return option_list > - > - > -def save_build(build_dir, dest_dir): > - logging.debug('Saving the result of the build on %s', dest_dir) > - base_name = os.path.basename(build_dir) > - tarball_name = base_name + '.tar.bz2' > - os.chdir(os.path.dirname(build_dir)) > - utils.system('tar -cjf %s %s' % (tarball_name, base_name)) > - shutil.move(tarball_name, os.path.join(dest_dir, tarball_name)) > diff --git a/client/virt/virt_utils.py b/client/virt/virt_utils.py > index 6da9a49..89a1193 100644 > --- a/client/virt/virt_utils.py > +++ b/client/virt/virt_utils.py > @@ -5,7 +5,7 @@ KVM test utility functions. > """ > > import time, string, random, socket, os, signal, re, logging, commands, > cPickle > -import fcntl, shelve, ConfigParser, threading, sys, UserDict, inspect > +import fcntl, shelve, ConfigParser, threading, sys, UserDict, inspect, > tarfile > import struct > from autotest_lib.client.bin import utils, os_dep > from autotest_lib.client.common_lib import error, logging_config > @@ -1330,6 +1330,68 @@ def get_cpu_vendor(cpu_flags=[], verbose=True): > return vendor > > > +def get_archive_tarball_name(source_dir, tarball_name, compression): > + ''' > + Get the name for a tarball file, based on source, name and compression > + ''' > + if tarball_name is None: > + tarball_name = os.path.basename(source_dir) > + > + if not tarball_name.endswith('.tar'): > + tarball_name = '%s.tar' % tarball_name > + > + if compression and not tarball_name.endswith('.%s' % compression): > + tarball_name = '%s.%s' % (tarball_name, compression) > + > + return tarball_name > + > + > +def archive_as_tarball(source_dir, dest_dir, tarball_name=None, > + compression='bz2', verbose=True): > + ''' > + Saves the given source directory to the given destination as a tarball > + > + If the name of the archive is omitted, it will be taken from the > + source_dir. If it is an absolute path, dest_dir will be ignored. But, > + if both the destination directory and tarball anem is given, and the > + latter is not an absolute path, they will be combined. > + > + For archiving directory '/tmp' in '/net/server/backup' as file > + 'tmp.tar.bz2', simply use: > + > + >>> virt_utils.archive_as_tarball('/tmp', '/net/server/backup') > + > + To save the file it with a different name, say 'host1-tmp.tar.bz2' > + and save it under '/net/server/backup', use: > + > + >>> virt_utils.archive_as_tarball('/tmp', '/net/server/backup', > + 'host1-tmp') > + > + To save with gzip compression instead (resulting in the file > + '/net/server/backup/host1-tmp.tar.gz'), use: > + > + >>> virt_utils.archive_as_tarball('/tmp', '/net/server/backup', > + 'host1-tmp', 'gz') > + ''' > + tarball_name = get_archive_tarball_name(source_dir, > + tarball_name, > + compression) > + if not os.path.isabs(tarball_name): > + tarball_path = os.path.join(dest_dir, tarball_name) > + else: > + tarball_path = tarball_name > + > + if verbose: > + logging.debug('Archiving %s as %s' % (source_dir, > + tarball_path)) > + > + os.chdir(os.path.dirname(source_dir)) > + tarball = tarfile.TarFile(name=tarball_path, mode='w') > + tarball = tarball.open(name=tarball_path, mode='w:%s' % compression) > + tarball.add(os.path.basename(source_dir)) > + tarball.close() > + > + > class Thread(threading.Thread): > """ > Run a function in a background thread. > diff --git a/client/virt/virt_utils_unittest.py > b/client/virt/virt_utils_unittest.py > index 8158ac3..9a2c417 100755 > --- a/client/virt/virt_utils_unittest.py > +++ b/client/virt/virt_utils_unittest.py > @@ -43,5 +43,26 @@ class virt_utils_test(unittest.TestCase): > self.assertEqual(vendor, 'unknown') > > > + def test_get_archive_tarball_name(self): > + tarball_name = virt_utils.get_archive_tarball_name('/tmp', > + 'tmp-archive', > + 'bz2') > + self.assertEqual(tarball_name, 'tmp-archive.tar.bz2') > + > + > + def test_get_archive_tarball_name_absolute(self): > + tarball_name = virt_utils.get_archive_tarball_name('/tmp', > + '/var/tmp/tmp', > + 'bz2') > + self.assertEqual(tarball_name, '/var/tmp/tmp.tar.bz2') > + > + > + def test_get_archive_tarball_name_from_dir(self): > + tarball_name = virt_utils.get_archive_tarball_name('/tmp', > + None, > + 'bz2') > + self.assertEqual(tarball_name, 'tmp.tar.bz2') > + > + > if __name__ == '__main__': > unittest.main() _______________________________________________ Autotest mailing list [email protected] http://test.kernel.org/cgi-bin/mailman/listinfo/autotest
