From 2f5cd6295bcc96555410accb89bcb5415772a68d Mon Sep 17 00:00:00 2001 From: Ondra Machacek Date: Fri, 22 Mar 2019 11:50:39 +0100 Subject: [PATCH] Make list from kind resource item --- openshift/dynamic/client.py | 18 ++++++------ test/unit/test_resource_container.py | 41 ++++++++++++++++++++++++++-- 2 files changed, 48 insertions(+), 11 deletions(-) diff --git a/openshift/dynamic/client.py b/openshift/dynamic/client.py index 1283e1d1..07cfdef8 100755 --- a/openshift/dynamic/client.py +++ b/openshift/dynamic/client.py @@ -6,6 +6,7 @@ import json import hashlib import tempfile +from collections import defaultdict from functools import partial from six import PY2, PY3 @@ -185,7 +186,7 @@ def parse_api_groups(self): def get_resources_for_api_version(self, prefix, group, version, preferred): """ returns a dictionary of resources associated with provided groupVersion""" - resources = {} + resources = defaultdict(list) subresources = {} path = '/'.join(filter(None, [prefix, group, version])) @@ -204,7 +205,7 @@ def get_resources_for_api_version(self, prefix, group, version, preferred): for key in ('prefix', 'group', 'api_version', 'client', 'preferred'): resource.pop(key, None) - resources[resource['kind']] = Resource( + resourceobj = Resource( prefix=prefix, group=group, api_version=version, @@ -213,7 +214,8 @@ def get_resources_for_api_version(self, prefix, group, version, preferred): subresources=subresources.get(resource['name']), **resource ) - resources['{}List'.format(resource['kind'])] = ResourceList(resources[resource['kind']]) + resources[resource['kind']].append(resourceobj) + resources['{}List'.format(resource['kind'])].append(ResourceList(resourceobj)) return resources def ensure_namespace(self, resource, namespace, body): @@ -668,13 +670,13 @@ def __search(self, parts, resources): if isinstance(resources.get(part), dict): return self.__search(parts[1:], resources[part]) else: - resource = resources.get(part) if parts[1] != '*' and isinstance(parts[1], dict): - for term, value in parts[1].items(): - if getattr(resource, term) == value: - return [resource] + for resource in resources.get(part): + for term, value in parts[1].items(): + if getattr(resource, term) == value: + return [resource] else: - return [resource] + return resources.get(part) elif part == '*': matches = [] for key in resources.keys(): diff --git a/test/unit/test_resource_container.py b/test/unit/test_resource_container.py index 5dd86573..9dca2ef9 100644 --- a/test/unit/test_resource_container.py +++ b/test/unit/test_resource_container.py @@ -4,6 +4,33 @@ from openshift.dynamic import DynamicClient, Resource, ResourceList +@pytest.fixture(scope='module') +def mock_templates(): + return Resource( + api_version='v1', + kind='Template', + name='templates', + namespaced=True, + preferred=True, + prefix='api', + shorter_names=[], + shortNames=[], + verbs=['create', 'delete', 'get', 'list', 'patch', 'update', 'watch'] + ) + +@pytest.fixture(scope='module') +def mock_processedtemplates(): + return Resource( + api_version='v1', + kind='Template', + name='processedtemplates', + namespaced=True, + preferred=True, + prefix='api', + shorter_names=[], + shortNames=[], + verbs=['create', 'delete', 'get', 'list', 'patch', 'update', 'watch'] + ) @pytest.fixture(scope='module') def mock_namespace(): @@ -26,7 +53,7 @@ def mock_namespace_list(mock_namespace): return ResourceList(mock_namespace) @pytest.fixture(scope='function', autouse=True) -def setup_client_monkeypatch(monkeypatch, mock_namespace, mock_namespace_list): +def setup_client_monkeypatch(monkeypatch, mock_namespace, mock_namespace_list, mock_templates, mock_processedtemplates): def mock_load_server_info(self): self.__version = {'kubernetes': 'mock-k8s-version'} @@ -36,8 +63,9 @@ def mock_parse_api_groups(self): 'api': { '': { 'v1': { - 'Namespace': mock_namespace, - 'NamespaceList': mock_namespace_list + 'Namespace': [mock_namespace], + 'NamespaceList': [mock_namespace_list], + 'Template': [mock_templates, mock_processedtemplates], } } } @@ -80,3 +108,10 @@ def test_get_namespace_list_kind(client, mock_namespace_list): resource = client.resources.get(api_version='v1', kind='NamespaceList') assert resource == mock_namespace_list + +def test_search_multiple_resources_for_template(client, mock_templates, mock_processedtemplates): + resources = client.resources.search(api_version='v1', kind='Template') + + assert len(resources) == 2 + assert mock_templates in resources + assert mock_processedtemplates in resources