Merge remote-tracking branch 'origin/dev'

This commit is contained in:
pvizeli 2017-08-22 16:16:01 +02:00
commit b03a2c5c5f
11 changed files with 126 additions and 10 deletions

4
API.md
View File

@ -435,6 +435,10 @@ Output is the raw Docker log.
- POST `/addons/{addon}/restart`
- POST `/addons/{addon}/rebuild`
Only supported for local build addons
## Host Control
Communicate over UNIX socket with a host daemon.

View File

@ -8,6 +8,7 @@ import shutil
import tarfile
from tempfile import TemporaryDirectory
from deepmerge import Merger
import voluptuous as vol
from voluptuous.humanize import humanize_error
@ -30,6 +31,8 @@ _LOGGER = logging.getLogger(__name__)
RE_VOLUME = re.compile(MAP_VOLUME)
RE_WEBUI = re.compile(r"^(.*\[HOST\]:)\[PORT:(\d+)\](.*)$")
MERGE_OPT = Merger([(dict, ['merge'])], ['override'], ['override'])
class Addon(object):
"""Hold data for addon inside HassIO."""
@ -104,10 +107,10 @@ class Addon(object):
def options(self):
"""Return options with local changes."""
if self.is_installed:
return {
**self.data.system[self._id][ATTR_OPTIONS],
**self.data.user[self._id][ATTR_OPTIONS],
}
return MERGE_OPT.merge(
self.data.system[self._id][ATTR_OPTIONS],
self.data.user[self._id][ATTR_OPTIONS],
)
return self.data.cache[self._id][ATTR_OPTIONS]
@options.setter
@ -515,6 +518,27 @@ class Addon(object):
"""
return self.docker.logs()
@check_installed
async def rebuild(self):
"""Performe a rebuild of local build addon."""
last_state = await self.state()
if not self.need_build:
_LOGGER.error("Can't rebuild a none local build addon!")
return False
# remove docker container but not addon config
if not await self.docker.remove():
return False
if not await self.docker.install(self.version_installed):
return False
# restore state
if last_state == STATE_STARTED:
await self.docker.run()
return True
@check_installed
async def snapshot(self, tar_file):
"""Snapshot a state of a addon."""

View File

@ -94,6 +94,8 @@ class RestAPI(object):
'/addons/{addon}/update', api_addons.update)
self.webapp.router.add_post(
'/addons/{addon}/options', api_addons.options)
self.webapp.router.add_post(
'/addons/{addon}/rebuild', api_addons.rebuild)
self.webapp.router.add_get('/addons/{addon}/logs', api_addons.logs)
self.webapp.router.add_get('/addons/{addon}/logo', api_addons.logo)

View File

@ -213,6 +213,15 @@ class APIAddons(object):
addon = self._extract_addon(request)
return asyncio.shield(addon.restart(), loop=self.loop)
@api_process
def rebuild(self, request):
"""Rebuild local build addon."""
addon = self._extract_addon(request)
if not addon.need_build:
raise RuntimeError("Only local build addons are supported")
return asyncio.shield(addon.rebuild(), loop=self.loop)
@api_process_raw(CONTENT_TYPE_BINARY)
def logs(self, request):
"""Return logs from addon."""

View File

@ -1,7 +1,7 @@
"""Const file for HassIO."""
from pathlib import Path
HASSIO_VERSION = '0.56'
HASSIO_VERSION = '0.57'
URL_HASSIO_VERSION = ('https://raw.githubusercontent.com/home-assistant/'
'hassio/{}/version.json')

View File

@ -203,7 +203,9 @@ class DockerAddon(DockerBase):
_LOGGER.info("Start build %s on %s", build_tag, build_dir)
image = self.dock.images.build(
path=str(build_dir), tag=build_tag, pull=True)
path=str(build_dir), tag=build_tag, pull=True,
forcerm=True
)
image.tag(self.image, tag='latest')
self.process_metadata(image.attrs, force=True)

File diff suppressed because one or more lines are too long

Binary file not shown.

@ -1 +1 @@
Subproject commit 1aa387a72f2a8b0c26a005afbba9a8a9fc095e06
Subproject commit 9b9cba86c28bf7710a84ac00e065e0165c61754f

View File

@ -47,6 +47,7 @@ setup(
'pyotp',
'pyqrcode',
'pytz',
'pyudev'
'pyudev',
'deepmerge'
]
)

View File

@ -1,5 +1,5 @@
{
"hassio": "0.56",
"hassio": "0.57",
"homeassistant": "0.51.2",
"resinos": "1.0",
"resinhup": "0.3",