chiark / gitweb /
restart builder vm when ssh connection fails
authorMichael Pöhn <michael.poehn@fsfe.org>
Tue, 25 Apr 2017 12:45:41 +0000 (14:45 +0200)
committerHans-Christoph Steiner <hans@eds.org>
Tue, 23 May 2017 18:06:47 +0000 (20:06 +0200)
fdroidserver/build.py
fdroidserver/vmtools.py

index c146b95f935c64c1b06332ae3fbb8e0e262842ad..8f844a0633da76b6efa5a059048a7db15e0afd10 100644 (file)
@@ -41,6 +41,7 @@ from . import scanner
 from . import vmtools
 from .common import FDroidPopen, SdkToolsPopen
 from .exception import FDroidException, BuildException, VCSException
+from .vmtools import FDroidBuildVmException
 
 try:
     import paramiko
@@ -264,7 +265,16 @@ def vm_new_get_clean_builder(serverdir, reset=False):
         vm.snapshot_revert('fdroidclean')
     vm.up()
 
-    return get_vagrant_sshinfo()
+    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 vm_get_clean_builder(reset=False):
index ec28ed48c9587a076c55b611b42707311ec5c789..f48ea2d5f78d2f667250a28dda23284aea1b79a8 100644 (file)
@@ -236,6 +236,33 @@ class FDroidBuildVm():
                         boxname, boxpath)
             shutil.rmtree(boxpath)
 
+    def sshinfo(self):
+        """Get ssh connection info for a vagrant VM
+
+        :returns: A dictionary containing 'hostname', 'port', 'user'
+            and 'idfile'
+        """
+        import paramiko
+        try:
+            _check_call(['vagrant ssh-config > sshconfig'],
+                        cwd=self.srvdir, shell=True)
+            vagranthost = 'default'  # Host in ssh config file
+            sshconfig = paramiko.SSHConfig()
+            with open(joinpath(self.srvdir, 'sshconfig'), 'r') as f:
+                sshconfig.parse(f)
+            sshconfig = sshconfig.lookup(vagranthost)
+            idfile = sshconfig['identityfile']
+            if isinstance(idfile, list):
+                idfile = idfile[0]
+            elif idfile.startswith('"') and idfile.endswith('"'):
+                idfile = idfile[1:-1]
+            return {'hostname': sshconfig['hostname'],
+                    'port': int(sshconfig['port']),
+                    'user': sshconfig['user'],
+                    'idfile': idfile}
+        except subprocess.CalledProcessError as e:
+            raise FDroidBuildVmException("Error getting ssh config") from e
+
     def snapshot_create(self, snapshot_name):
         raise NotImplementedError('not implemented, please use a sub-type instance')