11"""Init file for HassIO docker object."""
2+ import logging
23import os
34
5+ import docker
6+
47from . import DockerBase
8+ from ..const import RESTART_EXIT_CODE
9+
10+ _LOGGER = logging .getLogger (__name__ )
511
612
713class DockerSupervisor (DockerBase ):
814 """Docker hassio wrapper for HomeAssistant."""
915
16+ def __init__ (self , config , loop , dock , hassio , image = None ):
17+ """Initialize docker base wrapper."""
18+ super ().__init__ (config , loop , dock , image = image )
19+
20+ self .hassio = hassio
21+
1022 @property
1123 def docker_name (self ):
1224 """Return name of docker container."""
1325 return os .environ ['SUPERVISOR_NAME' ]
1426
27+ async def update (self , tag ):
28+ """Update a supervisor docker image."""
29+ if self ._lock .locked ():
30+ _LOGGER .error ("Can't excute update while a task is in progress" )
31+ return False
32+
33+ _LOGGER .info ("Update supervisor docker to %s:%s" , self .image , tag )
34+ old_version = self .version
35+
36+ async with self ._lock :
37+ if await self .loop .run_in_executor (None , self ._install , tag ):
38+ self .config .hassio_cleanup = old_version
39+ self .loop .create_task (self .hassio .stop (RESTART_EXIT_CODE ))
40+
41+ async def cleanup (self ):
42+ """Check if old supervisor version exists and cleanup."""
43+ if not self .config .hassio_cleanup :
44+ return
45+
46+ async with self ._lock :
47+ if await self .loop .run_in_executor (None , self ._cleanup ):
48+ self .config .hassio_cleanup = None
49+
50+ def _cleanup (self ):
51+ """Remove old image.
52+
53+ Need run inside executor.
54+ """
55+ old_image = "{}:{}" .format (self .image , self .config .hassio_cleanup )
56+
57+ _LOGGER .info ("Old supervisor docker found %s" , old_image )
58+ try :
59+ self .dock .images .remove (image = old_image , force = True )
60+ except docker .errors .DockerException as err :
61+ _LOGGER .warning ("Can't remove old image %s -> %s" , old_image , err )
62+ return False
63+
64+ return True
65+
1566 async def run (self ):
1667 """Run docker image."""
1768 raise RuntimeError ("Not support on supervisor docker container!" )
@@ -24,10 +75,6 @@ async def stop(self):
2475 """Stop/remove docker container."""
2576 raise RuntimeError ("Not support on supervisor docker container!" )
2677
27- async def update (self , tag ):
28- """Update docker image."""
29- raise RuntimeError ("Not support on supervisor docker container!" )
30-
3178 async def remove (self ):
3279 """Remove docker image."""
3380 raise RuntimeError ("Not support on supervisor docker container!" )
0 commit comments