diff --git a/fdroidserver/build.py b/fdroidserver/build.py index 24a60344..06b93529 100644 --- a/fdroidserver/build.py +++ b/fdroidserver/build.py @@ -242,9 +242,6 @@ def vm_new_get_clean_builder(serverdir, reset=False): vm = vmtools.get_build_vm(serverdir) if reset: logging.info('resetting buildserver by request') - elif not vm.check_okay(): - logging.info('resetting buildserver because it appears to be absent or broken') - reset = True elif not vm.snapshot_exists('fdroidclean'): logging.info("resetting buildserver, because snapshot 'fdroidclean' is not present") reset = True @@ -259,7 +256,7 @@ def vm_new_get_clean_builder(serverdir, reset=False): vm.snapshot_create('fdroidclean') else: logging.info('builserver ok: reverting to clean snapshot') - vm.snapshot_revert('droidclean') + vm.snapshot_revert('fdroidclean') vm.up() return get_vagrant_sshinfo() diff --git a/fdroidserver/vmtools.py b/fdroidserver/vmtools.py index 4c1e5a30..578f888c 100644 --- a/fdroidserver/vmtools.py +++ b/fdroidserver/vmtools.py @@ -17,7 +17,7 @@ # along with this program. If not, see . from os import remove as rmfile -from os.path import isdir, isfile, join as joinpath, basename, abspath, expanduser +from os.path import isdir, isfile, join as joinpath, basename, abspath, expanduser, exists as pathexists import math import json import tarfile @@ -134,9 +134,6 @@ class FDroidBuildVm(): import vagrant self.vgrnt = vagrant.Vagrant(root=srvdir, out_cm=vagrant.stdout_cm, err_cm=vagrant.stdout_cm) - def check_okay(self): - return True - def up(self, provision=True): try: self.vgrnt.up(provision=provision) @@ -145,9 +142,6 @@ class FDroidBuildVm(): except subprocess.CalledProcessError as e: raise FDroidBuildVmException("could not bring up vm '%s'" % self.srvname) from e - def snapshot_create(self, name): - raise NotImplementedError('not implemented, please use a sub-type instance') - def suspend(self): logger.info('suspending buildserver') try: @@ -186,10 +180,6 @@ class FDroidBuildVm(): logger.debug('pruning global vagrant status failed: %s', e) def package(self, output=None, vagrantfile=None, keep_box_file=None): - previous_tmp_dir = joinpath(self.srvdir, '_tmp_package') - if isdir(previous_tmp_dir): - logger.info('found previous vagrant package temp dir \'%s\', deleting it', previous_tmp_dir) - shutil.rmtree(previous_tmp_dir) self.vgrnt.package(output=output, vagrantfile=vagrantfile) def _vagrant_file_name(self, name): @@ -219,10 +209,23 @@ class FDroidBuildVm(): boxname, boxpath) shutil.rmtree(boxpath) + def snapshot_create(self, snapshot_name): + raise NotImplementedError('not implemented, please use a sub-type instance') + + def snapshot_list(self): + raise NotImplementedError('not implemented, please use a sub-type instance') + + def snapshot_exists(self, snapshot_name): + raise NotImplementedError('not implemented, please use a sub-type instance') + + def snapshot_revert(self, snapshot_name): + raise NotImplementedError('not implemented, please use a sub-type instance') + class LibvirtBuildVm(FDroidBuildVm): def __init__(self, srvdir): super().__init__(srvdir) + self.provider = 'libvirt' import libvirt try: @@ -230,22 +233,6 @@ class LibvirtBuildVm(FDroidBuildVm): except libvirt.libvirtError as e: raise FDroidBuildVmException('could not connect to libvirtd: %s' % (e)) - def check_okay(self): - import libvirt - imagepath = joinpath('var', 'lib', 'libvirt', 'images', - '%s.img' % self._vagrant_file_name(self.srvname)) - image_present = False - if isfile(imagepath): - image_present = True - try: - self.conn.lookupByName(self.srvname) - domain_defined = True - except libvirt.libvirtError: - pass - if image_present and domain_defined: - return True - return False - def destroy(self): super().destroy() @@ -384,8 +371,13 @@ class LibvirtBuildVm(FDroidBuildVm): class VirtualboxBuildVm(FDroidBuildVm): + + def __init__(self, srvdir): + super().__init__(srvdir) + self.provider = 'virtualbox' + def snapshot_create(self, snapshot_name): - raise NotImplemented('TODO') + logger.info("creating snapshot '%s' for vm '%s'", snapshot_name, self.srvname) try: _check_call(['VBoxManage', 'snapshot', self.srvname, 'take', 'fdroidclean'], cwd=self.srvdir) logger.info('...waiting a sec...') @@ -395,5 +387,28 @@ class VirtualboxBuildVm(FDroidBuildVm): 'of virtualbox vm %s' % self.srvname) from e - def snapshot_available(self, snapshot_name): - raise NotImplemented('TODO') + def snapshot_list(self): + try: + o = _check_output(['VBoxManage', 'snapshot', + self.srvname, 'list', + '--details'], cwd=self.srvdir) + return o + except subprocess.CalledProcessError as e: + raise FDroidBuildVmException("could not list snapshots " + "of virtualbox vm '%s'" + % (self.srvname)) from e + + def snapshot_exists(self, snapshot_name): + return 'fdroidclean' in self.snapshot_list() + + def snapshot_revert(self, snapshot_name): + logger.info("reverting vm '%s' to snapshot '%s'", + self.srvname, snapshot_name) + try: + p = _check_call(['VBoxManage', 'snapshot', self.srvname, + 'restore', 'fdroidclean'], cwd=self.srvdir) + except subprocess.CalledProcessError as e: + raise FDroidBuildVmException("could not load snapshot " + "'fdroidclean' for vm '%s'" + % (self.srvname)) from e +