Skip to content

Commit

Permalink
Merge pull request #759 from kkoralsky/registry_api
Browse files Browse the repository at this point in the history
registry api implementation
  • Loading branch information
max-wittig committed May 10, 2019
2 parents 3dc6413 + 2d9078e commit 84bcdc0
Show file tree
Hide file tree
Showing 4 changed files with 121 additions and 0 deletions.
2 changes: 2 additions & 0 deletions docs/api-objects.rst
Expand Up @@ -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
Expand Down
28 changes: 28 additions & 0 deletions 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()
47 changes: 47 additions & 0 deletions 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
44 changes: 44 additions & 0 deletions gitlab/v4/objects.py
Expand Up @@ -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

Expand Down Expand Up @@ -3286,6 +3329,7 @@ class Project(SaveMixin, ObjectDeleteMixin, RESTObject):
('pipelineschedules', 'ProjectPipelineScheduleManager'),
('pushrules', 'ProjectPushRulesManager'),
('releases', 'ProjectReleaseManager'),
('repositories', 'ProjectRegistryRepositoryManager'),
('runners', 'ProjectRunnerManager'),
('services', 'ProjectServiceManager'),
('snippets', 'ProjectSnippetManager'),
Expand Down

0 comments on commit 84bcdc0

Please sign in to comment.