1
0
mirror of https://gitlab.com/fdroid/fdroidserver.git synced 2024-09-18 19:20:08 +02:00

use uuid for vbox snapshots again

This commit is contained in:
Michael Pöhn 2017-04-12 22:06:21 +02:00 committed by Hans-Christoph Steiner
parent 358b00d7aa
commit 0ec5422952

View File

@ -17,7 +17,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
from os import remove as rmfile from os import remove as rmfile
from os.path import isdir, isfile, join as joinpath, basename, abspath, expanduser, exists as pathexists from os.path import isdir, isfile, join as joinpath, basename, abspath, expanduser
import math import math
import json import json
import tarfile import tarfile
@ -30,14 +30,14 @@ from logging import getLogger
logger = getLogger('fdroidserver-vmtools') logger = getLogger('fdroidserver-vmtools')
def _check_call(cmd, shell=False): def _check_call(cmd, shell=False, cwd=None):
logger.debug(' '.join(cmd)) logger.debug(' '.join(cmd))
return subprocess.check_call(cmd, shell=shell) return subprocess.check_call(cmd, shell=shell, cwd=cwd)
def _check_output(cmd, shell=False): def _check_output(cmd, shell=False, cwd=None):
logger.debug(' '.join(cmd)) logger.debug(' '.join(cmd))
return subprocess.check_output(cmd, shell=shell) return subprocess.check_output(cmd, shell=shell, cwd=cwd)
def get_build_vm(srvdir, provider=None): def get_build_vm(srvdir, provider=None):
@ -74,7 +74,7 @@ def get_build_vm(srvdir, provider=None):
except subprocess.CalledProcessError: except subprocess.CalledProcessError:
pass pass
try: try:
vbox_installed = 0 == _check_call(['which', 'VBoxHeadless'], shell=True) vbox_installed = 0 == _check_call(['which', 'VBoxHeadless'])
except subprocess.CalledProcessError: except subprocess.CalledProcessError:
vbox_installed = False vbox_installed = False
if kvm_installed and vbox_installed: if kvm_installed and vbox_installed:
@ -127,6 +127,7 @@ class FDroidBuildVm():
self.srvdir = srvdir self.srvdir = srvdir
self.srvname = basename(srvdir) + '_default' self.srvname = basename(srvdir) + '_default'
self.vgrntfile = joinpath(srvdir, 'Vagrantfile') self.vgrntfile = joinpath(srvdir, 'Vagrantfile')
self.srvuuid = self._vagrant_fetch_uuid()
if not isdir(srvdir): if not isdir(srvdir):
raise FDroidBuildVmException("Can not init vagrant, directory %s not present" % (srvdir)) raise FDroidBuildVmException("Can not init vagrant, directory %s not present" % (srvdir))
if not isfile(self.vgrntfile): if not isfile(self.vgrntfile):
@ -139,6 +140,7 @@ class FDroidBuildVm():
self.vgrnt.up(provision=provision) self.vgrnt.up(provision=provision)
logger.info('...waiting a sec...') logger.info('...waiting a sec...')
time.sleep(10) time.sleep(10)
self.srvuuid = self._vagrant_fetch_uuid()
except subprocess.CalledProcessError as e: except subprocess.CalledProcessError as e:
raise FDroidBuildVmException("could not bring up vm '%s'" % self.srvname) from e raise FDroidBuildVmException("could not bring up vm '%s'" % self.srvname) from e
@ -185,6 +187,25 @@ class FDroidBuildVm():
def _vagrant_file_name(self, name): def _vagrant_file_name(self, name):
return name.replace('/', '-VAGRANTSLASH-') return name.replace('/', '-VAGRANTSLASH-')
def _vagrant_fetch_uuid(self):
if isfile(joinpath(self.srvdir, '.vagrant')):
# Vagrant 1.0 - it's a json file...
with open(joinpath(self.srvdir, '.vagrant')) as f:
id = json.load(f)['active']['default']
logger.debug('vm uuid: %s', id)
return id
elif isfile(joinpath(self.srvdir, '.vagrant', 'machines',
'default', self.provider, 'id')):
# Vagrant 1.2 (and maybe 1.1?) it's a directory tree...
with open(joinpath(self.srvdir, '.vagrant', 'machines',
'default', self.provider, 'id')) as f:
id = f.read()
logger.debug('vm uuid: %s', id)
return id
else:
logger.debug('vm uuid is None')
return None
def box_add(self, boxname, boxfile, force=True): def box_add(self, boxname, boxfile, force=True):
"""Add vagrant box to vagrant. """Add vagrant box to vagrant.
@ -224,8 +245,8 @@ class FDroidBuildVm():
class LibvirtBuildVm(FDroidBuildVm): class LibvirtBuildVm(FDroidBuildVm):
def __init__(self, srvdir): def __init__(self, srvdir):
super().__init__(srvdir)
self.provider = 'libvirt' self.provider = 'libvirt'
super().__init__(srvdir)
import libvirt import libvirt
try: try:
@ -373,13 +394,13 @@ class LibvirtBuildVm(FDroidBuildVm):
class VirtualboxBuildVm(FDroidBuildVm): class VirtualboxBuildVm(FDroidBuildVm):
def __init__(self, srvdir): def __init__(self, srvdir):
super().__init__(srvdir)
self.provider = 'virtualbox' self.provider = 'virtualbox'
super().__init__(srvdir)
def snapshot_create(self, snapshot_name): def snapshot_create(self, snapshot_name):
logger.info("creating snapshot '%s' for vm '%s'", snapshot_name, self.srvname) logger.info("creating snapshot '%s' for vm '%s'", snapshot_name, self.srvname)
try: try:
_check_call(['VBoxManage', 'snapshot', self.srvname, 'take', 'fdroidclean'], cwd=self.srvdir) _check_call(['VBoxManage', 'snapshot', self.srvuuid, 'take', 'fdroidclean'], cwd=self.srvdir)
logger.info('...waiting a sec...') logger.info('...waiting a sec...')
time.sleep(10) time.sleep(10)
except subprocess.CalledProcessError as e: except subprocess.CalledProcessError as e:
@ -390,7 +411,7 @@ class VirtualboxBuildVm(FDroidBuildVm):
def snapshot_list(self): def snapshot_list(self):
try: try:
o = _check_output(['VBoxManage', 'snapshot', o = _check_output(['VBoxManage', 'snapshot',
self.srvname, 'list', self.srvuuid, 'list',
'--details'], cwd=self.srvdir) '--details'], cwd=self.srvdir)
return o return o
except subprocess.CalledProcessError as e: except subprocess.CalledProcessError as e:
@ -399,16 +420,18 @@ class VirtualboxBuildVm(FDroidBuildVm):
% (self.srvname)) from e % (self.srvname)) from e
def snapshot_exists(self, snapshot_name): def snapshot_exists(self, snapshot_name):
return 'fdroidclean' in self.snapshot_list() try:
return str(snapshot_name) in str(self.snapshot_list())
except FDroidBuildVmException:
return False
def snapshot_revert(self, snapshot_name): def snapshot_revert(self, snapshot_name):
logger.info("reverting vm '%s' to snapshot '%s'", logger.info("reverting vm '%s' to snapshot '%s'",
self.srvname, snapshot_name) self.srvname, snapshot_name)
try: try:
p = _check_call(['VBoxManage', 'snapshot', self.srvname, _check_call(['VBoxManage', 'snapshot', self.srvuuid,
'restore', 'fdroidclean'], cwd=self.srvdir) 'restore', 'fdroidclean'], cwd=self.srvdir)
except subprocess.CalledProcessError as e: except subprocess.CalledProcessError as e:
raise FDroidBuildVmException("could not load snapshot " raise FDroidBuildVmException("could not load snapshot "
"'fdroidclean' for vm '%s'" "'fdroidclean' for vm '%s'"
% (self.srvname)) from e % (self.srvname)) from e