1package gitlab
2
3import (
4 "fmt"
5 "time"
6)
7
8// ContainerRegistryService handles communication with the container registry
9// related methods of the GitLab API.
10//
11// GitLab API docs: https://docs.gitlab.com/ee/api/container_registry.html
12type ContainerRegistryService struct {
13 client *Client
14}
15
16// RegistryRepository represents a GitLab content registry repository.
17//
18// GitLab API docs: https://docs.gitlab.com/ee/api/container_registry.html
19type RegistryRepository struct {
20 ID int `json:"id"`
21 Name string `json:"name"`
22 Path string `json:"path"`
23 Location string `json:"location"`
24 CreatedAt *time.Time `json:"created_at"`
25}
26
27func (s RegistryRepository) String() string {
28 return Stringify(s)
29}
30
31// RegistryRepositoryTag represents a GitLab registry image tag.
32//
33// GitLab API docs: https://docs.gitlab.com/ee/api/container_registry.html
34type RegistryRepositoryTag struct {
35 Name string `json:"name"`
36 Path string `json:"path"`
37 Location string `json:"location"`
38 Revision string `json:"revision"`
39 ShortRevision string `json:"short_revision"`
40 Digest string `json:"digest"`
41 CreatedAt *time.Time `json:"created_at"`
42 TotalSize int `json:"total_size"`
43}
44
45func (s RegistryRepositoryTag) String() string {
46 return Stringify(s)
47}
48
49// ListRegistryRepositoriesOptions represents the available
50// ListRegistryRepositories() options.
51//
52// GitLab API docs:
53// https://docs.gitlab.com/ee/api/container_registry.html#list-registry-repositories
54type ListRegistryRepositoriesOptions ListOptions
55
56// ListRegistryRepositories gets a list of registry repositories in a project.
57//
58// GitLab API docs:
59// https://docs.gitlab.com/ee/api/container_registry.html#list-registry-repositories
60func (s *ContainerRegistryService) ListRegistryRepositories(pid interface{}, opt *ListRegistryRepositoriesOptions, options ...OptionFunc) ([]*RegistryRepository, *Response, error) {
61 project, err := parseID(pid)
62 if err != nil {
63 return nil, nil, err
64 }
65 u := fmt.Sprintf("projects/%s/registry/repositories", pathEscape(project))
66
67 req, err := s.client.NewRequest("GET", u, opt, options)
68 if err != nil {
69 return nil, nil, err
70 }
71
72 var repos []*RegistryRepository
73 resp, err := s.client.Do(req, &repos)
74 if err != nil {
75 return nil, resp, err
76 }
77
78 return repos, resp, err
79}
80
81// DeleteRegistryRepository deletes a repository in a registry.
82//
83// GitLab API docs:
84// https://docs.gitlab.com/ee/api/container_registry.html#delete-registry-repository
85func (s *ContainerRegistryService) DeleteRegistryRepository(pid interface{}, repository int, options ...OptionFunc) (*Response, error) {
86 project, err := parseID(pid)
87 if err != nil {
88 return nil, err
89 }
90 u := fmt.Sprintf("projects/%s/registry/repositories/%d", pathEscape(project), repository)
91
92 req, err := s.client.NewRequest("DELETE", u, nil, options)
93 if err != nil {
94 return nil, err
95 }
96
97 return s.client.Do(req, nil)
98}
99
100// ListRegistryRepositoryTagsOptions represents the available
101// ListRegistryRepositoryTags() options.
102//
103// GitLab API docs:
104// https://docs.gitlab.com/ee/api/container_registry.html#list-repository-tags
105type ListRegistryRepositoryTagsOptions ListOptions
106
107// ListRegistryRepositoryTags gets a list of tags for given registry repository.
108//
109// GitLab API docs:
110// https://docs.gitlab.com/ee/api/container_registry.html#list-repository-tags
111func (s *ContainerRegistryService) ListRegistryRepositoryTags(pid interface{}, repository int, opt *ListRegistryRepositoryTagsOptions, options ...OptionFunc) ([]*RegistryRepositoryTag, *Response, error) {
112 project, err := parseID(pid)
113 if err != nil {
114 return nil, nil, err
115 }
116 u := fmt.Sprintf("projects/%s/registry/repositories/%d/tags",
117 pathEscape(project),
118 repository,
119 )
120
121 req, err := s.client.NewRequest("GET", u, opt, options)
122 if err != nil {
123 return nil, nil, err
124 }
125
126 var tags []*RegistryRepositoryTag
127 resp, err := s.client.Do(req, &tags)
128 if err != nil {
129 return nil, resp, err
130 }
131
132 return tags, resp, err
133}
134
135// GetRegistryRepositoryTagDetail get details of a registry repository tag
136//
137// GitLab API docs:
138// https://docs.gitlab.com/ee/api/container_registry.html#get-details-of-a-repository-tag
139func (s *ContainerRegistryService) GetRegistryRepositoryTagDetail(pid interface{}, repository int, tagName string, options ...OptionFunc) (*RegistryRepositoryTag, *Response, error) {
140 project, err := parseID(pid)
141 if err != nil {
142 return nil, nil, err
143 }
144 u := fmt.Sprintf("projects/%s/registry/repositories/%d/tags/%s",
145 pathEscape(project),
146 repository,
147 tagName,
148 )
149
150 req, err := s.client.NewRequest("GET", u, nil, options)
151 if err != nil {
152 return nil, nil, err
153 }
154
155 tag := new(RegistryRepositoryTag)
156 resp, err := s.client.Do(req, &tag)
157 if err != nil {
158 return nil, resp, err
159 }
160
161 return tag, resp, err
162}
163
164// DeleteRegistryRepositoryTag deletes a registry repository tag.
165//
166// GitLab API docs:
167// https://docs.gitlab.com/ee/api/container_registry.html#delete-a-repository-tag
168func (s *ContainerRegistryService) DeleteRegistryRepositoryTag(pid interface{}, repository int, tagName string, options ...OptionFunc) (*Response, error) {
169 project, err := parseID(pid)
170 if err != nil {
171 return nil, err
172 }
173 u := fmt.Sprintf("projects/%s/registry/repositories/%d/tags/%s",
174 pathEscape(project),
175 repository,
176 tagName,
177 )
178
179 req, err := s.client.NewRequest("DELETE", u, nil, options)
180 if err != nil {
181 return nil, err
182 }
183
184 return s.client.Do(req, nil)
185}
186
187// DeleteRegistryRepositoryTagsOptions represents the available
188// DeleteRegistryRepositoryTags() options.
189//
190// GitLab API docs:
191// https://docs.gitlab.com/ee/api/container_registry.html#delete-repository-tags-in-bulk
192type DeleteRegistryRepositoryTagsOptions struct {
193 NameRegexp *string `url:"name_regex,omitempty" json:"name_regex,omitempty"`
194 KeepN *int `url:"keep_n,omitempty" json:"keep_n,omitempty"`
195 OlderThan *string `url:"older_than,omitempty" json:"older_than,omitempty"`
196}
197
198// DeleteRegistryRepositoryTags deletes repository tags in bulk based on
199// given criteria.
200//
201// GitLab API docs:
202// https://docs.gitlab.com/ee/api/container_registry.html#delete-repository-tags-in-bulk
203func (s *ContainerRegistryService) DeleteRegistryRepositoryTags(pid interface{}, repository int, opt *DeleteRegistryRepositoryTagsOptions, options ...OptionFunc) (*Response, error) {
204 project, err := parseID(pid)
205 if err != nil {
206 return nil, err
207 }
208 u := fmt.Sprintf("projects/%s/registry/repositories/%d/tags",
209 pathEscape(project),
210 repository,
211 )
212
213 req, err := s.client.NewRequest("DELETE", u, opt, options)
214 if err != nil {
215 return nil, err
216 }
217
218 return s.client.Do(req, nil)
219}