diff --git a/hassio/addons/__init__.py b/hassio/addons/__init__.py index d6f7146a7..a14a514b5 100644 --- a/hassio/addons/__init__.py +++ b/hassio/addons/__init__.py @@ -40,6 +40,18 @@ class AddonManager(AddonsData): return self.read_addons_repo() + async def auto_boot(self, start_type): + """Boot addons with mode auto.""" + boot_list = self.list_startup(start_type) + tasks = [] + + for addon in boot_list: + tasks.append(self.loop.create_task(self.start_addon(addon))) + + _LOGGER.info("Startup %s run %d addons.", start_type, len(tasks)) + if tasks: + await asyncio.wait(tasks, loop=self.loop) + async def install_addon(self, addon, version=None): """Install a addon.""" if not self.exists_addon(addon): @@ -108,10 +120,7 @@ class AddonManager(AddonsData): _LOGGER.error("Can't write options for addon %s.", addon) return False - if not await self.dockers[addon].run(): - return False - - return True + return await self.dockers[addon].run(): async def stop_addon(self, addon): """Stop addon.""" @@ -119,10 +128,7 @@ class AddonManager(AddonsData): _LOGGER.error("No docker found for addon %s.", addon) return False - if not await self.dockers[addon].stop(): - return False - - return True + return await self.dockers[addon].stop(): async def update_addon(self, addon, version=None): """Update addon.""" @@ -135,7 +141,4 @@ class AddonManager(AddonsData): return False version = version or self.get_version(addon) - if not await self.dockers[addon].update(version): - return False - - return True + return await self.dockers[addon].update(version): diff --git a/hassio/addons/data.py b/hassio/addons/data.py index dec72b829..e15c84a35 100644 --- a/hassio/addons/data.py +++ b/hassio/addons/data.py @@ -73,12 +73,12 @@ class AddonsData(Config): @property def list_installed(self): """Return a list of installed addons.""" - return self._data.keys() + return set(self._data.keys()) @property def list_all(self): """Return a list of available addons.""" - return self._addons_data.keys() + return set(self._addons_data.keys()) @property def list(self): @@ -95,6 +95,21 @@ class AddonsData(Config): return data + def list_startup(self, start_type): + """Get list of installed addon with need start by type.""" + addon_list = set() + for addon, value in self._data.items(): + if self.get_boot(addon) != BOOT_AUTO: + continue + + try: + if self._addons_data[addon][ATTR_STARTUP] == start_type: + addon_list.add(addon) + except KeyError: + continue + + return addon_list + def exists_addon(self, addon): """Return True if a addon exists.""" return addon in self._addons_data diff --git a/hassio/core.py b/hassio/core.py index 5faf29359..62fcffb02 100644 --- a/hassio/core.py +++ b/hassio/core.py @@ -10,7 +10,8 @@ from .addons import AddonManager from .api import RestAPI from .host_controll import HostControll from .const import ( - SOCKET_DOCKER, RUN_UPDATE_INFO_TASKS, RUN_RELOAD_ADDONS_TASKS) + SOCKET_DOCKER, RUN_UPDATE_INFO_TASKS, RUN_RELOAD_ADDONS_TASKS, + STARTUP_AFTER, STARTUP_BEFORE) from .scheduler import Scheduler from .dock.homeassistant import DockerHomeAssistant from .dock.supervisor import DockerSupervisor @@ -87,9 +88,15 @@ class HassIO(object): # start api await self.api.start() + # start addon mark as before + await self.addons.auto_boot(STARTUP_BEFORE) + # run HomeAssistant await self.homeassistant.run() + # start addon mark as after + await self.addons.auto_boot(STARTUP_AFTER) + async def stop(self): """Stop a running orchestration.""" tasks = [self.websession.close(), self.api.stop()]