diff --git a/docs/api-objects.rst b/docs/api-objects.rst index 0cc501434..451e411b8 100644 --- a/docs/api-objects.rst +++ b/docs/api-objects.rst @@ -34,6 +34,8 @@ API examples gl_objects/pagesdomains gl_objects/projects gl_objects/runners + gl_objects/repositories + gl_objects/repository_tags gl_objects/search gl_objects/settings gl_objects/snippets diff --git a/docs/gl_objects/repositories.rst b/docs/gl_objects/repositories.rst new file mode 100644 index 000000000..6622c0c1f --- /dev/null +++ b/docs/gl_objects/repositories.rst @@ -0,0 +1,28 @@ +##################### +Registry Repositories +##################### + +References +---------- + +* v4 API: + + + :class:`gitlab.v4.objects.ProjectRegistryRepository` + + :class:`gitlab.v4.objects.ProjectRegistryRepositoryManager` + + :attr:`gitlab.v4.objects.Project.repositories` + +* Gitlab API: https://docs.gitlab.com/ce/api/container_registry.html + +Examples +-------- + +Get the list of container registry repositories associated with the project:: + + repositories = project.repositories.list() + +Delete repository:: + + project.repositories.delete(id=x) + # or + repository = repositories.pop() + repository.delete() diff --git a/docs/gl_objects/repository_tags.rst b/docs/gl_objects/repository_tags.rst new file mode 100644 index 000000000..94593da96 --- /dev/null +++ b/docs/gl_objects/repository_tags.rst @@ -0,0 +1,47 @@ +######################## +Registry Repository Tags +######################## + +References +---------- + +* v4 API: + + + :class:`gitlab.v4.objects.ProjectRegistryTag` + + :class:`gitlab.v4.objects.ProjectRegistryTagManager` + + :attr:`gitlab.v4.objects.Repository.tags` + +* Gitlab API: https://docs.gitlab.com/ce/api/container_registry.html + +Examples +-------- + +Get the list of repository tags in given registry:: + + repositories = project.repositories.list() + repository = repositories.pop() + tags = repository.tags.list() + +Get specific tag:: + + repository.tags.get(id=tag_name) + +Delete tag:: + + repository.tags.delete(id=tag_name) + # or + tag = repository.tags.get(id=tag_name) + tag.delete() + +Delete tag in bulk:: + + repository.tags.delete_in_bulk(keep_n=1) + # or + repository.tags.delete_in_bulk(older_than="1m") + # or + repository.tags.delete_in_bulk(name_regex="v.+", keep_n=2) + +.. note:: + + Delete in bulk is asnychronous operation and may take a while. + Refer to: https://docs.gitlab.com/ce/api/container_registry.html#delete-repository-tags-in-bulk diff --git a/gitlab/v4/objects.py b/gitlab/v4/objects.py index 57df67932..ed559cf91 100644 --- a/gitlab/v4/objects.py +++ b/gitlab/v4/objects.py @@ -1177,6 +1177,49 @@ class PagesDomainManager(ListMixin, RESTManager): _obj_cls = PagesDomain +class ProjectRegistryRepository(ObjectDeleteMixin, RESTObject): + _managers = ( + ('tags', 'ProjectRegistryTagManager'), + ) + + +class ProjectRegistryRepositoryManager(DeleteMixin, ListMixin, RESTManager): + _path = '/projects/%(project_id)s/registry/repositories' + _obj_cls = ProjectRegistryRepository + _from_parent_attrs = {'project_id': 'id'} + + +class ProjectRegistryTag(ObjectDeleteMixin, RESTObject): + _id_attr = 'name' + + +class ProjectRegistryTagManager(DeleteMixin, RetrieveMixin, RESTManager): + _obj_cls = ProjectRegistryTag + _from_parent_attrs = {'project_id': 'project_id', 'repository_id': 'id'} + _path = '/projects/%(project_id)s/registry/repositories/%(repository_id)s/tags' + + @cli.register_custom_action('ProjectRegistryTagManager', optional=('name_regex', 'keep_n', 'older_than')) + @exc.on_http_error(exc.GitlabDeleteError) + def delete_in_bulk(self, name_regex='.*', **kwargs): + """Delete Tag in bulk + + Args: + name_regex (string): The regex of the name to delete. To delete all + tags specify .*. + keep_n (integer): The amount of latest tags of given name to keep. + older_than (string): Tags to delete that are older than the given time, + written in human readable form 1h, 1d, 1month. + **kwargs: Extra options to send to the server (e.g. sudo) + Raises: + GitlabAuthenticationError: If authentication is not correct + GitlabDeleteError: If the server cannot perform the request + """ + valid_attrs = ['keep_n', 'older_than'] + data = {'name_regex': name_regex} + data.update({k: v for k, v in kwargs.items() if k in valid_attrs}) + self.gitlab.http_delete(self.path, query_data=data, **kwargs) + + class ProjectBoardList(SaveMixin, ObjectDeleteMixin, RESTObject): pass @@ -3286,6 +3329,7 @@ class Project(SaveMixin, ObjectDeleteMixin, RESTObject): ('pipelineschedules', 'ProjectPipelineScheduleManager'), ('pushrules', 'ProjectPushRulesManager'), ('releases', 'ProjectReleaseManager'), + ('repositories', 'ProjectRegistryRepositoryManager'), ('runners', 'ProjectRunnerManager'), ('services', 'ProjectServiceManager'), ('snippets', 'ProjectSnippetManager'),