From 04bb7ed58f00fe9689395a768f4d6fc504f37b3b Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 15 Nov 2015 02:04:57 -0800 Subject: [PATCH 1/6] Have Notify platform install platform dependencies --- homeassistant/components/notify/__init__.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/notify/__init__.py b/homeassistant/components/notify/__init__.py index 44a0639c001..a2a1a51ba28 100644 --- a/homeassistant/components/notify/__init__.py +++ b/homeassistant/components/notify/__init__.py @@ -10,6 +10,7 @@ from functools import partial import logging import os +import homeassistant.bootstrap as bootstrap from homeassistant.config import load_yaml_config_file from homeassistant.loader import get_component from homeassistant.helpers import config_per_platform @@ -45,8 +46,8 @@ def setup(hass, config): for platform, p_config in config_per_platform(config, DOMAIN, _LOGGER): # get platform - notify_implementation = get_component( - 'notify.{}'.format(platform)) + notify_implementation = bootstrap.prepare_setup_platform( + hass, config, DOMAIN, platform) if notify_implementation is None: _LOGGER.error("Unknown notification service specified.") From 6135b87b1d1ed1ed726b30537ab74737cc1a609e Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 15 Nov 2015 02:05:13 -0800 Subject: [PATCH 2/6] Log error if unable to install package --- homeassistant/util/package.py | 1 + 1 file changed, 1 insertion(+) diff --git a/homeassistant/util/package.py b/homeassistant/util/package.py index 50b0fffb4af..fdfbc133944 100644 --- a/homeassistant/util/package.py +++ b/homeassistant/util/package.py @@ -29,6 +29,7 @@ def install_package(package, upgrade=True, target=None): try: return 0 == subprocess.call(args) except subprocess.SubprocessError: + _LOGGER.exception('Unable to install pacakge %s', package) return False From 71e4283a2ee771862fe802038c415229d801a104 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 15 Nov 2015 02:05:46 -0800 Subject: [PATCH 3/6] Remove lib directory in version upgrade --- homeassistant/bootstrap.py | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/homeassistant/bootstrap.py b/homeassistant/bootstrap.py index cbc8ec5a633..c66e6563cc1 100644 --- a/homeassistant/bootstrap.py +++ b/homeassistant/bootstrap.py @@ -9,11 +9,12 @@ After bootstrapping you can add your own components or start by calling homeassistant.start_home_assistant(bus) """ -import os -import sys +from collections import defaultdict import logging import logging.handlers -from collections import defaultdict +import os +import shutil +import sys import homeassistant.core as core import homeassistant.util.dt as date_util @@ -25,7 +26,7 @@ import homeassistant.components as core_components import homeassistant.components.group as group from homeassistant.helpers.entity import Entity from homeassistant.const import ( - EVENT_COMPONENT_LOADED, CONF_LATITUDE, CONF_LONGITUDE, + __version__, EVENT_COMPONENT_LOADED, CONF_LATITUDE, CONF_LONGITUDE, CONF_TEMPERATURE_UNIT, CONF_NAME, CONF_TIME_ZONE, CONF_CUSTOMIZE, TEMP_CELCIUS, TEMP_FAHRENHEIT) @@ -168,6 +169,7 @@ def from_config_dict(config, hass=None, config_dir=None, enable_log=True, hass.config.config_dir = config_dir mount_local_lib_path(config_dir) + process_ha_config_upgrade(hass) process_ha_core_config(hass, config.get(core.DOMAIN, {})) if enable_log: @@ -281,6 +283,29 @@ def enable_logging(hass, verbose=False, daemon=False, log_rotate_days=None): 'Unable to setup error log %s (access denied)', err_log_path) +def process_ha_config_upgrade(hass): + """ Upgrade config if necessary. """ + version_path = hass.config.path('.HA_VERSION') + + try: + with open(version_path, 'rt') as inp: + conf_version = inp.readline().strip() + except FileNotFoundError: + # Last version to not have this file + conf_version = '0.7.7' + + if conf_version == __version__: + return + + _LOGGER.info('Upgrading config directory from %s to %s', conf_version, + __version__) + + shutil.rmtree(hass.config.path('lib')) + + with open(version_path, 'wt') as outp: + outp.write(__version__) + + def process_ha_core_config(hass, config): """ Processes the [homeassistant] section from the config. """ hac = hass.config From 295f27d259cebf065ce5b7867a2ef4e094f3e8df Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 15 Nov 2015 02:16:52 -0800 Subject: [PATCH 4/6] Only delete lib dir in config upgrade if exists --- homeassistant/bootstrap.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/homeassistant/bootstrap.py b/homeassistant/bootstrap.py index c66e6563cc1..4d68227d4d0 100644 --- a/homeassistant/bootstrap.py +++ b/homeassistant/bootstrap.py @@ -300,7 +300,9 @@ def process_ha_config_upgrade(hass): _LOGGER.info('Upgrading config directory from %s to %s', conf_version, __version__) - shutil.rmtree(hass.config.path('lib')) + lib_path = hass.config.path('lib') + if os.path.isdir(lib_path): + shutil.rmtree(lib_path) with open(version_path, 'wt') as outp: outp.write(__version__) From 700b7ba5916cca4edcd9f1fe61e5612e353d4172 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 15 Nov 2015 02:20:35 -0800 Subject: [PATCH 5/6] Remove unused import in notify --- homeassistant/components/notify/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/homeassistant/components/notify/__init__.py b/homeassistant/components/notify/__init__.py index a2a1a51ba28..fdd5d1b5d3a 100644 --- a/homeassistant/components/notify/__init__.py +++ b/homeassistant/components/notify/__init__.py @@ -12,7 +12,6 @@ import os import homeassistant.bootstrap as bootstrap from homeassistant.config import load_yaml_config_file -from homeassistant.loader import get_component from homeassistant.helpers import config_per_platform from homeassistant.const import CONF_NAME From 0f68dc6b7b35aa22e08517a80cf5f4b672f88eca Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 15 Nov 2015 14:28:50 -0800 Subject: [PATCH 6/6] Add tests for version upgrade --- tests/test_bootstrap.py | 46 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/tests/test_bootstrap.py b/tests/test_bootstrap.py index df05964a79f..a0c4da894f0 100644 --- a/tests/test_bootstrap.py +++ b/tests/test_bootstrap.py @@ -5,11 +5,13 @@ tests.test_bootstrap Tests bootstrap. """ # pylint: disable=too-many-public-methods,protected-access +import os import tempfile import unittest from unittest import mock -from homeassistant import bootstrap +from homeassistant import core, bootstrap +from homeassistant.const import __version__ import homeassistant.util.dt as dt_util from tests.common import mock_detect_location_info @@ -39,3 +41,45 @@ class TestBootstrap(unittest.TestCase): self.assertEqual(sorted(components), sorted(hass.config.components)) + + def test_remove_lib_on_upgrade(self): + with tempfile.TemporaryDirectory() as config_dir: + version_path = os.path.join(config_dir, '.HA_VERSION') + lib_dir = os.path.join(config_dir, 'lib') + check_file = os.path.join(lib_dir, 'check') + + with open(version_path, 'wt') as outp: + outp.write('0.7.0') + + os.mkdir(lib_dir) + + with open(check_file, 'w'): + pass + + hass = core.HomeAssistant() + hass.config.config_dir = config_dir + + self.assertTrue(os.path.isfile(check_file)) + bootstrap.process_ha_config_upgrade(hass) + self.assertFalse(os.path.isfile(check_file)) + + def test_not_remove_lib_if_not_upgrade(self): + with tempfile.TemporaryDirectory() as config_dir: + version_path = os.path.join(config_dir, '.HA_VERSION') + lib_dir = os.path.join(config_dir, 'lib') + check_file = os.path.join(lib_dir, 'check') + + with open(version_path, 'wt') as outp: + outp.write(__version__) + + os.mkdir(lib_dir) + + with open(check_file, 'w'): + pass + + hass = core.HomeAssistant() + hass.config.config_dir = config_dir + + bootstrap.process_ha_config_upgrade(hass) + + self.assertTrue(os.path.isfile(check_file))