Skip to content

Commit 917e725

Browse files
authored
Add additional rules for resolving ambiguity in resources.get (#333)
* Add additional rules for resolving ambiguity in resources.get * Store a complete lookup instead of just the kind
1 parent 32478d2 commit 917e725

File tree

2 files changed

+18
-5
lines changed

2 files changed

+18
-5
lines changed

openshift/dynamic/discovery.py

+12-1
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,14 @@ def get_resources_for_api_version(self, prefix, group, version, preferred):
208208
)
209209
resources[resource['kind']].append(resourceobj)
210210

211-
resource_list = ResourceList(self.client, group=group, api_version=version, base_kind=resource['kind'])
211+
resource_lookup = {
212+
'prefix': prefix,
213+
'group': group,
214+
'api_version': version,
215+
'kind': resourceobj.kind,
216+
'name': resourceobj.name
217+
}
218+
resource_list = ResourceList(self.client, group=group, api_version=version, base_kind=resource['kind'], base_resource_lookup=resource_lookup)
212219
resources[resource_list.kind].append(resource_list)
213220
return resources
214221

@@ -226,6 +233,10 @@ def get(self, **kwargs):
226233
# If there are multiple matches, prefer non-List kinds
227234
if len(results) > 1 and not all([isinstance(x, ResourceList) for x in results]):
228235
results = [result for result in results if not isinstance(result, ResourceList)]
236+
# if multiple resources are found that share a GVK, prefer the one with the most supported verbs
237+
if len(results) > 1 and len(set((x.group_version, x.kind) for x in results)) == 1:
238+
if len(set(len(x.verbs) for x in results)) != 1:
239+
results = [max(results, key=lambda x: len(x.verbs))]
229240
if len(results) == 1:
230241
return results[0]
231242
elif not results:

openshift/dynamic/resource.py

+6-4
Original file line numberDiff line numberDiff line change
@@ -93,19 +93,20 @@ def __getattr__(self, name):
9393
class ResourceList(Resource):
9494
""" Represents a list of API objects """
9595

96-
def __init__(self, client, group='', api_version='v1', base_kind='', kind=None):
96+
def __init__(self, client, group='', api_version='v1', base_kind='', kind=None, base_resource_lookup=None):
9797
self.client = client
9898
self.group = group
9999
self.api_version = api_version
100100
self.kind = kind or '{}List'.format(base_kind)
101101
self.base_kind = base_kind
102+
self.base_resource_lookup = base_resource_lookup
102103
self.__base_resource = None
103104

104105
def base_resource(self):
105106
if self.__base_resource:
106107
return self.__base_resource
107-
elif self.base_kind:
108-
self.__base_resource = self.client.resources.get(group=self.group, api_version=self.api_version, kind=self.base_kind)
108+
elif self.base_resource_lookup:
109+
self.__base_resource = self.client.resources.get(**self.base_resource_lookup)
109110
return self.__base_resource
110111
return None
111112

@@ -204,7 +205,8 @@ def to_dict(self):
204205
'group': self.group,
205206
'api_version': self.api_version,
206207
'kind': self.kind,
207-
'base_kind': self.base_kind
208+
'base_kind': self.base_kind,
209+
'base_resource_lookup': self.base_resource_lookup
208210
}
209211

210212
def __getattr__(self, name):

0 commit comments

Comments
 (0)