Merge pull request #53 from home-assistant/dev

Release 0.27
This commit is contained in:
Pascal Vizeli 2017-05-16 00:20:29 +02:00 committed by GitHub
commit 2ecea7c1b4
6 changed files with 68 additions and 30 deletions

View File

@ -1,7 +1,7 @@
"""Const file for HassIO."""
from pathlib import Path
HASSIO_VERSION = '0.26'
HASSIO_VERSION = '0.27'
URL_HASSIO_VERSION = ('https://raw.githubusercontent.com/home-assistant/'
'hassio/master/version.json')
@ -26,6 +26,14 @@ FILE_HASSIO_CONFIG = Path(HASSIO_SHARE, "config.json")
SOCKET_DOCKER = Path("/var/run/docker.sock")
SOCKET_HC = Path("/var/run/hassio-hc.sock")
LABEL_VERSION = 'io.hass.version'
LABEL_ARCH = 'io.hass.arch'
LABEL_TYPE = 'io.hass.type'
META_ADDON = 'addon'
META_SUPERVISOR = 'supervisor'
META_HOMEASSISTANT = 'homeassistant'
JSON_RESULT = 'result'
JSON_DATA = 'data'
JSON_MESSAGE = 'message'

View File

@ -5,6 +5,7 @@ import logging
import docker
from ..const import LABEL_VERSION
from ..tools import get_version_from_env
_LOGGER = logging.getLogger(__name__)
@ -33,6 +34,19 @@ class DockerBase(object):
"""Return True if a task is in progress."""
return self._lock.locked()
def process_metadata(self, metadata=None, force=False):
"""Read metadata and set it to object."""
if not force and self.version:
return
# read metadata
metadata = metadata or self.container.attrs
if LABEL_VERSION in metadata['Config']['Labels']:
self.version = metadata['Config']['Labels'][LABEL_VERSION]
else:
# dedicated
self.version = get_version_from_env(metadata['Config']['Env'])
async def install(self, tag):
"""Pull docker image."""
if self._lock.locked():
@ -51,8 +65,8 @@ class DockerBase(object):
_LOGGER.info("Pull image %s tag %s.", self.image, tag)
image = self.dock.images.pull("{}:{}".format(self.image, tag))
self.version = tag
image.tag(self.image, tag='latest')
self.process_metadata(metadata=image.attrs, force=True)
except docker.errors.APIError as err:
_LOGGER.error("Can't install %s:%s -> %s.", self.image, tag, err)
return False
@ -74,7 +88,7 @@ class DockerBase(object):
"""
try:
image = self.dock.images.get(self.image)
self.version = get_version_from_env(image.attrs['Config']['Env'])
self.process_metadata(metadata=image.attrs)
except docker.errors.DockerException:
return False
@ -95,8 +109,7 @@ class DockerBase(object):
if not self.container:
try:
self.container = self.dock.containers.get(self.docker_name)
self.version = get_version_from_env(
self.container.attrs['Config']['Env'])
self.process_metadata()
except docker.errors.DockerException:
return False
else:
@ -121,8 +134,7 @@ class DockerBase(object):
try:
self.container = self.dock.containers.get(self.docker_name)
self.image = self.container.attrs['Config']['Image']
self.version = get_version_from_env(
self.container.attrs['Config']['Env'])
self.process_metadata()
_LOGGER.info("Attach to image %s with version %s",
self.image, self.version)
except (docker.errors.DockerException, KeyError):
@ -199,12 +211,14 @@ class DockerBase(object):
self.image, self.version)
try:
self.dock.images.remove(
image="{}:latest".format(self.image), force=True)
self.dock.images.remove(
image="{}:{}".format(self.image, self.version), force=True)
except docker.errors.ImageNotFound:
return True
with suppress(docker.errors.ImageNotFound):
self.dock.images.remove(
image="{}:latest".format(self.image), force=True)
with suppress(docker.errors.ImageNotFound):
self.dock.images.remove(
image="{}:{}".format(self.image, self.version), force=True)
except docker.errors.DockerException as err:
_LOGGER.warning("Can't remove image %s -> %s", self.image, err)
return False

View File

@ -7,7 +7,7 @@ import docker
from . import DockerBase
from .util import dockerfile_template
from ..tools import get_version_from_env
from ..const import META_ADDON
_LOGGER = logging.getLogger(__name__)
@ -82,9 +82,7 @@ class DockerAddon(DockerBase):
volumes=self.volumes,
)
self.version = get_version_from_env(
self.container.attrs['Config']['Env'])
self.process_metadata()
_LOGGER.info("Start docker addon %s with version %s",
self.image, self.version)
@ -99,16 +97,27 @@ class DockerAddon(DockerBase):
Need run inside executor.
"""
# read container
try:
self.container = self.dock.containers.get(self.docker_name)
self.version = get_version_from_env(
self.container.attrs['Config']['Env'])
self.process_metadata()
_LOGGER.info(
"Attach to image %s with version %s", self.image, self.version)
_LOGGER.info("Attach to container %s with version %s",
self.image, self.version)
return
except (docker.errors.DockerException, KeyError):
pass
# read image
try:
image = self.dock.images.get(self.image)
self.process_metadata(metadata=image.attrs)
_LOGGER.info("Attach to image %s with version %s",
self.image, self.version)
except (docker.errors.DockerException, KeyError):
_LOGGER.error("No container/image found for %s", self.image)
def _install(self, tag):
"""Pull docker image or build it.
@ -147,7 +156,8 @@ class DockerAddon(DockerBase):
# prepare Dockerfile
try:
dockerfile_template(
Path(build_dir, 'Dockerfile'), self.addons_data.arch, tag)
Path(build_dir, 'Dockerfile'), self.addons_data.arch,
tag, META_ADDON)
except OSError as err:
_LOGGER.error("Can't prepare dockerfile -> %s", err)
@ -159,8 +169,8 @@ class DockerAddon(DockerBase):
image = self.dock.images.build(
path=str(build_dir), tag=build_tag, pull=True)
self.version = tag
image.tag(self.image, tag='latest')
self.process_metadata(metadata=image.attrs, force=True)
except (docker.errors.DockerException, TypeError) as err:
_LOGGER.error("Can't build %s -> %s", build_tag, err)

View File

@ -4,7 +4,6 @@ import logging
import docker
from . import DockerBase
from ..tools import get_version_from_env
_LOGGER = logging.getLogger(__name__)
@ -51,8 +50,7 @@ class DockerHomeAssistant(DockerBase):
{'bind': '/ssl', 'mode': 'rw'},
})
self.version = get_version_from_env(
self.container.attrs['Config']['Env'])
self.process_metadata()
_LOGGER.info("Start docker addon %s with version %s",
self.image, self.version)

View File

@ -11,11 +11,10 @@ RESIN_BASE_IMAGE = {
ARCH_AMD64: "resin/amd64-alpine:3.5",
}
TMPL_VERSION = re.compile(r"%%VERSION%%")
TMPL_IMAGE = re.compile(r"%%BASE_IMAGE%%")
def dockerfile_template(dockerfile, arch, version):
def dockerfile_template(dockerfile, arch, version, meta_type):
"""Prepare a Hass.IO dockerfile."""
buff = []
resin_image = RESIN_BASE_IMAGE[arch]
@ -23,10 +22,19 @@ def dockerfile_template(dockerfile, arch, version):
# read docker
with dockerfile.open('r') as dock_input:
for line in dock_input:
line = TMPL_VERSION.sub(version, line)
line = TMPL_IMAGE.sub(resin_image, line)
buff.append(line)
# add metadata
buff.append(create_metadata(version, arch, meta_type))
# write docker
with dockerfile.open('w') as dock_output:
dock_output.writelines(buff)
def create_metadata(version, arch, meta_type):
"""Generate docker label layer for hassio."""
return ('LABEL io.hass.version="{}" '
'io.hass.arch="{}" '
'io.hass.type="{}"').format(version, arch, meta_type)

View File

@ -1,5 +1,5 @@
{
"hassio": "0.26",
"hassio": "0.27",
"homeassistant": "0.44.2",
"resinos": "0.7",
"resinhup": "0.1",