From f9b12a2eb25d7de64b1a2ba1ad3dab6a27128e8f Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Sat, 19 Aug 2017 22:44:39 +0200 Subject: [PATCH] Allow rebuild for local build addons (#158) * Allow rebuild for local build addons * fix lint --- API.md | 4 ++++ hassio/addons/addon.py | 21 +++++++++++++++++++++ hassio/api/__init__.py | 2 ++ hassio/api/addons.py | 6 ++++++ 4 files changed, 33 insertions(+) diff --git a/API.md b/API.md index 08aa71395..b2d05a818 100644 --- a/API.md +++ b/API.md @@ -435,6 +435,10 @@ Output is the raw Docker log. - POST `/addons/{addon}/restart` +- POST `/addons/{addon}/rebuild` + +Only supported for local build addons + ## Host Control Communicate over UNIX socket with a host daemon. diff --git a/hassio/addons/addon.py b/hassio/addons/addon.py index 2fc9b643e..1a5666bc8 100644 --- a/hassio/addons/addon.py +++ b/hassio/addons/addon.py @@ -518,6 +518,27 @@ class Addon(object): """ return self.docker.logs() + @check_installed + async def rebuild(self): + """Performe a rebuild of local build addon.""" + last_state = await self.state() + + if not self.need_build: + _LOGGER.error("Can't rebuild a none local build addon!") + return False + + # remove docker container but not addon config + if not await self.docker.remove(): + return False + + if not await self.docker.install(self.version_installed): + return False + + # restore state + if last_state == STATE_STARTED: + await self.docker.run() + return True + @check_installed async def snapshot(self, tar_file): """Snapshot a state of a addon.""" diff --git a/hassio/api/__init__.py b/hassio/api/__init__.py index 645a4fca4..6323d8785 100644 --- a/hassio/api/__init__.py +++ b/hassio/api/__init__.py @@ -94,6 +94,8 @@ class RestAPI(object): '/addons/{addon}/update', api_addons.update) self.webapp.router.add_post( '/addons/{addon}/options', api_addons.options) + self.webapp.router.add_post( + '/addons/{addon}/rebuild', api_addons.rebuild) self.webapp.router.add_get('/addons/{addon}/logs', api_addons.logs) self.webapp.router.add_get('/addons/{addon}/logo', api_addons.logo) diff --git a/hassio/api/addons.py b/hassio/api/addons.py index b0dc165f9..c73891d19 100644 --- a/hassio/api/addons.py +++ b/hassio/api/addons.py @@ -213,6 +213,12 @@ class APIAddons(object): addon = self._extract_addon(request) return asyncio.shield(addon.restart(), loop=self.loop) + @api_process + def rebuild(self, request): + """Rebuild local build addon.""" + addon = self._extract_addon(request) + return asyncio.shield(addon.rebuild(), loop=self.loop) + @api_process_raw(CONTENT_TYPE_BINARY) def logs(self, request): """Return logs from addon."""