From fb259e1477997c8b16b8f8a09c410e7a506fd39c Mon Sep 17 00:00:00 2001 From: Fabian von Feilitzsch Date: Fri, 13 Mar 2020 15:04:04 -0400 Subject: [PATCH] Prevent 503s from killing the client during discovery --- dynamic/discovery.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/dynamic/discovery.py b/dynamic/discovery.py index 9468a274..24d48d81 100644 --- a/dynamic/discovery.py +++ b/dynamic/discovery.py @@ -23,7 +23,7 @@ from urllib3.exceptions import ProtocolError, MaxRetryError from kubernetes import __version__ -from .exceptions import NotFoundError, ResourceNotFoundError, ResourceNotUniqueError, ApiException +from .exceptions import NotFoundError, ResourceNotFoundError, ResourceNotUniqueError, ApiException, ServiceUnavailableError from .resource import Resource, ResourceList @@ -155,7 +155,10 @@ def get_resources_for_api_version(self, prefix, group, version, preferred): subresources = {} path = '/'.join(filter(None, [prefix, group, version])) - resources_response = self.client.request('GET', path).resources or [] + try: + resources_response = self.client.request('GET', path).resources or [] + except ServiceUnavailableError: + resources_response = [] resources_raw = list(filter(lambda resource: '/' not in resource['name'], resources_response)) subresources_raw = list(filter(lambda resource: '/' in resource['name'], resources_response)) @@ -251,13 +254,11 @@ def __search(self, parts, resources, reqParams): # Check if we've requested resources for this group if not resourcePart.resources: prefix, group, version = reqParams[0], reqParams[1], part - try: - resourcePart.resources = self.get_resources_for_api_version(prefix, - group, part, resourcePart.preferred) - except NotFoundError: - raise ResourceNotFoundError + resourcePart.resources = self.get_resources_for_api_version( + prefix, group, part, resourcePart.preferred) + self._cache['resources'][prefix][group][version] = resourcePart - self.__update_cache=True + self.__update_cache = True return self.__search(parts[1:], resourcePart.resources, reqParams) elif isinstance(resourcePart, dict): # In this case parts [0] will be a specified prefix, group, version