Change update flow to a higher level (#150)

This commit is contained in:
Pascal Vizeli 2017-08-14 23:56:52 +02:00 committed by GitHub
parent 14013ac923
commit 57f3178408
3 changed files with 27 additions and 25 deletions

View File

@ -41,12 +41,12 @@ class Addon(object):
self.data = data self.data = data
self._id = slug self._id = slug
self.addon_docker = DockerAddon(config, loop, dock, self) self.docker = DockerAddon(config, loop, dock, self)
async def load(self): async def load(self):
"""Async initialize of object.""" """Async initialize of object."""
if self.is_installed: if self.is_installed:
await self.addon_docker.attach() await self.docker.attach()
@property @property
def slug(self): def slug(self):
@ -434,7 +434,7 @@ class Addon(object):
self.path_data.mkdir() self.path_data.mkdir()
version = version or self.last_version version = version or self.last_version
if not await self.addon_docker.install(version): if not await self.docker.install(version):
return False return False
self._set_install(version) self._set_install(version)
@ -443,7 +443,7 @@ class Addon(object):
@check_installed @check_installed
async def uninstall(self): async def uninstall(self):
"""Remove a addon.""" """Remove a addon."""
if not await self.addon_docker.remove(): if not await self.docker.remove():
return False return False
if self.path_data.is_dir(): if self.path_data.is_dir():
@ -459,7 +459,7 @@ class Addon(object):
if not self.is_installed: if not self.is_installed:
return STATE_NONE return STATE_NONE
if await self.addon_docker.is_running(): if await self.docker.is_running():
return STATE_STARTED return STATE_STARTED
return STATE_STOPPED return STATE_STOPPED
@ -469,7 +469,7 @@ class Addon(object):
Return a coroutine. Return a coroutine.
""" """
return self.addon_docker.run() return self.docker.run()
@check_installed @check_installed
def stop(self): def stop(self):
@ -477,22 +477,26 @@ class Addon(object):
Return a coroutine. Return a coroutine.
""" """
return self.addon_docker.stop() return self.docker.stop()
@check_installed @check_installed
async def update(self, version=None): async def update(self, version=None):
"""Update addon.""" """Update addon."""
version = version or self.last_version version = version or self.last_version
last_state = await self.state()
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 False return False
if not await self.addon_docker.update(version): if not await self.docker.update(version):
return False return False
self._set_update(version) self._set_update(version)
# restore state
if last_state == STATE_STARTED:
return await self.docker.run()
return True return True
@check_installed @check_installed
@ -501,7 +505,7 @@ class Addon(object):
Return a coroutine. Return a coroutine.
""" """
return self.addon_docker.restart() return self.docker.restart()
@check_installed @check_installed
def logs(self): def logs(self):
@ -509,7 +513,7 @@ class Addon(object):
Return a coroutine. Return a coroutine.
""" """
return self.addon_docker.logs() return self.docker.logs()
@check_installed @check_installed
async def snapshot(self, tar_file): async def snapshot(self, tar_file):
@ -517,7 +521,7 @@ class Addon(object):
with TemporaryDirectory(dir=str(self.config.path_tmp)) as temp: with TemporaryDirectory(dir=str(self.config.path_tmp)) as temp:
# store local image # store local image
if self.need_build and not await \ if self.need_build and not await \
self.addon_docker.export_image(Path(temp, "image.tar")): self.docker.export_image(Path(temp, "image.tar")):
return False return False
data = { data = {
@ -582,15 +586,15 @@ class Addon(object):
# check version / restore image # check version / restore image
version = data[ATTR_VERSION] version = data[ATTR_VERSION]
if version != self.addon_docker.version: if version != self.docker.version:
image_file = Path(temp, "image.tar") image_file = Path(temp, "image.tar")
if image_file.is_file(): if image_file.is_file():
await self.addon_docker.import_image(image_file, version) await self.docker.import_image(image_file, version)
else: else:
if await self.addon_docker.install(version): if await self.docker.install(version):
await self.addon_docker.cleanup() await self.docker.cleanup()
else: else:
await self.addon_docker.stop() await self.docker.stop()
# restore data # restore data
def _restore_data(): def _restore_data():

View File

@ -251,8 +251,6 @@ class DockerBase(object):
Need run inside executor. Need run inside executor.
""" """
was_running = self._is_running()
_LOGGER.info( _LOGGER.info(
"Update docker %s with %s:%s", self.version, self.image, tag) "Update docker %s with %s:%s", self.version, self.image, tag)
@ -260,10 +258,7 @@ class DockerBase(object):
if not self._install(tag): if not self._install(tag):
return False return False
# run or cleanup container # container
if was_running:
self._run()
else:
self._stop() self._stop()
# cleanup images # cleanup images

View File

@ -121,7 +121,10 @@ class HomeAssistant(JsonConfig):
_LOGGER.warning("Version %s is already installed", version) _LOGGER.warning("Version %s is already installed", version)
return False return False
try:
return await self.docker.update(version) return await self.docker.update(version)
finally:
await self.docker.run()
def run(self): def run(self):
"""Run HomeAssistant docker. """Run HomeAssistant docker.