Add restart support to homeassistant and add-ons (#37)

This commit is contained in:
Pascal Vizeli 2017-05-08 23:31:30 +02:00 committed by GitHub
parent 63b96700e0
commit f59f0793bc
7 changed files with 58 additions and 1 deletions

4
API.md
View File

@ -171,6 +171,8 @@ Optional:
Output the raw docker log Output the raw docker log
- POST `/homeassistant/restart`
### REST API addons ### REST API addons
- GET `/addons/{addon}/info` - GET `/addons/{addon}/info`
@ -223,6 +225,8 @@ Optional:
Output the raw docker log Output the raw docker log
- POST `/addons/{addon}/restart`
## Host Control ## Host Control
Communicate over unix socket with a host daemon. Communicate over unix socket with a host daemon.

View File

@ -197,6 +197,14 @@ class AddonManager(AddonsData):
return True return True
return False return False
async def restart(self, addon):
"""Restart addon."""
if addon not in self.dockers:
_LOGGER.error("No docker found for addon %s", addon)
return False
return await self.dockers[addon].restart()
async def logs(self, addon): async def logs(self, addon):
"""Return addons log output.""" """Return addons log output."""
if addon not in self.dockers: if addon not in self.dockers:

View File

@ -64,6 +64,7 @@ class RestAPI(object):
self.webapp.router.add_get('/homeassistant/info', api_hass.info) self.webapp.router.add_get('/homeassistant/info', api_hass.info)
self.webapp.router.add_post('/homeassistant/update', api_hass.update) self.webapp.router.add_post('/homeassistant/update', api_hass.update)
self.webapp.router.add_post('/homeassistant/restart', api_hass.restart)
self.webapp.router.add_get('/homeassistant/logs', api_hass.logs) self.webapp.router.add_get('/homeassistant/logs', api_hass.logs)
def register_addons(self, addons): def register_addons(self, addons):

View File

@ -143,6 +143,12 @@ class APIAddons(object):
return await asyncio.shield( return await asyncio.shield(
self.addons.update(addon, version), loop=self.loop) self.addons.update(addon, version), loop=self.loop)
@api_process
async def restart(self, request):
"""Restart addon."""
addon = self._extract_addon(request)
return await asyncio.shield(self.addons.restart(addon), loop=self.loop)
@api_process_raw @api_process_raw
def logs(self, request): def logs(self, request):
"""Return logs from addon.""" """Return logs from addon."""

View File

@ -35,7 +35,7 @@ class APIHomeAssistant(object):
@api_process @api_process
async def update(self, request): async def update(self, request):
"""Update host OS.""" """Update homeassistant."""
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)
@ -48,6 +48,15 @@ class APIHomeAssistant(object):
return await asyncio.shield( return await asyncio.shield(
self.homeassistant.update(version), loop=self.loop) 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")
return await asyncio.shield(
self.homeassistant.restart(), loop=self.loop)
@api_process_raw @api_process_raw
def logs(self, request): def logs(self, request):
"""Return homeassistant docker logs. """Return homeassistant docker logs.

View File

@ -264,3 +264,28 @@ class DockerBase(object):
return self.container.logs(tail=100, stdout=True, stderr=True) return self.container.logs(tail=100, stdout=True, stderr=True)
except docker.errors.DockerException as err: except docker.errors.DockerException as err:
_LOGGER.warning("Can't grap logs from %s -> %s", self.image, err) _LOGGER.warning("Can't grap logs from %s -> %s", self.image, err)
async def restart(self):
"""Restart docker container."""
if self._lock.locked():
_LOGGER.error("Can't excute restart while a task is in progress")
return False
async with self._lock:
return await self.loop.run_in_executor(None, self._restart)
def _restart(self):
"""Restart docker container.
Need run inside executor.
"""
if not self.container:
return False
try:
self.container.restart(timeout=30)
except docker.errors.DockerException as err:
_LOGGER.warning("Can't restart %s -> %s", self.image, err)
return False
return True

View File

@ -81,3 +81,7 @@ class DockerSupervisor(DockerBase):
async def remove(self): async def remove(self):
"""Remove docker image.""" """Remove docker image."""
raise RuntimeError("Not support on supervisor docker container!") raise RuntimeError("Not support on supervisor docker container!")
async def restart(self):
"""Restart docker container."""
raise RuntimeError("Not support on supervisor docker container!")