summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Wittig <max.wittig95@gmail.com>2019-05-10 15:31:59 +0200
committerGitHub <noreply@github.com>2019-05-10 15:31:59 +0200
commit84bcdc0c452d2ada9a47aa9907d7551aeac23821 (patch)
tree8a8d7fdc43c90e9fe433dcc068d4fefbd965762e
parent3dc64131eaec7d08b059039f446cc8d8c4b58c81 (diff)
parent2d9078e8e785e3a17429623693f84bbf8526ee58 (diff)
downloadgitlab-84bcdc0c452d2ada9a47aa9907d7551aeac23821.tar.gz
Merge pull request #759 from kkoralsky/registry_api
registry api implementation
-rw-r--r--docs/api-objects.rst2
-rw-r--r--docs/gl_objects/repositories.rst28
-rw-r--r--docs/gl_objects/repository_tags.rst47
-rw-r--r--gitlab/v4/objects.py44
4 files changed, 121 insertions, 0 deletions
diff --git a/docs/api-objects.rst b/docs/api-objects.rst
index 0cc5014..451e411 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 0000000..6622c0c
--- /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 0000000..94593da
--- /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 57df679..ed559cf 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'),