diff --git a/supervisor/docker/interface.py b/supervisor/docker/interface.py index 4ff74339f..521a13627 100644 --- a/supervisor/docker/interface.py +++ b/supervisor/docker/interface.py @@ -19,6 +19,7 @@ from ..const import ( ) from ..coresys import CoreSys, CoreSysAttributes from ..exceptions import DockerAPIError, DockerError, DockerNotFound, DockerRequestError +from ..resolution.const import ContextType, IssueType, SuggestionType from ..utils import process_lock from .stats import DockerStats @@ -162,6 +163,16 @@ class DockerInterface(CoreSysAttributes): "Available space in /data is: %s GiB", free_space, ) + elif err.status_code == 429: + self.sys_resolution.create_issue( + IssueType.DOCKER_RATELIMIT, + ContextType.SYSTEM, + suggestions=[SuggestionType.REGISTRY_LOGIN], + ) + _LOGGER.info( + "Your IP address has made too many requests to Docker Hub which activated a rate limit. " + "For more details see https://www.home-assistant.io/more-info/dockerhub-rate-limit" + ) raise DockerError() from err except (docker.errors.DockerException, requests.RequestException) as err: _LOGGER.error("Unknown error with %s:%s -> %s", image, tag, err) diff --git a/supervisor/resolution/const.py b/supervisor/resolution/const.py index 48bcddccc..1da31c85c 100644 --- a/supervisor/resolution/const.py +++ b/supervisor/resolution/const.py @@ -46,6 +46,7 @@ class IssueType(str, Enum): """Issue type.""" FREE_SPACE = "free_space" + DOCKER_RATELIMIT = "docker_ratelimit" CORRUPT_DOCKER = "corrupt_docker" CORRUPT_REPOSITORY = "corrupt_repository" MISSING_IMAGE = "missing_image" @@ -64,4 +65,5 @@ class SuggestionType(str, Enum): EXECUTE_REPAIR = "execute_repair" EXECUTE_RESET = "execute_reset" EXECUTE_RELOAD = "execute_reload" + REGISTRY_LOGIN = "registry_login" NEW_INITIALIZE = "new_initialize"