Skip to content

Commit cd95284

Browse files
committed
Fixed semantics for registry
1 parent 2aaf098 commit cd95284

1 file changed

Lines changed: 48 additions & 53 deletions

File tree

lain_admin_cli/registry.py

Lines changed: 48 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,24 @@
3636
DEFAULT_REMAIN_TIME = environ.get('REMAIN_TIME', 30 * 24 * 3600)
3737

3838

39+
class Repo:
40+
41+
def __init__(self, repo_name, tags):
42+
self.repo_name = repo_name
43+
self.tags = tags
44+
45+
46+
class Image:
47+
48+
def __init__(self, repo_name, tag, digest):
49+
self.repo_name = repo_name
50+
self.tag = tag
51+
self.digest = digest
52+
53+
def __str__(self):
54+
return "{%s, %s, %s}" % (self.repo_name, self.tag, self.digest)
55+
56+
3957
def _time_during(ts1, ts2, t):
4058
total_seconds = (datetime.fromtimestamp(ts1) -
4159
datetime.fromtimestamp(ts2)).total_seconds()
@@ -118,25 +136,7 @@ def _token_url(auth_head):
118136
return token_url
119137

120138

121-
class Repo:
122-
123-
def __init__(self, repo_name, tags):
124-
self.repo_name = repo_name
125-
self.tags = tags
126-
127-
128-
class Image:
129-
130-
def __init__(self, repo_name, tag, digest):
131-
self.repo_name = repo_name
132-
self.tag = tag
133-
self.digest = digest
134-
135-
def __str__(self):
136-
return "{%s, %s, %s}" % (self.repo_name, self.tag, self.digest)
137-
138-
139-
def _repos_in_registry(session):
139+
def _registry_repos(session):
140140
repo_url = REPOS_URL_TEMPLATE % registry_host
141141
resp = _request(session, 'GET', repo_url)
142142
if resp is None:
@@ -157,7 +157,7 @@ def _digest_from_tag(session, repo, tag):
157157
return resp.headers.get('Docker-Content-Digest')
158158

159159

160-
def _images_in_repo(session, repo):
160+
def _repo_images(session, repo):
161161
tags_url = TAGS_URL_TEMPLATE % (registry_host, repo)
162162
resp = _request(session, 'GET', tags_url)
163163
if resp is None:
@@ -194,49 +194,45 @@ def _image_timestamp(image):
194194
return 0
195195

196196

197-
def _image_delete(session, image):
197+
def _delete_image(session, image):
198198
info("Deleting image: %s", image)
199199
manifest_url = MANIFEST_URL_TEMPLATE % (
200200
registry_host, image.repo_name, image.digest)
201201
resp = _request(session, 'DELETE', manifest_url)
202202
info("Delete image(%s) result:%s ", image, resp)
203203

204204

205-
def repo_tags_inorder(session, repo):
206-
images = _images_in_repo(session, repo)
205+
def ordered_images(session, repo):
206+
images = _repo_images(session, repo)
207207
times_images = {}
208-
index = 0
209208
for image in images:
210209
timestamp = _image_timestamp(image)
211-
if timestamp == 0:
212-
timestamp = index
213-
index += 1
214-
times_images[str(timestamp)+image.tag] = image
210+
times_images[str(timestamp) + image.tag] = image
215211
return sort_map_values(times_images)
216212

217213

218-
def repo_tag_delete(session, repo, tag):
214+
def delete_image_tag(session, repo, tag):
219215
digest = _digest_from_tag(session, repo, tag)
220216
if digest == '':
221217
error('no such repo or repo has no such tag')
222218
return
223219
image = Image(repo, tag, digest)
224-
_image_delete(session, image)
220+
_delete_image(session, image)
225221

226222

227-
def repo_delete(session, repo):
223+
def delete_repo(session, repo):
228224
info('start delete repo:%s!', repo)
229-
images = _images_in_repo(session, repo)
225+
images = _repo_images(session, repo)
230226
for image in images:
231-
_image_delete(session, image)
227+
_delete_image(session, image)
232228
info('delete repo:%s over!', repo)
233229

234230

235-
def expired_repo_clear(session, repo, repo_remain, time_remain):
231+
def clear_expired_repo(session, repo, repo_remain, time_remain):
236232
info('----------------------------')
237233
info('Start clean registry repo %s', repo)
238234
try:
239-
images = _images_in_repo(session, repo)
235+
images = _repo_images(session, repo)
240236
if len(images) <= repo_remain:
241237
return
242238
meta_images_map = {}
@@ -247,10 +243,9 @@ def expired_repo_clear(session, repo, repo_remain, time_remain):
247243
timestamp = _image_timestamp(image)
248244
if timestamp == 0:
249245
if image.tag.find('-config-') > 0:
250-
info("Deleting special config image: %s", image)
251-
_image_delete(session, image)
246+
info("specific config image: %s", image)
247+
_delete_image(session, image)
252248
continue
253-
254249
if(_time_during(now, timestamp, time_remain)):
255250
continue
256251
if image.tag.startswith(META):
@@ -265,25 +260,25 @@ def expired_repo_clear(session, repo, repo_remain, time_remain):
265260
rels_images = sort_map_values(rels_images_map)
266261

267262
for image in prep_images[repo_remain:]:
268-
_image_delete(session, image)
263+
_delete_image(session, image)
269264
for image in meta_images[repo_remain:]:
270-
_image_delete(session, image)
265+
_delete_image(session, image)
271266
for image in rels_images[repo_remain:]:
272-
_image_delete(session, image)
267+
_delete_image(session, image)
273268
except Exception as e:
274269
error('Clean registry failed! error:%s', str(e))
275270
finally:
276271
info('Clean registry repo %s over', repo)
277272

278273

279-
def expired_all_repos_clear(session, repo_remain, time_remain):
274+
def clear_all_expired_repos(session, repo_remain, time_remain):
280275
info('Start clean registry')
281276
info('============================')
282-
repos = _repos_in_registry(session)
277+
repos = _registry_repos(session)
283278
if not isinstance(repos, list) or len(repos) == 0:
284279
return
285280
for repo in repos:
286-
expired_repo_clear(session, repo, repo_remain, time_remain)
281+
clear_expired_repo(session, repo, repo_remain, time_remain)
287282
info('============================')
288283
info('Clean registry over')
289284

@@ -297,7 +292,7 @@ class Registry(TwoLevelCommandBase):
297292

298293
@classmethod
299294
def subcommands(self):
300-
return [self.list, self.clean, self.delete]
295+
return [self.list, self.delete, self.clean]
301296

302297
@classmethod
303298
def namespace(self):
@@ -310,18 +305,18 @@ def help_message(self):
310305
@classmethod
311306
@arg('-t', '--target', required=False, help="target repository in registry")
312307
@arg('-s', '--sort', required=False, help="return results in order")
313-
def list(self, target="all", sort=True):
308+
def list(self, target="all", sort=False):
314309
session = requests.Session()
315310
self._update_domain()
316311
if target == "all":
317-
repos = _repos_in_registry(session)
312+
repos = _registry_repos(session)
318313
for repo in repos:
319314
info(repo)
320315
else:
321316
if sort:
322-
images = repo_tags_inorder(session, target)
317+
images = ordered_images(session, target)
323318
else:
324-
images = _images_in_repo(session, target)
319+
images = _repo_images(session, target)
325320
for image in images:
326321
info('%s', image)
327322

@@ -332,9 +327,9 @@ def delete(self, repo='', tag=''):
332327
session = requests.Session()
333328
self._update_domain()
334329
if tag != '':
335-
repo_tag_delete(session, repo, tag)
330+
delete_image_tag(session, repo, tag)
336331
else:
337-
repo_delete(session, repo)
332+
delete_repo(session, repo)
338333

339334
@classmethod
340335
@arg('-t', '--target', required=False, help="clean target repository in registry")
@@ -348,9 +343,9 @@ def clean(self, num=20, time=DEFAULT_REMAIN_TIME, target="all"):
348343
if time < 1:
349344
raise CommandError("time must bigger than 0")
350345
if target == "all":
351-
expired_all_repos_clear(session, num, time)
346+
clear_all_expired_repos(session, num, time)
352347
else:
353-
expired_repo_clear(session, target, num, time)
348+
clear_expired_repo(session, target, num, time)
354349

355350
@classmethod
356351
def _update_domain(self):

0 commit comments

Comments
 (0)