Return a error on update with own version (#124)

Return a error on update with own version
This commit is contained in:
Pascal Vizeli 2017-08-02 16:59:38 +02:00 committed by GitHub
parent 3809f20c6a
commit 8afde1e881
7 changed files with 92 additions and 51 deletions

View File

@ -413,14 +413,20 @@ class Addon(object):
return STATE_STOPPED return STATE_STOPPED
@check_installed @check_installed
async def start(self): def start(self):
"""Set options and start addon.""" """Set options and start addon.
return await self.addon_docker.run()
Return a coroutine.
"""
return self.addon_docker.run()
@check_installed @check_installed
async def stop(self): def stop(self):
"""Stop addon.""" """Stop addon.
return await self.addon_docker.stop()
Return a coroutine.
"""
return self.addon_docker.stop()
@check_installed @check_installed
async def update(self, version=None): async def update(self, version=None):
@ -430,7 +436,7 @@ class Addon(object):
if version == self.version_installed: if version == self.version_installed:
_LOGGER.warning( _LOGGER.warning(
"Addon %s is already installed in %s", self._id, version) "Addon %s is already installed in %s", self._id, version)
return True return False
if not await self.addon_docker.update(version): if not await self.addon_docker.update(version):
return False return False
@ -439,14 +445,20 @@ class Addon(object):
return True return True
@check_installed @check_installed
async def restart(self): def restart(self):
"""Restart addon.""" """Restart addon.
return await self.addon_docker.restart()
Return a coroutine.
"""
return self.addon_docker.restart()
@check_installed @check_installed
async def logs(self): def logs(self):
"""Return addons log output.""" """Return addons log output.
return await self.addon_docker.logs()
Return a coroutine.
"""
return self.addon_docker.logs()
@check_installed @check_installed
async def snapshot(self, tar_file): async def snapshot(self, tar_file):

View File

@ -152,20 +152,26 @@ class APIAddons(object):
"""Install addon.""" """Install addon."""
body = await api_validate(SCHEMA_VERSION, request) body = await api_validate(SCHEMA_VERSION, request)
addon = self._extract_addon(request, check_installed=False) 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( return await asyncio.shield(
addon.install(version=version), loop=self.loop) addon.install(version=version), loop=self.loop)
@api_process @api_process
async def uninstall(self, request): def uninstall(self, request):
"""Uninstall addon.""" """Uninstall addon.
Return a coroutine.
"""
addon = self._extract_addon(request) addon = self._extract_addon(request)
return await asyncio.shield(addon.uninstall(), loop=self.loop) return asyncio.shield(addon.uninstall(), loop=self.loop)
@api_process @api_process
async def start(self, request): def start(self, request):
"""Start addon.""" """Start addon.
Return a coroutine.
"""
addon = self._extract_addon(request) addon = self._extract_addon(request)
# check options # check options
@ -175,33 +181,45 @@ class APIAddons(object):
except vol.Invalid as ex: except vol.Invalid as ex:
raise RuntimeError(humanize_error(options, ex)) from None 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 @api_process
async def stop(self, request): def stop(self, request):
"""Stop addon.""" """Stop addon.
Return a coroutine.
"""
addon = self._extract_addon(request) addon = self._extract_addon(request)
return await asyncio.shield(addon.stop(), loop=self.loop) return asyncio.shield(addon.stop(), loop=self.loop)
@api_process @api_process
async def update(self, request): async def update(self, request):
"""Update addon.""" """Update addon."""
body = await api_validate(SCHEMA_VERSION, request) body = await api_validate(SCHEMA_VERSION, request)
addon = self._extract_addon(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( return await asyncio.shield(
addon.update(version=version), loop=self.loop) addon.update(version=version), loop=self.loop)
@api_process @api_process
async def restart(self, request): def restart(self, request):
"""Restart addon.""" """Restart addon.
Return a coroutine.
"""
addon = self._extract_addon(request) 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) @api_process_raw(CONTENT_TYPE_BINARY)
def logs(self, request): def logs(self, request):
"""Return logs from addon.""" """Return logs from addon.
Return a coroutine.
"""
addon = self._extract_addon(request) addon = self._extract_addon(request)
return addon.logs() return addon.logs()

View File

@ -65,20 +65,19 @@ class APIHomeAssistant(object):
body = await api_validate(SCHEMA_VERSION, request) body = await api_validate(SCHEMA_VERSION, request)
version = body.get(ATTR_VERSION, self.config.last_homeassistant) version = body.get(ATTR_VERSION, self.config.last_homeassistant)
if self.homeassistant.in_progress: if version == self.homeassistant.version:
raise RuntimeError("Other task is in progress") raise RuntimeError("Version {} is already in use".format(version))
return await asyncio.shield( return await asyncio.shield(
self.homeassistant.update(version), loop=self.loop) self.homeassistant.update(version), loop=self.loop)
@api_process @api_process
async def restart(self, request): def restart(self, request):
"""Restart homeassistant.""" """Restart homeassistant.
if self.homeassistant.in_progress:
raise RuntimeError("Other task is in progress")
return await asyncio.shield( Return a coroutine.
self.homeassistant.restart(), loop=self.loop) """
return asyncio.shield(self.homeassistant.restart(), loop=self.loop)
@api_process_raw(CONTENT_TYPE_BINARY) @api_process_raw(CONTENT_TYPE_BINARY)
def logs(self, request): def logs(self, request):

View File

@ -40,12 +40,18 @@ class APIHost(object):
@api_process_hostcontrol @api_process_hostcontrol
def reboot(self, request): def reboot(self, request):
"""Reboot host.""" """Reboot host.
Return a coroutine.
"""
return self.host_control.reboot() return self.host_control.reboot()
@api_process_hostcontrol @api_process_hostcontrol
def shutdown(self, request): def shutdown(self, request):
"""Poweroff host.""" """Poweroff host.
Return a coroutine.
"""
return self.host_control.shutdown() return self.host_control.shutdown()
@api_process_hostcontrol @api_process_hostcontrol
@ -55,7 +61,7 @@ class APIHost(object):
version = body.get(ATTR_VERSION, self.host_control.last_version) version = body.get(ATTR_VERSION, self.host_control.last_version)
if version == self.host_control.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( return await asyncio.shield(
self.host_control.update(version=version), loop=self.loop) self.host_control.update(version=version), loop=self.loop)

View File

@ -111,10 +111,13 @@ class APISnapshots(object):
self.snapshots.do_snapshot_partial(**body), loop=self.loop) self.snapshots.do_snapshot_partial(**body), loop=self.loop)
@api_process @api_process
async def restore_full(self, request): def restore_full(self, request):
"""Full-Restore a snapshot.""" """Full-Restore a snapshot.
Return a coroutine.
"""
snapshot = self._extract_snapshot(request) snapshot = self._extract_snapshot(request)
return await asyncio.shield( return asyncio.shield(
self.snapshots.do_restore_full(snapshot), loop=self.loop) self.snapshots.do_restore_full(snapshot), loop=self.loop)
@api_process @api_process
@ -125,7 +128,8 @@ class APISnapshots(object):
return await asyncio.shield( return await asyncio.shield(
self.snapshots.do_restore_partial(snapshot, **body), self.snapshots.do_restore_partial(snapshot, **body),
loop=self.loop) loop=self.loop
)
@api_process @api_process
async def remove(self, request): async def remove(self, request):

View File

@ -96,10 +96,10 @@ class APISupervisor(object):
version = body.get(ATTR_VERSION, self.config.last_hassio) version = body.get(ATTR_VERSION, self.config.last_hassio)
if version == self.supervisor.version: 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( return await asyncio.shield(
self.supervisor.update(version), loop=self.loop) self.supervisor.update(version=version), loop=self.loop)
@api_process @api_process
async def reload(self, request): async def reload(self, request):

View File

@ -113,13 +113,15 @@ class HomeAssistant(JsonConfig):
_LOGGER.info("HomeAssistant docker now installed") _LOGGER.info("HomeAssistant docker now installed")
await self.docker.cleanup() await self.docker.cleanup()
def update(self, version=None): async def update(self, version=None):
"""Update HomeAssistant version. """Update HomeAssistant version."""
Return a coroutine.
"""
version = version or self.last_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): def run(self):
"""Run HomeAssistant docker. """Run HomeAssistant docker.