Skip to content
This repository has been archived by the owner on May 24, 2023. It is now read-only.

Commit

Permalink
Use different endpoint to get releases
Browse files Browse the repository at this point in the history
Endpoint /cnr/api/v1/packages?namespace=<org> provides information about
releases and is more efficient than listing all releases.

* OSBS-8334

Signed-off-by: Martin Bašti <mbasti@redhat.com>
  • Loading branch information
MartinBasti committed Dec 9, 2019
1 parent a00435b commit ac907bd
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 41 deletions.
36 changes: 21 additions & 15 deletions omps/quay.py
Original file line number Diff line number Diff line change
Expand Up @@ -309,17 +309,18 @@ def _handle_courier_exception(self, e):
msg = "Failed to push manifest: {}".format(e)
raise_for_courier_exception(e, new_msg=msg)

def _get_repo_content(self, repo):
def _get_org_content(self):
"""Return content of repository"""
endpoint = '/cnr/api/v1/packages/'
url = '{q}{e}{o}/{r}'.format(
q=self._quay_url,
e=endpoint,
o=self._organization,
r=repo,
)
endpoint = '/cnr/api/v1/packages'
url = f'{self._quay_url}{endpoint}'
headers = {'Authorization': self._token}
res = requests.get(url, headers=headers, timeout=self._timeout)
params = {'namespace': self._organization}
res = requests.get(
url,
headers=headers,
params=params,
timeout=self._timeout
)

res.raise_for_status()
return res.json()
Expand All @@ -345,19 +346,24 @@ def _raise(exc):
except ValueError:
quay_response = {}
raise QuayAuthorizationError(msg, quay_response)
elif exc.response.status_code == 404:
msg = ("Package {}/{} not found"
.format(self._organization, repo))
raise QuayPackageNotFound(msg)

raise QuayPackageError(msg)

def get_repo(org_response):
exp_name = f'{self._organization}/{repo}'
for r in org_response:
if r['name'] == exp_name:
return r

msg = f"Package {self._organization}/{repo} not found"
raise QuayPackageNotFound(msg)

try:
res = self._get_repo_content(repo)
res = self._get_org_content()
except requests.exceptions.RequestException as e:
_raise(e)

releases = [package['release'] for package in res]
releases = get_repo(res)['releases']
return releases

def get_releases(self, repo):
Expand Down
9 changes: 3 additions & 6 deletions tests/api/v2/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,8 @@
True, # endpoint with version
False, # endpoint without version
])
def endpoint_push_zipfile(request, release_version):
def endpoint_push_zipfile(request, release_version, organization):
"""Returns URL for zipfile endpoints"""
organization = 'testorg'
version = release_version if request.param else None

url_path = '/v2/{}/zipfile'.format(organization)
Expand All @@ -34,9 +33,8 @@ def endpoint_push_zipfile(request, release_version):
True, # endpoint with version
False, # endpoint without version
])
def endpoint_push_koji(request, release_version):
def endpoint_push_koji(request, release_version, organization):
"""Returns URL for koji endpoints"""
organization = 'testorg'
nvr = 'build-1.0.1-2'
version = release_version if request.param else None

Expand All @@ -54,9 +52,8 @@ def endpoint_push_koji(request, release_version):
True, # endpoint with version
False, # endpoint without version
])
def endpoint_packages(request, release_version):
def endpoint_packages(request, release_version, organization):
"""Returns URL for packages endpoints"""
organization = 'testorg'
repo = 'repo-Y'

url_path = '/v2/{}/{}'.format(organization, repo)
Expand Down
18 changes: 13 additions & 5 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@
ManifestDirMeta = namedtuple('ManifestDirMeta', ['path', 'pkg_name', 'valid'])


@pytest.fixture()
def organization():
return 'testorg'


@pytest.fixture()
def release_version():
return "0.0.1"
Expand Down Expand Up @@ -146,20 +151,23 @@ def mocked_quay_io():
"""Mocking quay.io answers"""
with requests_mock.Mocker() as m:
m.get(
re.compile(r'/cnr/api/v1/packages/.*'),
status_code=404,
re.compile(r'/cnr/api/v1/packages\?.*'),
json=[]
)
yield m


@pytest.fixture
def mocked_packages_delete_quay_io(release_version):
def mocked_packages_delete_quay_io(release_version, organization):
"""Mocking quay.io answers for retrieving and deleting packages"""
with requests_mock.Mocker() as m:
m.get(
re.compile(r'/cnr/api/v1/packages/.*'),
re.compile(r'/cnr/api/v1/packages\?.*'),
json=[
{"release": release_version},
{
"releases": [release_version],
"name": f'{organization}/repo-Y'
},
],
)
m.delete(
Expand Down
47 changes: 32 additions & 15 deletions tests/test_quay.py
Original file line number Diff line number Diff line change
Expand Up @@ -269,11 +269,16 @@ def test_get_latest_release_version(self):

with requests_mock.Mocker() as m:
m.get(
'/cnr/api/v1/packages/{}/{}'.format(org, repo),
f'/cnr/api/v1/packages?namespace={org}',
json=[
{'release': "1.0.0"},
{'release': "1.2.0"},
{'release': "1.0.1"},
{
'name': 'org/something_else',
'releases': ["2.0.0"],
},
{
'name': f'{org}/{repo}',
'releases': ["1.2.0", "1.1.0", "1.0.0"]
},
]
)

Expand All @@ -288,8 +293,13 @@ def test_get_latest_release_version_not_found(self):

with requests_mock.Mocker() as m:
m.get(
'/cnr/api/v1/packages/{}/{}'.format(org, repo),
status_code=404,
f'/cnr/api/v1/packages?namespace={org}',
json=[
{
'name': 'org/something_else',
'releases': ["2.0.0"],
}
]
)

qo = QuayOrganization(org, "token")
Expand All @@ -309,10 +319,13 @@ def test_get_latest_release_version_invalid_version_only(self):

with requests_mock.Mocker() as m:
m.get(
'/cnr/api/v1/packages/{}/{}'.format(org, repo),
f'/cnr/api/v1/packages?namespace={org}',
json=[
{'release': "1.0.0-invalid"},
],
{
'name': f'{org}/{repo}',
'releases': ["1.0.0-invalid"]
},
]
)

qo = QuayOrganization(org, "token")
Expand All @@ -327,11 +340,16 @@ def test_get_releases_raw(self):

with requests_mock.Mocker() as m:
m.get(
'/cnr/api/v1/packages/{}/{}'.format(org, repo),
f'/cnr/api/v1/packages?namespace={org}',
json=[
{'release': "1.0.0"},
{'release': "1.2.0"},
{'release': "1.0.1-random"},
{
'name': 'org/something_else',
'releases': ["2.0.0"],
},
{
'name': f'{org}/{repo}',
'releases': ["1.2.0", "1.0.1-random", "1.0.0"]
},
]
)

Expand All @@ -341,7 +359,6 @@ def test_get_releases_raw(self):

@pytest.mark.parametrize('error_code, expected_exc_type', [
(403, QuayAuthorizationError),
(404, QuayPackageNotFound),
(500, QuayPackageError)
])
def test_get_releases_raw_errors(self, error_code, expected_exc_type):
Expand All @@ -353,7 +370,7 @@ def test_get_releases_raw_errors(self, error_code, expected_exc_type):
qo = QuayOrganization(org, TOKEN)

with requests_mock.Mocker() as m:
m.get(f'/cnr/api/v1/packages/{org}/{repo}',
m.get(f'/cnr/api/v1/packages?namespace={org}',
status_code=error_code)

with pytest.raises(expected_exc_type):
Expand Down

0 comments on commit ac907bd

Please sign in to comment.