From 8afde1e881020dd555a06dc01d5b4cfb1000dcd3 Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Wed, 2 Aug 2017 16:59:38 +0200 Subject: [PATCH] Return a error on update with own version (#124) Return a error on update with own version --- hassio/addons/addon.py | 38 +++++++++++++++++++---------- hassio/api/addons.py | 48 +++++++++++++++++++++++++------------ hassio/api/homeassistant.py | 15 ++++++------ hassio/api/host.py | 12 +++++++--- hassio/api/snapshots.py | 12 ++++++---- hassio/api/supervisor.py | 4 ++-- hassio/homeassistant.py | 14 ++++++----- 7 files changed, 92 insertions(+), 51 deletions(-) diff --git a/hassio/addons/addon.py b/hassio/addons/addon.py index cea570caa..f3bcb9f20 100644 --- a/hassio/addons/addon.py +++ b/hassio/addons/addon.py @@ -413,14 +413,20 @@ class Addon(object): return STATE_STOPPED @check_installed - async def start(self): - """Set options and start addon.""" - return await self.addon_docker.run() + def start(self): + """Set options and start addon. + + Return a coroutine. + """ + return self.addon_docker.run() @check_installed - async def stop(self): - """Stop addon.""" - return await self.addon_docker.stop() + def stop(self): + """Stop addon. + + Return a coroutine. + """ + return self.addon_docker.stop() @check_installed async def update(self, version=None): @@ -430,7 +436,7 @@ class Addon(object): if version == self.version_installed: _LOGGER.warning( "Addon %s is already installed in %s", self._id, version) - return True + return False if not await self.addon_docker.update(version): return False @@ -439,14 +445,20 @@ class Addon(object): return True @check_installed - async def restart(self): - """Restart addon.""" - return await self.addon_docker.restart() + def restart(self): + """Restart addon. + + Return a coroutine. + """ + return self.addon_docker.restart() @check_installed - async def logs(self): - """Return addons log output.""" - return await self.addon_docker.logs() + def logs(self): + """Return addons log output. + + Return a coroutine. + """ + return self.addon_docker.logs() @check_installed async def snapshot(self, tar_file): diff --git a/hassio/api/addons.py b/hassio/api/addons.py index f98a19098..33bc547a2 100644 --- a/hassio/api/addons.py +++ b/hassio/api/addons.py @@ -152,20 +152,26 @@ class APIAddons(object): """Install addon.""" body = await api_validate(SCHEMA_VERSION, request) addon = self._extract_addon(request, check_installed=False) - version = body.get(ATTR_VERSION) + version = body.get(ATTR_VERSION, addon.last_version) return await asyncio.shield( addon.install(version=version), loop=self.loop) @api_process - async def uninstall(self, request): - """Uninstall addon.""" + def uninstall(self, request): + """Uninstall addon. + + Return a coroutine. + """ addon = self._extract_addon(request) - return await asyncio.shield(addon.uninstall(), loop=self.loop) + return asyncio.shield(addon.uninstall(), loop=self.loop) @api_process - async def start(self, request): - """Start addon.""" + def start(self, request): + """Start addon. + + Return a coroutine. + """ addon = self._extract_addon(request) # check options @@ -175,33 +181,45 @@ class APIAddons(object): except vol.Invalid as ex: raise RuntimeError(humanize_error(options, ex)) from None - return await asyncio.shield(addon.start(), loop=self.loop) + return asyncio.shield(addon.start(), loop=self.loop) @api_process - async def stop(self, request): - """Stop addon.""" + def stop(self, request): + """Stop addon. + + Return a coroutine. + """ addon = self._extract_addon(request) - return await asyncio.shield(addon.stop(), loop=self.loop) + return asyncio.shield(addon.stop(), loop=self.loop) @api_process async def update(self, request): """Update addon.""" body = await api_validate(SCHEMA_VERSION, request) addon = self._extract_addon(request) - version = body.get(ATTR_VERSION) + version = body.get(ATTR_VERSION, addon.last_version) + + if version == addon.version_installed: + raise RuntimeError("Version %s is already in use", version) return await asyncio.shield( addon.update(version=version), loop=self.loop) @api_process - async def restart(self, request): - """Restart addon.""" + def restart(self, request): + """Restart addon. + + Return a coroutine. + """ addon = self._extract_addon(request) - return await asyncio.shield(addon.restart(), loop=self.loop) + return asyncio.shield(addon.restart(), loop=self.loop) @api_process_raw(CONTENT_TYPE_BINARY) def logs(self, request): - """Return logs from addon.""" + """Return logs from addon. + + Return a coroutine. + """ addon = self._extract_addon(request) return addon.logs() diff --git a/hassio/api/homeassistant.py b/hassio/api/homeassistant.py index 6910a920c..df2c55e3e 100644 --- a/hassio/api/homeassistant.py +++ b/hassio/api/homeassistant.py @@ -65,20 +65,19 @@ class APIHomeAssistant(object): body = await api_validate(SCHEMA_VERSION, request) version = body.get(ATTR_VERSION, self.config.last_homeassistant) - if self.homeassistant.in_progress: - raise RuntimeError("Other task is in progress") + if version == self.homeassistant.version: + raise RuntimeError("Version {} is already in use".format(version)) return await asyncio.shield( self.homeassistant.update(version), loop=self.loop) @api_process - async def restart(self, request): - """Restart homeassistant.""" - if self.homeassistant.in_progress: - raise RuntimeError("Other task is in progress") + def restart(self, request): + """Restart homeassistant. - return await asyncio.shield( - self.homeassistant.restart(), loop=self.loop) + Return a coroutine. + """ + return asyncio.shield(self.homeassistant.restart(), loop=self.loop) @api_process_raw(CONTENT_TYPE_BINARY) def logs(self, request): diff --git a/hassio/api/host.py b/hassio/api/host.py index 1ea2ad9ef..ceb960402 100644 --- a/hassio/api/host.py +++ b/hassio/api/host.py @@ -40,12 +40,18 @@ class APIHost(object): @api_process_hostcontrol def reboot(self, request): - """Reboot host.""" + """Reboot host. + + Return a coroutine. + """ return self.host_control.reboot() @api_process_hostcontrol def shutdown(self, request): - """Poweroff host.""" + """Poweroff host. + + Return a coroutine. + """ return self.host_control.shutdown() @api_process_hostcontrol @@ -55,7 +61,7 @@ class APIHost(object): version = body.get(ATTR_VERSION, self.host_control.last_version) if version == self.host_control.version: - raise RuntimeError("Version is already in use") + raise RuntimeError("Version {} is already in use".format(version)) return await asyncio.shield( self.host_control.update(version=version), loop=self.loop) diff --git a/hassio/api/snapshots.py b/hassio/api/snapshots.py index 494586fd3..42467acd2 100644 --- a/hassio/api/snapshots.py +++ b/hassio/api/snapshots.py @@ -111,10 +111,13 @@ class APISnapshots(object): self.snapshots.do_snapshot_partial(**body), loop=self.loop) @api_process - async def restore_full(self, request): - """Full-Restore a snapshot.""" + def restore_full(self, request): + """Full-Restore a snapshot. + + Return a coroutine. + """ snapshot = self._extract_snapshot(request) - return await asyncio.shield( + return asyncio.shield( self.snapshots.do_restore_full(snapshot), loop=self.loop) @api_process @@ -125,7 +128,8 @@ class APISnapshots(object): return await asyncio.shield( self.snapshots.do_restore_partial(snapshot, **body), - loop=self.loop) + loop=self.loop + ) @api_process async def remove(self, request): diff --git a/hassio/api/supervisor.py b/hassio/api/supervisor.py index 2fc8da802..2fd5c82e3 100644 --- a/hassio/api/supervisor.py +++ b/hassio/api/supervisor.py @@ -96,10 +96,10 @@ class APISupervisor(object): version = body.get(ATTR_VERSION, self.config.last_hassio) if version == self.supervisor.version: - raise RuntimeError("Version is already in use") + raise RuntimeError("Version {} is already in use".format(version)) return await asyncio.shield( - self.supervisor.update(version), loop=self.loop) + self.supervisor.update(version=version), loop=self.loop) @api_process async def reload(self, request): diff --git a/hassio/homeassistant.py b/hassio/homeassistant.py index 70bcf05c6..8f519b370 100644 --- a/hassio/homeassistant.py +++ b/hassio/homeassistant.py @@ -113,13 +113,15 @@ class HomeAssistant(JsonConfig): _LOGGER.info("HomeAssistant docker now installed") await self.docker.cleanup() - def update(self, version=None): - """Update HomeAssistant version. - - Return a coroutine. - """ + async def update(self, version=None): + """Update HomeAssistant version.""" version = version or self.last_version - return self.docker.update(version) + + if version == self.docker.version: + _LOGGER.warning("Version %s is already installed", version) + return False + + return await self.docker.update(version) def run(self): """Run HomeAssistant docker.