Bump cloud to 0.47.1 (#55312)

* Bump cloud to 0.47.0

* Bump reqs

* Bump to 0.47.1

* Do not load hass_nabucasa during http startup

* fix some tests

* Fix test

Co-authored-by: Ludeeus <ludeeus@ludeeus.dev>
pull/55553/head
Paulus Schoutsen 2021-09-01 09:54:54 -07:00 committed by GitHub
parent c68e87c40e
commit 27e29b714c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 66 additions and 31 deletions

View File

@ -228,7 +228,7 @@ async def async_setup(hass, config):
cloud.iot.register_on_connect(_on_connect)
await cloud.start()
await cloud.initialize()
await http_api.async_setup(hass)
account_link.async_setup(hass)

View File

@ -108,8 +108,8 @@ class CloudClient(Interface):
return self._google_config
async def logged_in(self) -> None:
"""When user logs in."""
async def cloud_started(self) -> None:
"""When cloud is started."""
is_new_user = await self.prefs.async_set_username(self.cloud.username)
async def enable_alexa(_):
@ -150,7 +150,10 @@ class CloudClient(Interface):
if tasks:
await asyncio.gather(*(task(None) for task in tasks))
async def cleanups(self) -> None:
async def cloud_stopped(self) -> None:
"""When the cloud is stopped."""
async def logout_cleanups(self) -> None:
"""Cleanup some stuff after logout."""
await self.prefs.async_set_username(None)

View File

@ -62,7 +62,7 @@ class CloudGoogleConfig(AbstractConfig):
@property
def should_report_state(self):
"""Return if states should be proactively reported."""
return self._cloud.is_logged_in and self._prefs.google_report_state
return self.enabled and self._prefs.google_report_state
@property
def local_sdk_webhook_id(self):

View File

@ -2,7 +2,7 @@
"domain": "cloud",
"name": "Home Assistant Cloud",
"documentation": "https://www.home-assistant.io/integrations/cloud",
"requirements": ["hass-nabucasa==0.46.0"],
"requirements": ["hass-nabucasa==0.47.1"],
"dependencies": ["http", "webhook"],
"after_dependencies": ["google_assistant", "alexa"],
"codeowners": ["@home-assistant/cloud"],

View File

@ -15,10 +15,10 @@ from homeassistant.const import (
ATTR_SUPPORTED_FEATURES,
CLOUD_NEVER_EXPOSED_ENTITIES,
CONF_NAME,
EVENT_HOMEASSISTANT_STARTED,
STATE_UNAVAILABLE,
)
from homeassistant.core import Context, CoreState, HomeAssistant, State, callback
from homeassistant.core import Context, HomeAssistant, State, callback
from homeassistant.helpers import start
from homeassistant.helpers.area_registry import AreaEntry
from homeassistant.helpers.device_registry import DeviceEntry
from homeassistant.helpers.entity_registry import RegistryEntry
@ -105,15 +105,14 @@ class AbstractConfig(ABC):
self._store = GoogleConfigStore(self.hass)
await self._store.async_load()
if self.hass.state == CoreState.running:
await self.async_sync_entities_all()
if not self.enabled:
return
async def sync_google(_):
"""Sync entities to Google."""
await self.async_sync_entities_all()
self.hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STARTED, sync_google)
start.async_at_start(self.hass, sync_google)
@property
def enabled(self):

View File

@ -4,6 +4,8 @@ from __future__ import annotations
from collections.abc import Awaitable, Callable
from ipaddress import ip_address
import logging
from types import ModuleType
from typing import Literal
from aiohttp.hdrs import X_FORWARDED_FOR, X_FORWARDED_HOST, X_FORWARDED_PROTO
from aiohttp.web import Application, HTTPBadRequest, Request, StreamResponse, middleware
@ -63,23 +65,30 @@ def async_setup_forwarded(
an HTTP 400 status code is thrown.
"""
try:
from hass_nabucasa import remote # pylint: disable=import-outside-toplevel
# venv users might have already loaded it before it got upgraded so guard for this
# This can only happen when people upgrade from before 2021.8.5.
if not hasattr(remote, "is_cloud_request"):
remote = None
except ImportError:
remote = None
remote: Literal[False] | None | ModuleType = None
@middleware
async def forwarded_middleware(
request: Request, handler: Callable[[Request], Awaitable[StreamResponse]]
) -> StreamResponse:
"""Process forwarded data by a reverse proxy."""
nonlocal remote
if remote is None:
# Initialize remote method
try:
from hass_nabucasa import ( # pylint: disable=import-outside-toplevel
remote,
)
# venv users might have an old version installed if they don't have cloud around anymore
if not hasattr(remote, "is_cloud_request"):
remote = False
except ImportError:
remote = False
# Skip requests from Remote UI
if remote is not None and remote.is_cloud_request.get():
if remote and remote.is_cloud_request.get(): # type: ignore
return await handler(request)
# Handle X-Forwarded-For

View File

@ -15,7 +15,7 @@ ciso8601==2.1.3
cryptography==3.3.2
defusedxml==0.7.1
emoji==1.2.0
hass-nabucasa==0.46.0
hass-nabucasa==0.47.1
home-assistant-frontend==20210830.0
httpx==0.19.0
ifaddr==0.1.7

View File

@ -760,7 +760,7 @@ habitipy==0.2.0
hangups==0.4.14
# homeassistant.components.cloud
hass-nabucasa==0.46.0
hass-nabucasa==0.47.1
# homeassistant.components.splunk
hass_splunk==0.1.1

View File

@ -441,7 +441,7 @@ habitipy==0.2.0
hangups==0.4.14
# homeassistant.components.cloud
hass-nabucasa==0.46.0
hass-nabucasa==0.47.1
# homeassistant.components.tasmota
hatasmota==0.2.20

View File

@ -12,7 +12,7 @@ async def mock_cloud(hass, config=None):
assert await async_setup_component(hass, cloud.DOMAIN, {"cloud": config or {}})
cloud_inst = hass.data["cloud"]
with patch("hass_nabucasa.Cloud.run_executor", AsyncMock(return_value=None)):
await cloud_inst.start()
await cloud_inst.initialize()
def mock_cloud_prefs(hass, prefs={}):

View File

@ -48,6 +48,8 @@ def mock_cloud_login(hass, mock_cloud_setup):
},
"test",
)
with patch.object(hass.data[const.DOMAIN].auth, "async_check_token"):
yield
@pytest.fixture

View File

@ -134,7 +134,7 @@ async def test_handler_google_actions_disabled(hass, mock_cloud_fixture):
"""Test handler Google Actions when user has disabled it."""
mock_cloud_fixture._prefs[PREF_ENABLE_GOOGLE] = False
with patch("hass_nabucasa.Cloud.start"):
with patch("hass_nabucasa.Cloud.initialize"):
assert await async_setup_component(hass, "cloud", {})
reqid = "5711642932632160983"
@ -149,7 +149,7 @@ async def test_handler_google_actions_disabled(hass, mock_cloud_fixture):
async def test_webhook_msg(hass, caplog):
"""Test webhook msg."""
with patch("hass_nabucasa.Cloud.start"):
with patch("hass_nabucasa.Cloud.initialize"):
setup = await async_setup_component(hass, "cloud", {"cloud": {}})
assert setup
cloud = hass.data["cloud"]
@ -261,7 +261,7 @@ async def test_set_username(hass):
)
client = CloudClient(hass, prefs, None, {}, {})
client.cloud = MagicMock(is_logged_in=True, username="mock-username")
await client.logged_in()
await client.cloud_started()
assert len(prefs.async_set_username.mock_calls) == 1
assert prefs.async_set_username.mock_calls[0][1][0] == "mock-username"
@ -279,7 +279,7 @@ async def test_login_recovers_bad_internet(hass, caplog):
client._alexa_config = Mock(
async_enable_proactive_mode=Mock(side_effect=aiohttp.ClientError)
)
await client.logged_in()
await client.cloud_started()
assert len(client._alexa_config.async_enable_proactive_mode.mock_calls) == 1
assert "Unable to activate Alexa Report State" in caplog.text

View File

@ -31,6 +31,8 @@ async def test_google_update_report_state(mock_conf, hass, cloud_prefs):
await mock_conf.async_initialize()
await mock_conf.async_connect_agent_user("mock-user-id")
mock_conf._cloud.subscription_expired = False
with patch.object(mock_conf, "async_sync_entities") as mock_sync, patch(
"homeassistant.components.google_assistant.report_state.async_enable_report_state"
) as mock_report_state:
@ -41,6 +43,25 @@ async def test_google_update_report_state(mock_conf, hass, cloud_prefs):
assert len(mock_report_state.mock_calls) == 1
async def test_google_update_report_state_subscription_expired(
mock_conf, hass, cloud_prefs
):
"""Test Google config not reporting state when subscription has expired."""
await mock_conf.async_initialize()
await mock_conf.async_connect_agent_user("mock-user-id")
assert mock_conf._cloud.subscription_expired
with patch.object(mock_conf, "async_sync_entities") as mock_sync, patch(
"homeassistant.components.google_assistant.report_state.async_enable_report_state"
) as mock_report_state:
await cloud_prefs.async_update(google_report_state=True)
await hass.async_block_till_done()
assert len(mock_sync.mock_calls) == 0
assert len(mock_report_state.mock_calls) == 0
async def test_sync_entities(mock_conf, hass, cloud_prefs):
"""Test sync devices."""
await mock_conf.async_initialize()
@ -172,6 +193,7 @@ async def test_sync_google_when_started(hass, mock_cloud_login, cloud_prefs):
with patch.object(config, "async_sync_entities_all") as mock_sync:
await config.async_initialize()
await config.async_connect_agent_user("mock-user-id")
await hass.async_block_till_done()
assert len(mock_sync.mock_calls) == 1

View File

@ -15,7 +15,7 @@ from homeassistant.setup import async_setup_component
async def test_constructor_loads_info_from_config(hass):
"""Test non-dev mode loads info from SERVERS constant."""
with patch("hass_nabucasa.Cloud.start"):
with patch("hass_nabucasa.Cloud.initialize"):
result = await async_setup_component(
hass,
"cloud",
@ -109,7 +109,7 @@ async def test_setup_existing_cloud_user(hass, hass_storage):
"""Test setup with API push default data."""
user = await hass.auth.async_create_system_user("Cloud test")
hass_storage[STORAGE_KEY] = {"version": 1, "data": {"cloud_user": user.id}}
with patch("hass_nabucasa.Cloud.start"):
with patch("hass_nabucasa.Cloud.initialize"):
result = await async_setup_component(
hass,
"cloud",