[elbe-devel] [PATCH 1/4] install_elbe_version: implement "elbe control install_elbe_version"
Torben Hohn
torben.hohn at linutronix.de
Thu Nov 22 13:14:05 CET 2018
On Fri, Nov 16, 2018 at 10:04:09AM +0100, Manuel Traut wrote:
> On Mon, Nov 12, 2018 at 09:23:11AM +0100, Torben Hohn wrote:
> > On Wed, Nov 07, 2018 at 10:03:01AM +0100, Manuel Traut wrote:
> > > 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).
> >
> > Can you please make a statement regarding this pragraph ?
>
> I didn't reply because i don't have a better solution. So go on with this.
>
> > How shall we handle the missing return code on the soap
> > intrerface ?
>
> Ignore it.
>
> > What shall we do with downgrades ?
>
> What's the problem with downgrades? Don't they work the same way?
if the version we downgrade to, consists of less pkgs than
the current version, there will be a problem with the package that
we dont know about.
Not sure... mayb it works.
>
> > Shall we pass the list of required packages into the function call ?
> > I mean we only want to sync the outside version into the initvm.
> > The outside version can know the package list.
>
> You could ckeck if aptitude is able to resolve the dependencies automatically
> (and correctly). If not, this seems to be an acceptable approach to me.
aptitude can do it, but its the 3rd solution.
I dont know, how i can pick solutions via commandline. Dont think thats possible.
----------------------------------------------------------------------------
root at elbe-daemon:~# aptitude install elbe-daemon=2.9.13+deb8+build371
The following packages will be upgraded:
elbe-daemon{b}
1 packages upgraded, 0 newly installed, 0 to remove and 5 not upgraded.
Need to get 0 B/20.3 kB of archives. After unpacking 0 B will be used.
The following packages have unmet dependencies:
elbe-daemon : Depends: python-elbe-common (= 2.9.13+deb8+build371) but 2.9.13+deb8+build361 is installed and it is kept back.
Depends: python-elbe-buildenv (= 2.9.13+deb8+build371) but 2.9.13+deb8+build361 is installed and it is kept back.
elbe-soap : Depends: elbe-daemon (= 2.9.13+deb8+build361) but 2.9.13+deb8+build371 is to be installed.
open: 802; closed: 71; defer: 735; conflict: 719 .The following actions will resolve these dependencies:
Remove the following packages:
1) elbe-daemon
2) elbe-soap
Accept this solution? [Y/n/q/?] n
The following actions will resolve these dependencies:
Keep the following packages at their current version:
1) elbe-daemon [2.9.13+deb8+build361 (jessie, now)]
Accept this solution? [Y/n/q/?] n
The following actions will resolve these dependencies:
Upgrade the following packages:
1) elbe-schema [2.9.13+deb8+build361 (jessie, now) -> 2.9.13+deb8+build371 (jessie)]
2) elbe-soap [2.9.13+deb8+build361 (jessie, now) -> 2.9.13+deb8+build371 (jessie)]
3) python-elbe-bin [2.9.13+deb8+build361 (jessie, now) -> 2.9.13+deb8+build371 (jessie)]
4) python-elbe-buildenv [2.9.13+deb8+build361 (jessie, now) -> 2.9.13+deb8+build371 (jessie)]
5) python-elbe-common [2.9.13+deb8+build361 (jessie, now) -> 2.9.13+deb8+build371 (jessie)]
Accept this solution? [Y/n/q/?]
----------------------------------------------------------------------------
>
> > > updating docs/elbe-control.txt is missing
> >
> > I will add that in V2 when we decide, that we want to use this
> > approach.
> >
> > I believe, that the proxy settings of the initvm will be used.
> > IIRC the settings from the debian installer will end up in
> > /etc/apt/config.d/ somewhere.
>
> OK.
>
> > >
> > > > 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
> >
> > --
> > Torben Hohn
> > Linutronix GmbH | Bahnhofstrasse 3 | D-88690 Uhldingen-Mühlhofen
> > Phone: +49 7556 25 999 18; Fax.: +49 7556 25 999 99
> >
> > Hinweise zum Datenschutz finden Sie hier (Informations on data privacy
> > can be found here): https://linutronix.de/kontakt/Datenschutz.php
> >
> > Linutronix GmbH | Firmensitz (Registered Office): Uhldingen-Mühlhofen |
> > Registergericht (Registration Court): Amtsgericht Freiburg i.Br., HRB700
> > 806 | Geschäftsführer (Managing Directors): Heinz Egger, Thomas Gleixner
>
>
--
Torben Hohn
Linutronix GmbH | Bahnhofstrasse 3 | D-88690 Uhldingen-Mühlhofen
Phone: +49 7556 25 999 18; Fax.: +49 7556 25 999 99
Hinweise zum Datenschutz finden Sie hier (Informations on data privacy
can be found here): https://linutronix.de/kontakt/Datenschutz.php
Linutronix GmbH | Firmensitz (Registered Office): Uhldingen-Mühlhofen |
Registergericht (Registration Court): Amtsgericht Freiburg i.Br., HRB700
806 | Geschäftsführer (Managing Directors): Heinz Egger, Thomas Gleixner
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://lists.linutronix.de/pipermail/elbe-devel/attachments/20181122/94d1ab73/attachment.sig>
More information about the elbe-devel
mailing list