[elbe-devel] [PATCH 1/4] install_elbe_version: implement "elbe control install_elbe_version"

Torben Hohn torben.hohn at linutronix.de
Mon Oct 1 16:37:45 CEST 2018


when elbe on the hostmachine is upgraded, it usually can not talk
to the elbe version installed in the initvm.

add a command that can install a specific elbe version in the initvm.

since the elbe daemon will restart, we dont have a return code on the soap
interface. Maybe we want to sleep one second and check, whether
elbe daemon replies with the correct version, in
InstallElbeVersion(ClientAction).

Another weakness of this approach, is that we have to specify all
elbe related packages, or apt will refuse to install:

--------------------------------------------------------------------------
The following packages have unmet dependencies:
 elbe-soap : Depends: elbe-daemon (= 2.9.11~bpo8+build251) but it is not going to be installed
 python-elbe-common : Depends: elbe-schema (= 2.9.11~bpo8+build251) but 2.9.12+deb8+build311 is to be installed
                      Depends: python-elbe-bin (= 2.9.11~bpo8+build251) but it is not going to be installed
E: Unable to correct problems, you have held broken packages.
--------------------------------------------------------------------------

this is probably more of a problem, when a downgrade should be done.

Signed-off-by: Torben Hohn <torben.hohn at linutronix.de>
---
 elbepack/asyncworker.py        | 31 ++++++++++++++++++++++++++++++-
 elbepack/daemons/soap/esoap.py |  6 ++++++
 elbepack/projectmanager.py     |  7 ++++++-
 elbepack/soapclient.py         | 19 +++++++++++++++++++
 4 files changed, 61 insertions(+), 2 deletions(-)

diff --git a/elbepack/asyncworker.py b/elbepack/asyncworker.py
index 7f6173ba..c8826ffa 100644
--- a/elbepack/asyncworker.py
+++ b/elbepack/asyncworker.py
@@ -7,7 +7,7 @@
 
 from threading import Thread
 from Queue import Queue
-from os import path, getcwd, chdir
+from os import path, getcwd, chdir, system
 from contextlib import contextmanager
 from urllib import quote
 import traceback
@@ -18,6 +18,7 @@ from elbepack.updatepkg import gen_update_pkg
 from elbepack.pkgarchive import gen_binpkg_archive, checkout_binpkg_archive
 from elbepack.rfs import DebootstrapException
 from elbepack.elbeproject import AptCacheCommitError, AptCacheUpdateError
+from elbepack.filesystem import hostfs
 
 
 class AsyncWorkerJob(object):
@@ -375,6 +376,34 @@ class APTCommitJob(AsyncWorkerJob):
             db.reset_busy(self.project.builddir,
                           "build_failed")
 
+class InstallElbeVersionJob(AsyncWorkerJob):
+    def __init__(self, version):
+        AsyncWorkerJob.__init__(self, None)
+        self.version = version
+
+    def enqueue(self, queue, db):
+        AsyncWorkerJob.enqueue(self, queue, db)
+
+    def execute(self, db):
+        pkgs = ['python-elbe-buildenv',
+                'elbe-soap',
+                'python-elbe-common',
+                'elbe-daemon',
+                'elbe-schema',
+                'python-elbe-bin']
+
+        pkgs = ['"%s=%s*"' % (p, self.version) for p in pkgs]
+
+        # Prevent, that elbe daemon is restarted by the
+        # prerm/postinst scripts.
+        # elbe daemon does it itself, because cherrypy
+        # notices that.
+        hostfs.write_file("usr/sbin/policy-rc.d",
+                          0o755, "#!/bin/sh\nexit 101\n")
+
+        system('apt-get install -y --force-yes %s' % ' '.join(pkgs))
+
+        hostfs.remove('usr/sbin/policy-rc.d')
 
 class GenUpdateJob(AsyncWorkerJob):
     def __init__(self, project, base_version):
diff --git a/elbepack/daemons/soap/esoap.py b/elbepack/daemons/soap/esoap.py
index b973b592..1c62fa87 100644
--- a/elbepack/daemons/soap/esoap.py
+++ b/elbepack/daemons/soap/esoap.py
@@ -64,6 +64,12 @@ class ESoap (ServiceBase):
     def list_users(self):
         return [u.name for u in self.app.pm.db.list_users()]
 
+    @rpc(String)
+    @soap_faults
+    @authenticated_admin
+    def install_elbe_version(self, version):
+        self.app.pm.install_elbe_version(version)
+
     @rpc(String,String,String,String,Boolean)
     @soap_faults
     @authenticated_admin
diff --git a/elbepack/projectmanager.py b/elbepack/projectmanager.py
index e8613bca..3d2c018e 100644
--- a/elbepack/projectmanager.py
+++ b/elbepack/projectmanager.py
@@ -22,7 +22,8 @@ from elbepack.asyncworker import (AsyncWorker, BuildJob, APTUpdateJob,
                                   APTUpdUpgrJob, BuildSysrootJob,
                                   PdebuildJob, CreatePbuilderJob,
                                   UpdatePbuilderJob, BuildChrootTarJob,
-                                  BuildSDKJob, BuildCDROMsJob)
+                                  BuildSDKJob, BuildCDROMsJob,
+                                  InstallElbeVersionJob)
 
 from elbepack.elbexml import ValidationMode
 
@@ -537,6 +538,10 @@ class ProjectManager(object):
             logline = str(part) + '###' + str(logline)
             return self.db.is_busy(ep.builddir), logline
 
+    def install_elbe_version(self, version):
+        with self.lock:
+            self.worker.enqueue(InstallElbeVersionJob(version))
+
     def _get_current_project(self, userid, allow_busy=True):
         # Must be called with self.lock held
         if userid not in self.userid2project:
diff --git a/elbepack/soapclient.py b/elbepack/soapclient.py
index c7d822d3..30efece0 100644
--- a/elbepack/soapclient.py
+++ b/elbepack/soapclient.py
@@ -791,6 +791,25 @@ class UpdatePbuilderAction(ClientAction):
 
 ClientAction.register(UpdatePbuilderAction)
 
+class InstallElbeVersion(ClientAction):
+
+    tag = 'install_elbe_version'
+
+    def __init__(self, node):
+        ClientAction.__init__(self, node)
+
+    def execute(self, client, _opt, args):
+        if len(args) != 1:
+            print(
+                "usage: elbe control install_elbe_version <version>",
+                file=sys.stderr)
+            sys.exit(20)
+
+        version = args[0]
+        client.service.install_elbe_version(version)
+
+
+ClientAction.register(InstallElbeVersion)
 
 class RepoAction(ClientAction):
     repoactiondict = {}
-- 
2.11.0




More information about the elbe-devel mailing list