diff --git a/openshift/dynamic/discovery.py b/openshift/dynamic/discovery.py index 3efc1a34..7cdc1e66 100644 --- a/openshift/dynamic/discovery.py +++ b/openshift/dynamic/discovery.py @@ -189,7 +189,14 @@ def get_resources_for_api_version(self, prefix, group, version, preferred): ) resources[resource['kind']].append(resourceobj) - resource_list = ResourceList(self.client, group=group, api_version=version, base_kind=resource['kind']) + resource_lookup = { + 'prefix': prefix, + 'group': group, + 'api_version': version, + 'kind': resourceobj.kind, + 'name': resourceobj.name + } + resource_list = ResourceList(self.client, group=group, api_version=version, base_kind=resource['kind'], base_resource_lookup=resource_lookup) resources[resource_list.kind].append(resource_list) return resources @@ -207,6 +214,10 @@ def get(self, **kwargs): # If there are multiple matches, prefer non-List kinds if len(results) > 1 and not all([isinstance(x, ResourceList) for x in results]): results = [result for result in results if not isinstance(result, ResourceList)] + # if multiple resources are found that share a GVK, prefer the one with the most supported verbs + if len(results) > 1 and len(set((x.group_version, x.kind) for x in results)) == 1: + if len(set(len(x.verbs) for x in results)) != 1: + results = [max(results, key=lambda x: len(x.verbs))] if len(results) == 1: return results[0] elif not results: diff --git a/openshift/dynamic/resource.py b/openshift/dynamic/resource.py index d88a19d6..5b0cdec7 100644 --- a/openshift/dynamic/resource.py +++ b/openshift/dynamic/resource.py @@ -93,19 +93,20 @@ def __getattr__(self, name): class ResourceList(Resource): """ Represents a list of API objects """ - def __init__(self, client, group='', api_version='v1', base_kind='', kind=None): + def __init__(self, client, group='', api_version='v1', base_kind='', kind=None, base_resource_lookup=None): self.client = client self.group = group self.api_version = api_version self.kind = kind or '{}List'.format(base_kind) self.base_kind = base_kind + self.base_resource_lookup = base_resource_lookup self.__base_resource = None def base_resource(self): if self.__base_resource: return self.__base_resource - elif self.base_kind: - self.__base_resource = self.client.resources.get(group=self.group, api_version=self.api_version, kind=self.base_kind) + elif self.base_resource_lookup: + self.__base_resource = self.client.resources.get(**self.base_resource_lookup) return self.__base_resource return None @@ -204,7 +205,8 @@ def to_dict(self): 'group': self.group, 'api_version': self.api_version, 'kind': self.kind, - 'base_kind': self.base_kind + 'base_kind': self.base_kind, + 'base_resource_lookup': self.base_resource_lookup } def __getattr__(self, name):