Hassio 0.1

This commit is contained in:
Pascal Vizeli 2017-03-28 00:05:13 +02:00
parent 17eff21755
commit 45601ed2cd
7 changed files with 50 additions and 39 deletions

3
.gitignore vendored
View File

@ -87,3 +87,6 @@ ENV/
# Rope project settings
.ropeproject
# pylint
.pylint.d/

View File

@ -8,6 +8,7 @@ import hassio.core as core
_LOGGER = logging.getLogger(__name__)
# pylint: disable=invalid-name
if __name__ == "__main__":
bootstrap.initialize_logging()

View File

@ -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

View File

@ -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()

View File

@ -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.

View File

@ -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."""

View File

@ -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)