[elbe-devel] [PATCH 1/4] install_elbe_version: implement "elbe control install_elbe_version"
Manuel Traut
manut at linutronix.de
Wed Nov 7 10:03:01 CET 2018
On Mon, Oct 01, 2018 at 04:37:45PM +0200, Torben Hohn wrote:
> 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).
updating docs/elbe-control.txt is missing
> 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))
what about users needing a proxy?
> + 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
>
>
> _______________________________________________
> elbe-devel mailing list
> elbe-devel at linutronix.de
> https://lists.linutronix.de/mailman/listinfo/elbe-devel
More information about the elbe-devel
mailing list