fixed issue #15, added tests of tags_like arg

This commit is contained in:
Andrey Pohilko
2017-04-26 13:44:13 +06:00
parent 2e46e8197b
commit ae9c7b79c8
2 changed files with 53 additions and 33 deletions

View File

@@ -146,6 +146,13 @@ class Registry:
return tags_list 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): def get_tag_digest(self, image_name, tag):
image_headers = self.send("/v2/{0}/manifests/{1}".format( image_headers = self.send("/v2/{0}/manifests/{1}".format(
image_name, tag), method="HEAD") image_name, tag), method="HEAD")
@@ -361,6 +368,30 @@ def delete_tags(
registry.delete_tag(image_name, tag, dry_run, keep_tag_digests) 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): def main_loop(args):
@@ -384,29 +415,13 @@ def main_loop(args):
print "---------------------------------" print "---------------------------------"
print "Image: {0}".format(image_name) print "Image: {0}".format(image_name)
tags_list = set()
all_tags_list = registry.list_tags(image_name) all_tags_list = registry.list_tags(image_name)
if not all_tags_list: if not all_tags_list:
print " no tags!" print " no tags!"
continue continue
if args.tags_like: tags_list = get_tags(all_tags_list, image_name, 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)
# print tags and optionally layers # print tags and optionally layers
for tag in tags_list: 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: # add tags to "tags_to_keep" list, if we have regexp "tags_to_keep" entries:
if args.keep_tags_like: if args.keep_tags_like:
for keep_like in args.keep_tags_like: args.keep_tags.append(get_tags_like(args.keep_tags_like, tags_list))
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)
# delete tags if told so # delete tags if told so

28
test.py
View File

@@ -1,5 +1,5 @@
import unittest import unittest
from registry import Registry, Requests from registry import Registry, Requests, get_tags
from mock import MagicMock from mock import MagicMock
import requests import requests
@@ -20,6 +20,9 @@ class MockRequests:
self.return_value.status_code = status_code self.return_value.status_code = status_code
self.return_value.text = text self.return_value.text = text
class TestCreateMethod(unittest.TestCase): class TestCreateMethod(unittest.TestCase):
def test_create_nologin(self): def test_create_nologin(self):
r = Registry.create("testhost", None, False) r = Registry.create("testhost", None, False)
@@ -178,14 +181,23 @@ class TestListTags(unittest.TestCase):
self.assertEqual(response, []) self.assertEqual(response, [])
self.assertEqual(self.registry.last_error, "list_tags: invalid json response") self.assertEqual(self.registry.last_error, "list_tags: invalid json response")
def test_list_tags_ok_sorted(self): def test_list_one_tag_sorted(self):
def test_list_one_tag_ok(self): self.registry.http.reset_return_value(status_code=200,
self.registry.http.reset_return_value(status_code=200, text=u'{"name":"image1","tags":["0.1.306", "0.1.300", "0.1.290"]}')
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): class TestListDigest(unittest.TestCase):