Skip to content

Commit

Permalink
add ErrataConnector::get_filter() helper method
Browse files Browse the repository at this point in the history
- helper method to implement general filter query pattern
- add support for release/product difference in nesting filter
  parameters
- support for paginated requests
- basic unittest for filter helper based on usage

Works with the following

et.get_filter('/api/v1/releases', 'filter', is_active="true",
	  enabled="true", name='OpenStack 14.0.z for RHEL 7')

works with the following
et.get_filter('/errata', 'errata_filter[filter_params]',
	  show_type_RHBA=1, show_type_RHEA=1, show_type_RHSA=1,
	  show_state_NEW_FILES=1, show_state_QE=1,
          show_state_REL_PREP=1,show_state_PUSH_READY=1,
          open_closed_option='exclude', release=856)

Note: errata endpoint releases and products have to be special
handled to include extra [] and multiple entries if you want them

Related: red-hat-storage#132
  • Loading branch information
yazug committed Apr 27, 2020
1 parent 8cfbe98 commit 2595214
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 0 deletions.
34 changes: 34 additions & 0 deletions errata_tool/connector.py
Original file line number Diff line number Diff line change
Expand Up @@ -310,3 +310,37 @@ def get_paginated_data(self, api_url):
if page_number >= PAGE_LIMIT:
raise RuntimeError('hit pagination timeout: %d' % page_number)
return data

def get_filter(self, endpoint, filter_arg, **kwargs):
"""format and generate filter get request
expose a general filter helper method to format kwargs up
as parameters for ET filter request. Then return generated
json object
"""

if endpoint is None or filter_arg is None:
return None

url = endpoint + "?"
param_list = []
keys = list(kwargs)
keys.sort()
for k in keys:
v = kwargs[k]
if k in ('paginated'):
continue
if k in ('release', 'product'):
param_list.append("{0}[{1}][]={2}".format(filter_arg, k, v))
else:
param_list.append("{0}[{1}]={2}".format(filter_arg, k, v))
print(param_list)
url = url + "&".join(param_list)
if endpoint == '/errata':
url = url + '&format=json'
print(url)

if 'paginated' in kwargs and kwargs['paginated']:
return {'data': self.get_paginated_data(url)}

return self._get(url)
8 changes: 8 additions & 0 deletions errata_tool/tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,14 @@ def mock_put():
return RequestRecorder()


@pytest.fixture
def sample_connector(monkeypatch, mock_get):
monkeypatch.delattr('requests.sessions.Session.request')
monkeypatch.setattr(ErrataConnector, '_auth', None)
monkeypatch.setattr(ErrataConnector, '_username', 'test')
monkeypatch.setattr(requests, 'get', mock_get)
return ErrataConnector()

@pytest.fixture
def advisory(monkeypatch, mock_get):
monkeypatch.delattr('requests.sessions.Session.request')
Expand Down
33 changes: 33 additions & 0 deletions errata_tool/tests/test_filter.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import requests


class TestFilter(object):

def test_filter_none(self, sample_connector):
assert sample_connector.get_filter(None, None) is None

def test_filter_sample(self, sample_connector):
assert sample_connector.get_filter(
'/api/v1/releases', 'filter', name='rhceph-3.1')

def test_filter_sample_check_url(self, monkeypatch, mock_get,
sample_connector):
monkeypatch.setattr(requests, 'get', mock_get)
assert sample_connector.get_filter(
'/api/v1/releases', 'filter', name='rhceph-3.1')
assert 'page' not in mock_get.response.url

def test_filter_url_paginated_false(self, monkeypatch,
mock_get, sample_connector):
monkeypatch.setattr(requests, 'get', mock_get)
assert sample_connector.get_filter(
'/api/v1/releases', 'filter', name='rhceph-3.1', paginated=False)
assert 'page' not in mock_get.response.url

def test_filter_sample_check_url_paginated(self, monkeypatch, mock_get,
sample_connector):
monkeypatch.setattr(requests, 'get', mock_get)
assert sample_connector.get_filter(
'/api/v1/external_tests/', 'filter', errata_id='33840',
test_type='rpmdiff', active='true', paginated=True)
assert 'page' in mock_get.response.url

0 comments on commit 2595214

Please sign in to comment.