From 45601ed2cd88a49fe669ab63a085306c6c5ab6f3 Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Tue, 28 Mar 2017 00:05:13 +0200 Subject: [PATCH] Hassio 0.1 --- .gitignore | 3 ++ hassio_api/hassio/__main__.py | 1 + hassio_api/hassio/bootstrap.py | 2 +- hassio_api/hassio/core.py | 12 ++++---- hassio_api/hassio/docker/__init__.py | 38 +++++++++++++++++++++++++- hassio_api/hassio/docker/supervisor.py | 32 ---------------------- hassio_api/hassio/tools.py | 1 + 7 files changed, 50 insertions(+), 39 deletions(-) diff --git a/.gitignore b/.gitignore index 72364f99f..26ad120ea 100644 --- a/.gitignore +++ b/.gitignore @@ -87,3 +87,6 @@ ENV/ # Rope project settings .ropeproject + +# pylint +.pylint.d/ diff --git a/hassio_api/hassio/__main__.py b/hassio_api/hassio/__main__.py index d92df3e86..581efb7c7 100644 --- a/hassio_api/hassio/__main__.py +++ b/hassio_api/hassio/__main__.py @@ -8,6 +8,7 @@ import hassio.core as core _LOGGER = logging.getLogger(__name__) +# pylint: disable=invalid-name if __name__ == "__main__": bootstrap.initialize_logging() diff --git a/hassio_api/hassio/bootstrap.py b/hassio_api/hassio/bootstrap.py index fa05291d6..4f341f87d 100644 --- a/hassio_api/hassio/bootstrap.py +++ b/hassio_api/hassio/bootstrap.py @@ -68,7 +68,7 @@ def check_environment(): _LOGGER.fatal("Can't find %s in env!", key) return False - if not os.path.isFile(os.environ['DOCKER_SOCKET']): + if not os.path.isfile(os.environ['DOCKER_SOCKET']): _LOGGER.fatal("Can't find docker socket!") return False diff --git a/hassio_api/hassio/core.py b/hassio_api/hassio/core.py index a85f4644a..5f695aeaf 100644 --- a/hassio_api/hassio/core.py +++ b/hassio_api/hassio/core.py @@ -5,8 +5,8 @@ import logging import aiohttp import docker -import .bootstrap -import .tools +import hassio.bootstrap as bootstrap +import hassio.tools as tools from .const import CONF_HOMEASSISTANT_TAG from .docker.homeassistant import DockerHomeAssistant from .docker.supervisor import DockerSupervisor @@ -29,8 +29,8 @@ async def run_hassio(loop): # init HomeAssistant Docker docker_hass = DockerHomeAssistant( - config, loop, dock, config.homeassistant_image, - config.homeassistant_tag + config, loop, dock, image=config.homeassistant_image, + tag=config.homeassistant_tag ) # first start of supervisor? @@ -44,10 +44,12 @@ async def run_hassio(loop): if current and CONF_HOMEASSISTANT_TAG in current: if await docker_hass.install(current[CONF_HOMEASSISTANT_TAG]): break - _LOGGER.warning("Can't fetch info from github. Retry in 60") + _LOGGER.warning("Can't fetch info from github. Retry in 60.") await asyncio.sleep(60, loop=loop) config.homeassistant_tag = current[CONF_HOMEASSISTANT_TAG] + else: + _LOGGER.info("HomeAssistant docker is exists.") # run HomeAssistant await docker_hass.run() diff --git a/hassio_api/hassio/docker/__init__.py b/hassio_api/hassio/docker/__init__.py index 4463ccecb..02a3288ac 100644 --- a/hassio_api/hassio/docker/__init__.py +++ b/hassio_api/hassio/docker/__init__.py @@ -3,13 +3,15 @@ import logging import docker +from ..tools import get_version_from_env, extract_image_name + _LOGGER = logging.getLogger(__name__) class DockerBase(object): """Docker hassio wrapper.""" - def __init__(self, config, loop, dock, image, tag=None): + def __init__(self, config, loop, dock, image=None, tag=None): """Initialize docker base wrapper.""" self.config = config self.loop = loop @@ -66,6 +68,40 @@ class DockerBase(object): return False return self.container.status == 'running' + def attach(self): + """Attach to running docker container. + + Return a Future. + """ + return self.loop.run_in_executor(None, self._attach) + + def _attach(self): + """Attach to running docker container. + + Need run inside executor. + """ + try: + self.container = self.dock.containers.get(self.docker_name) + self.image, self.tag = self.image = extract_image_name( + self.container.attrs['Config']['Image']) + except (docker.errors.DockerException, KeyError): + _LOGGER.fatal( + "Can't attach to %s docker container!", self.docker_name) + + async def get_version(self): + """Read VERSION tag from ENV docker. + + Is a coroutine. + """ + if self.container: + try: + self.version = get_version_from_env( + self.container.attrs['Config']['Env']) + except KeyError: + _LOGGER.error("Can't read VERSION from docker env.") + + return None + def run(self): """Run docker image. diff --git a/hassio_api/hassio/docker/supervisor.py b/hassio_api/hassio/docker/supervisor.py index bd476b19a..1cd206709 100644 --- a/hassio_api/hassio/docker/supervisor.py +++ b/hassio_api/hassio/docker/supervisor.py @@ -1,43 +1,11 @@ """Init file for HassIO docker object.""" -import logging - -import docker - from . import DockerBase from ..const import HASSIO_DOCKER -from ..tools import get_version_from_env, extract_image_name - -_LOGGER = logging.getLogger(__name__) class DockerSupervisor(DockerBase): """Docker hassio wrapper for HomeAssistant.""" - def __init__(self, config, loop, dock): - """Initialize docker base wrapper.""" - super().__init__(config, loop, dock, None): - - def attach(self): - """Pull docker image. - - Return a Future. - """ - return self.loop.run_in_executor(None, self._attach) - - def _attach(self): - """Attach object to supervisor container. - - Need run inside executor. - """ - try: - self.container = dock.containers.get(self.docker_name) - self.image, self.tag = self.image = extract_image_name( - self.container.attrs['Config']['Image']) - self.version = get_version_from_env( - self.container.attrs['Config']['Env']) - except (docker.errors.DockerException, KeyError): - _LOGGER.fatal("Can't attach to supervisor docker container!") - @property def docker_name(self): """Return name of docker container.""" diff --git a/hassio_api/hassio/tools.py b/hassio_api/hassio/tools.py index 21c92e390..ff314d70f 100644 --- a/hassio_api/hassio/tools.py +++ b/hassio_api/hassio/tools.py @@ -33,6 +33,7 @@ def get_version_from_env(env_list): _LOGGER.error("Can't find VERSION in env") return None + def extract_image_name(image): """Extract image name and tag from docker attrs.""" data = _RE_IMAGE.match(image)