From ae9c7b79c85df1b92cb6fc8958fd494a2c6d22e9 Mon Sep 17 00:00:00 2001 From: Andrey Pohilko Date: Wed, 26 Apr 2017 13:44:13 +0600 Subject: [PATCH] fixed issue #15, added tests of tags_like arg --- registry.py | 58 ++++++++++++++++++++++++++++++----------------------- test.py | 28 ++++++++++++++++++-------- 2 files changed, 53 insertions(+), 33 deletions(-) diff --git a/registry.py b/registry.py index 3113cc4..83ca7d2 100755 --- a/registry.py +++ b/registry.py @@ -146,6 +146,13 @@ class Registry: return tags_list + def list_tags_like(self, tag_like, args_tags_like): + for tag_like in args_tags_like: + print "tag like: {0}".format(tag_like) + for tag in all_tags_list: + if re.search(tag_like, tag): + print "Adding {0} to tags list".format(tag) + def get_tag_digest(self, image_name, tag): image_headers = self.send("/v2/{0}/manifests/{1}".format( image_name, tag), method="HEAD") @@ -361,6 +368,30 @@ def delete_tags( registry.delete_tag(image_name, tag, dry_run, keep_tag_digests) +def get_tags_like(args_tags_like, tags_list): + result = set() + for tag_like in args_tags_like: + print "tag like: {0}".format(tag_like) + for tag in tags_list: + if re.search(tag_like, tag): + print "Adding {0} to tags list".format(tag) + result.add(tag) + return result + +def get_tags(all_tags_list, image_name, tags_like): + # check if there are args for special tags + result = set() + if tags_like: + result = get_tags_like(tags_like, all_tags_list) + else: + result.update(all_tags_list) + + # get tags from image name if any + if ":" in image_name: + (image_name, tag_name) = image_name.split(":") + result = set(tag_name) + + return result def main_loop(args): @@ -384,29 +415,13 @@ def main_loop(args): print "---------------------------------" print "Image: {0}".format(image_name) - tags_list = set() all_tags_list = registry.list_tags(image_name) if not all_tags_list: print " no tags!" continue - if args.tags_like: - for tag_like in args.tags_like: - print "tag like: {0}".format(tag_like) - for tag in all_tags_list: - if re.search(tag_like, tag): - print "Adding {0} to tags list".format(tag) - tags_list.add(tag) - - # get tags from arguments if any - if ":" in image_name: - (image_name, tag_name) = image_name.split(":") - tags_list.add(tag_name) - - - if len(tags_list) == 0: - tags_list.update(all_tags_list) + tags_list = get_tags(all_tags_list, image_name, args.tags_like) # print tags and optionally layers for tag in tags_list: @@ -422,14 +437,7 @@ def main_loop(args): # add tags to "tags_to_keep" list, if we have regexp "tags_to_keep" entries: if args.keep_tags_like: - for keep_like in args.keep_tags_like: - print "keep tag like: {0}".format(keep_like) - for tag in tags_list: - if re.search(keep_like, tag): - print "Adding {0} to keep tags list".format(tag) - args.keep_tags.append(tag) - - + args.keep_tags.append(get_tags_like(args.keep_tags_like, tags_list)) # delete tags if told so diff --git a/test.py b/test.py index 7430d7f..572dde6 100644 --- a/test.py +++ b/test.py @@ -1,5 +1,5 @@ import unittest -from registry import Registry, Requests +from registry import Registry, Requests, get_tags from mock import MagicMock import requests @@ -20,6 +20,9 @@ class MockRequests: self.return_value.status_code = status_code self.return_value.text = text + + + class TestCreateMethod(unittest.TestCase): def test_create_nologin(self): r = Registry.create("testhost", None, False) @@ -178,14 +181,23 @@ class TestListTags(unittest.TestCase): self.assertEqual(response, []) self.assertEqual(self.registry.last_error, "list_tags: invalid json response") - def test_list_tags_ok_sorted(self): - def test_list_one_tag_ok(self): - self.registry.http.reset_return_value(status_code=200, - text=u'{"name":"image1","tags":["0.1.306", "0.1.300", "0.1.290"]}') + def test_list_one_tag_sorted(self): + self.registry.http.reset_return_value(status_code=200, + text=u'{"name":"image1","tags":["0.1.306", "0.1.300", "0.1.290"]}') + + response = self.registry.list_tags('image1') + self.assertEqual(response, ["0.1.290", "0.1.300", "0.1.306"]) + self.assertEqual(self.registry.last_error, None) + + def test_list_tags_like_various(self): + tags_list = set(['FINAL_0.1', 'SNAPSHOT_0.1', "0.1.SNAP", "1.0.0_FINAL"]) + self.assertEqual(get_tags(tags_list, "", set(["FINAL"])), set(["FINAL_0.1", "1.0.0_FINAL"])) + self.assertEqual(get_tags(tags_list, "", set(["SNAPSHOT"])), set(['SNAPSHOT_0.1'])) + self.assertEqual(get_tags(tags_list, "", set()), + set(['FINAL_0.1', 'SNAPSHOT_0.1', "0.1.SNAP", "1.0.0_FINAL"])) + self.assertEqual(get_tags(tags_list, "", set(["ABSENT"])), set()) + - response = self.registry.list_tags('image1') - self.assertEqual(response, ["0.1.290", "0.1.300", "0.1.306"]) - self.assertEqual(self.registry.last_error, None) class TestListDigest(unittest.TestCase):