buildroot: ability to register api endpoints
Add a new `register_api` method that is meant to be used by clients to register API end point providers, i.e. instances of `api.BaseAPI`. When the context of the `BuildRoot` is enter, all providers are activated, i.e. their context is entered. In case `regsiter_api` is called with an already active context, the provider will immediately be activated. In both cases their lifetime is thus bound to the context of the `BuildRoot`. This also means that they are cleaned-up with the `BuildRoot`, i.e. when its context is exited.
This commit is contained in:
parent
38e714f229
commit
03c5cfb37e
1 changed files with 16 additions and 0 deletions
|
|
@ -40,6 +40,7 @@ class BuildRoot(contextlib.AbstractContextManager):
|
||||||
self._vardir = var
|
self._vardir = var
|
||||||
self._libdir = libdir
|
self._libdir = libdir
|
||||||
self._runner = runner
|
self._runner = runner
|
||||||
|
self._apis = []
|
||||||
self.api = None
|
self.api = None
|
||||||
self.dev = None
|
self.dev = None
|
||||||
self.var = None
|
self.var = None
|
||||||
|
|
@ -92,6 +93,10 @@ class BuildRoot(contextlib.AbstractContextManager):
|
||||||
self._mknod(self.dev, "tty", 0o666, 5, 0)
|
self._mknod(self.dev, "tty", 0o666, 5, 0)
|
||||||
self._mknod(self.dev, "zero", 0o666, 1, 5)
|
self._mknod(self.dev, "zero", 0o666, 1, 5)
|
||||||
|
|
||||||
|
# Prepare all registered API endpoints
|
||||||
|
for api in self._apis:
|
||||||
|
self._exitstack.enter_context(api)
|
||||||
|
|
||||||
self._exitstack = self._exitstack.pop_all()
|
self._exitstack = self._exitstack.pop_all()
|
||||||
|
|
||||||
return self
|
return self
|
||||||
|
|
@ -100,6 +105,17 @@ class BuildRoot(contextlib.AbstractContextManager):
|
||||||
self._exitstack.close()
|
self._exitstack.close()
|
||||||
self._exitstack = None
|
self._exitstack = None
|
||||||
|
|
||||||
|
def register_api(self, api: "BaseAPI"):
|
||||||
|
"""Register an API endpoint.
|
||||||
|
|
||||||
|
The context of the API endpoint will be bound to the context of
|
||||||
|
this `BuildRoot`.
|
||||||
|
"""
|
||||||
|
self._apis.append(api)
|
||||||
|
|
||||||
|
if self._exitstack:
|
||||||
|
self._exitstack.enter_context(api)
|
||||||
|
|
||||||
def run(self, argv, binds=None, readonly_binds=None):
|
def run(self, argv, binds=None, readonly_binds=None):
|
||||||
"""Runs a command in the buildroot.
|
"""Runs a command in the buildroot.
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue