Skip to content

Commit

Permalink
Add additional rules for resolving ambiguity in resources.get (#333)
Browse files Browse the repository at this point in the history
* Add additional rules for resolving ambiguity in resources.get

* Store a complete lookup instead of just the kind
  • Loading branch information
fabianvf authored Nov 19, 2019
1 parent 32478d2 commit 917e725
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 5 deletions.
13 changes: 12 additions & 1 deletion openshift/dynamic/discovery.py
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,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

Expand All @@ -226,6 +233,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:
Expand Down
10 changes: 6 additions & 4 deletions openshift/dynamic/resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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):
Expand Down

0 comments on commit 917e725

Please sign in to comment.