refactored vm related code from build.py to vmtools.py

This commit is contained in:
Michael Pöhn 2017-05-23 12:53:07 +02:00 committed by Hans-Christoph Steiner
parent fc660048eb
commit c8234919df
2 changed files with 54 additions and 56 deletions

View file

@ -28,7 +28,6 @@ import traceback
import time import time
import requests import requests
import tempfile import tempfile
import textwrap
from configparser import ConfigParser from configparser import ConfigParser
from argparse import ArgumentParser from argparse import ArgumentParser
import logging import logging
@ -40,7 +39,6 @@ from . import scanner
from . import vmtools from . import vmtools
from .common import FDroidPopen, SdkToolsPopen from .common import FDroidPopen, SdkToolsPopen
from .exception import FDroidException, BuildException, VCSException from .exception import FDroidException, BuildException, VCSException
from .vmtools import FDroidBuildVmException
try: try:
import paramiko import paramiko
@ -48,58 +46,6 @@ except ImportError:
pass pass
def vm_new_get_clean_builder(serverdir, reset=False):
if not os.path.isdir(serverdir):
if os.path.islink(serverdir):
os.unlink(serverdir)
logging.info("buildserver path does not exists, creating %s", serverdir)
os.makedirs(serverdir)
vagrantfile = os.path.join(serverdir, 'Vagrantfile')
if not os.path.isfile(vagrantfile):
with open(os.path.join('builder', 'Vagrantfile'), 'w') as f:
f.write(textwrap.dedent("""\
# generated file, do not change.
Vagrant.configure("2") do |config|
config.vm.box = "buildserver"
config.vm.synced_folder ".", "/vagrant", disabled: true
end
"""))
vm = vmtools.get_build_vm(serverdir)
if reset:
logging.info('resetting buildserver by request')
elif not vm.vagrant_uuid_okay():
logging.info('resetting buildserver, bceause vagrant vm is not okay.')
reset = True
elif not vm.snapshot_exists('fdroidclean'):
logging.info("resetting buildserver, because snapshot 'fdroidclean' is not present.")
reset = True
if reset:
vm.destroy()
vm.up()
vm.suspend()
if reset:
logging.info('buildserver recreated: taking a clean snapshot')
vm.snapshot_create('fdroidclean')
else:
logging.info('builserver ok: reverting to clean snapshot')
vm.snapshot_revert('fdroidclean')
vm.up()
try:
sshinfo = vm.sshinfo()
except FDroidBuildVmException:
# workaround because libvirt sometimes likes to forget
# about ssh connection info even thou the vm is running
vm.halt()
vm.up()
sshinfo = vm.sshinfo()
return sshinfo
# Note that 'force' here also implies test mode. # Note that 'force' here also implies test mode.
def build_server(app, build, vcs, build_dir, output_dir, log_dir, force): def build_server(app, build, vcs, build_dir, output_dir, log_dir, force):
"""Do a build on the builder vm. """Do a build on the builder vm.
@ -123,8 +69,7 @@ def build_server(app, build, vcs, build_dir, output_dir, log_dir, force):
else: else:
logging.getLogger("paramiko").setLevel(logging.WARN) logging.getLogger("paramiko").setLevel(logging.WARN)
# sshinfo = vm_get_clean_builder() sshinfo = vmtools.get_clean_builder('builder')
sshinfo = vm_new_get_clean_builder('builder')
try: try:
if not buildserverid: if not buildserverid:

View file

@ -18,6 +18,7 @@
from os import remove as rmfile 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
import os
import math import math
import json import json
import tarfile import tarfile
@ -31,6 +32,58 @@ from logging import getLogger
logger = getLogger('fdroidserver-vmtools') logger = getLogger('fdroidserver-vmtools')
def get_clean_builder(serverdir, reset=False):
if not os.path.isdir(serverdir):
if os.path.islink(serverdir):
os.unlink(serverdir)
logger.info("buildserver path does not exists, creating %s", serverdir)
os.makedirs(serverdir)
vagrantfile = os.path.join(serverdir, 'Vagrantfile')
if not os.path.isfile(vagrantfile):
with open(os.path.join('builder', 'Vagrantfile'), 'w') as f:
f.write(textwrap.dedent("""\
# generated file, do not change.
Vagrant.configure("2") do |config|
config.vm.box = "buildserver"
config.vm.synced_folder ".", "/vagrant", disabled: true
end
"""))
vm = get_build_vm(serverdir)
if reset:
logger.info('resetting buildserver by request')
elif not vm.vagrant_uuid_okay():
logger.info('resetting buildserver, bceause vagrant vm is not okay.')
reset = True
elif not vm.snapshot_exists('fdroidclean'):
logger.info("resetting buildserver, because snapshot 'fdroidclean' is not present.")
reset = True
if reset:
vm.destroy()
vm.up()
vm.suspend()
if reset:
logger.info('buildserver recreated: taking a clean snapshot')
vm.snapshot_create('fdroidclean')
else:
logger.info('builserver ok: reverting to clean snapshot')
vm.snapshot_revert('fdroidclean')
vm.up()
try:
sshinfo = vm.sshinfo()
except FDroidBuildVmException:
# workaround because libvirt sometimes likes to forget
# about ssh connection info even thou the vm is running
vm.halt()
vm.up()
sshinfo = vm.sshinfo()
return sshinfo
def _check_call(cmd, shell=False, cwd=None): def _check_call(cmd, shell=False, cwd=None):
logger.debug(' '.join(cmd)) logger.debug(' '.join(cmd))
return subprocess.check_call(cmd, shell=shell, cwd=cwd) return subprocess.check_call(cmd, shell=shell, cwd=cwd)