Use label instead env, cleanup build (#50)

* Use label instead env, cleanup build

* Update const.py

* fix lint

* add space

* fix lint

* use dynamic type

* fix lint

* fix path

* fix label read

* fix bug
This commit is contained in:
Pascal Vizeli 2017-05-15 23:19:35 +02:00 committed by GitHub
parent 6f4f6338c5
commit 4bdd256000
5 changed files with 44 additions and 20 deletions

View File

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

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)
@ -101,8 +99,7 @@ class DockerAddon(DockerBase):
"""
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)
@ -147,7 +144,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 +157,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)