diff --git a/endpoints/api/tag.py b/endpoints/api/tag.py index cc6ae3f39..7563e6c15 100644 --- a/endpoints/api/tag.py +++ b/endpoints/api/tag.py @@ -4,10 +4,9 @@ from flask import request, abort from auth.auth_context import get_authenticated_user from data import model -from endpoints.api import ( - resource, nickname, require_repo_read, require_repo_write, RepositoryParamResource, log_action, - validate_json_request, path_param, parse_args, query_param, truthy_bool, - disallow_for_app_repositories) +from endpoints.api import (resource, nickname, require_repo_read, require_repo_write, + RepositoryParamResource, log_action, validate_json_request, path_param, + parse_args, query_param, truthy_bool, disallow_for_app_repositories) from endpoints.api.image import image_view from endpoints.api.tag_interface.models_pre_oci import pre_oci_model from endpoints.exception import NotFound @@ -52,8 +51,9 @@ class ListRepositoryTags(RepositoryParamResource): page = max(1, parsed_args.get('page', 1)) limit = min(100, max(1, parsed_args.get('limit', 50))) - tag_history = pre_oci_model.list_repository_tag_history(namespace_name=namespace, repository_name=repository, - page=page, size=limit, specific_tag=specific_tag) + tag_history = pre_oci_model.list_repository_tag_history(namespace_name=namespace, + repository_name=repository, page=page, + size=limit, specific_tag=specific_tag) if not tag_history: raise NotFound() @@ -74,9 +74,7 @@ class RepositoryTag(RepositoryParamResource): 'MoveTag': { 'type': 'object', 'description': 'Description of to which image a new or existing tag should point', - 'required': [ - 'image', - ], + 'required': ['image',], 'properties': { 'image': { 'type': 'string', @@ -206,9 +204,7 @@ class RestoreTag(RepositoryParamResource): 'RestoreTag': { 'type': 'object', 'description': 'Restores a tag to a specific image', - 'required': [ - 'image', - ], + 'required': ['image',], 'properties': { 'image': { 'type': 'string', @@ -252,8 +248,8 @@ class RestoreTag(RepositoryParamResource): if existing_image is not None: log_data['original_image'] = existing_image.docker_image_id - log_action('revert_tag', namespace, log_data, repo=model.repository.get_repository( - namespace, repository)) + log_action('revert_tag', namespace, log_data, repo=model.repository.get_repository(namespace, + repository)) return { 'image_id': image_id, diff --git a/endpoints/api/tag_interface/models_interface.py b/endpoints/api/tag_interface/models_interface.py index ec2ec9093..c98737f9a 100644 --- a/endpoints/api/tag_interface/models_interface.py +++ b/endpoints/api/tag_interface/models_interface.py @@ -4,8 +4,11 @@ from collections import namedtuple from six import add_metaclass -class Tag(namedtuple('Tag', ['name', 'image', 'reversion', 'lifetime_start_ts', 'lifetime_end_ts', - 'manifest_list', 'docker_image_id'])): +class Tag( + namedtuple('Tag', [ + 'name', 'image', 'reversion', 'lifetime_start_ts', 'lifetime_end_ts', 'manifest_list', + 'docker_image_id' + ])): """ Tag represents a name to an image. :type name: string @@ -33,7 +36,8 @@ class TagDataInterface(object): """ @abstractmethod - def list_repository_tag_history(self, namespace_name, repository_name, page=1, size=100, specific_tag=None): + def list_repository_tag_history(self, namespace_name, repository_name, page=1, size=100, + specific_tag=None): """ Returns a RepositoryTagHistory with a list of historic tags and whether there are more tags then returned. """ diff --git a/endpoints/api/tag_interface/models_pre_oci.py b/endpoints/api/tag_interface/models_pre_oci.py index fe1025195..995b69de0 100644 --- a/endpoints/api/tag_interface/models_pre_oci.py +++ b/endpoints/api/tag_interface/models_pre_oci.py @@ -8,20 +8,23 @@ class PreOCIModel(TagDataInterface): before it was changed to support the OCI specification. """ - def list_repository_tag_history(self, namespace_name, repository_name, page=1, size=100, specific_tag=None): + def list_repository_tag_history(self, namespace_name, repository_name, page=1, size=100, + specific_tag=None): repository = model.repository.get_repository(namespace_name, repository_name) if repository is None: return None - tags, manifest_map, more = model.tag.list_repository_tag_history(repository, page, size, specific_tag) + tags, manifest_map, more = model.tag.list_repository_tag_history(repository, page, size, + specific_tag) repository_tag_history = [] for tag in tags: manifest_list = None if tag.id in manifest_map: manifest_list = manifest_map[tag.id] repository_tag_history.append( - Tag(name=tag.name, image=tag.image, reversion=tag.reversion, lifetime_start_ts=tag.lifetime_start_ts, - lifetime_end_ts=tag.lifetime_end_ts, manifest_list=manifest_list, - docker_image_id=tag.image.docker_image_id)) + Tag(name=tag.name, image=tag.image, reversion=tag.reversion, + lifetime_start_ts=tag.lifetime_start_ts, lifetime_end_ts=tag.lifetime_end_ts, + manifest_list=manifest_list, docker_image_id=tag.image.docker_image_id)) return RepositoryTagHistory(tags=repository_tag_history, more=more) + pre_oci_model = PreOCIModel() diff --git a/endpoints/api/tag_interface/test/test_models_pre_oci.py b/endpoints/api/tag_interface/test/test_models_pre_oci.py index ba2e462af..1df367dd1 100644 --- a/endpoints/api/tag_interface/test/test_models_pre_oci.py +++ b/endpoints/api/tag_interface/test/test_models_pre_oci.py @@ -5,12 +5,10 @@ from mock import Mock from data import model from endpoints.api.tag_interface.models_pre_oci import pre_oci_model + EMPTY_REPOSITORY = 'empty_repository' - EMPTY_NAMESPACE = 'empty_namespace' - BAD_REPOSITORY_NAME = 'bad_repository_name' - BAD_NAMESPACE_NAME = 'bad_namespace_name' @@ -34,7 +32,8 @@ def mock_out_get_repository(monkeypatch, namespace_name, repository_name): monkeypatch.setattr(model.repository, 'get_repository', return_function) -def create_mock_tag(name, reversion, lifetime_start_ts, lifetime_end_ts, mock_id, docker_image_id, manifest_list): +def create_mock_tag(name, reversion, lifetime_start_ts, lifetime_end_ts, mock_id, docker_image_id, + manifest_list): tag_mock = Mock() tag_mock.name = name image_mock = Mock() @@ -46,22 +45,28 @@ def create_mock_tag(name, reversion, lifetime_start_ts, lifetime_end_ts, mock_id tag_mock.id = mock_id tag_mock.manifest_list = manifest_list tag = Tag(name=name, reversion=reversion, image=image_mock, docker_image_id=docker_image_id, - lifetime_start_ts=lifetime_start_ts, lifetime_end_ts=lifetime_end_ts, manifest_list=manifest_list) + lifetime_start_ts=lifetime_start_ts, lifetime_end_ts=lifetime_end_ts, + manifest_list=manifest_list) return tag_mock, tag -first_mock, first_tag = create_mock_tag('tag1', 'rev1', 'start1', 'end1', 'id1', 'docker_image_id1', []) -second_mock, second_tag = create_mock_tag('tag2', 'rev2', 'start2', 'end2', 'id2', 'docker_image_id2', ['manifest']) +first_mock, first_tag = create_mock_tag('tag1', 'rev1', 'start1', 'end1', 'id1', + 'docker_image_id1', []) +second_mock, second_tag = create_mock_tag('tag2', 'rev2', 'start2', 'end2', 'id2', + 'docker_image_id2', ['manifest']) -def mock_out_list_repository_tag_history(monkeypatch, namespace_name, repository_name, page, size, specific_tag): +def mock_out_list_repository_tag_history(monkeypatch, namespace_name, repository_name, page, size, + specific_tag): def list_empty_tag_history(repository, page, size, specific_tag): return [], {}, False def list_filled_tag_history(repository, page, size, specific_tag): tags = [first_mock, second_mock] - return tags, {first_mock.id: first_mock.manifest_list, - second_mock.id: second_mock.manifest_list}, len(tags) > size + return tags, { + first_mock.id: first_mock.manifest_list, + second_mock.id: second_mock.manifest_list + }, len(tags) > size def list_only_second_tag(repository, page, size, specific_tag): tags = [second_mock] @@ -79,17 +84,21 @@ def mock_out_list_repository_tag_history(monkeypatch, namespace_name, repository @pytest.mark.parametrize( - 'expected, namespace_name, repository_name, page, size, specific_tag', - [(None, BAD_NAMESPACE_NAME, 'repository_name', 1, 100, None), - (None, 'namespace_name', BAD_REPOSITORY_NAME, 1, 100, None), - (RepositoryTagHistory(tags=[], more=False), EMPTY_NAMESPACE, EMPTY_REPOSITORY, 1, 100, None), - (RepositoryTagHistory(tags=[first_tag, second_tag], more=False), 'namespace', 'repository', 1, 100, None), - (RepositoryTagHistory(tags=[first_tag, second_tag], more=True), 'namespace', 'repository', 1, 1, None), - (RepositoryTagHistory(tags=[second_tag], more=False), 'namespace', 'repository', 1, 100, 'tag2'), - ]) -def test_list_repository_tag_history(expected, namespace_name, repository_name, - page, size, specific_tag, get_monkeypatch): + 'expected, namespace_name, repository_name, page, size, specific_tag', [ + (None, BAD_NAMESPACE_NAME, 'repository_name', 1, 100, None), + (None, 'namespace_name', BAD_REPOSITORY_NAME, 1, 100, None), + (RepositoryTagHistory(tags=[], more=False), EMPTY_NAMESPACE, EMPTY_REPOSITORY, 1, 100, None), + (RepositoryTagHistory(tags=[first_tag, second_tag], more=False), 'namespace', 'repository', 1, + 100, None), + (RepositoryTagHistory(tags=[first_tag, second_tag], more=True), 'namespace', 'repository', 1, + 1, None), + (RepositoryTagHistory(tags=[second_tag], more=False), 'namespace', 'repository', 1, 100, + 'tag2'), + ]) +def test_list_repository_tag_history(expected, namespace_name, repository_name, page, size, + specific_tag, get_monkeypatch): mock_out_get_repository(get_monkeypatch, namespace_name, repository_name) - mock_out_list_repository_tag_history(get_monkeypatch, namespace_name, repository_name, page, size, specific_tag) + mock_out_list_repository_tag_history(get_monkeypatch, namespace_name, repository_name, page, + size, specific_tag) assert pre_oci_model.list_repository_tag_history(namespace_name, repository_name, page, size, specific_tag) == expected