From 477aba19d218283048fe05e312cd4ef0a99cadde Mon Sep 17 00:00:00 2001
From: yankay <kay.yan@daocloud.io>
Date: Tue, 14 Sep 2021 10:12:38 +0800
Subject: [PATCH] Add Full Sync mode

---
 scripts/sync-to-jp.py | 41 +++++++++++++++++++++++++++++------------
 1 file changed, 29 insertions(+), 12 deletions(-)

diff --git a/scripts/sync-to-jp.py b/scripts/sync-to-jp.py
index 00cf111..30d1034 100644
--- a/scripts/sync-to-jp.py
+++ b/scripts/sync-to-jp.py
@@ -28,6 +28,7 @@ INTERNAL_NETWORK = {
 
 REGISTRY_PASSWORD = os.environ["REGISTRY_PASSWORD"]
 DELTA_MODE = os.environ.get("DELTA_MODE") 
+
 DRY_RUN = os.environ.get("DRY_RUN")
 DOCKER_IO_USER = os.environ.get("DOCKER_IO_USER")
 DOCKER_IO_PASS = os.environ.get("DOCKER_IO_PASS")
@@ -51,15 +52,14 @@ def __dest_img(src_img):
     return dest_img
 
 
-
-def skepo_full_sync(src_img):
-    dest_img = __dest_img(src_img)
-    dest_img = "/".join(dest_img.split("/")[:-1])
-    src_auth = ""
-    if 'docker.io' in src_img and DOCKER_IO_USER:
-        src_auth = " --src-creds %s:%s " % (DOCKER_IO_USER,DOCKER_IO_PASS)
-    cmd = SKOPEO_CMD + " sync --all --src docker --dest docker %s --dest-tls-verify=false --dest-creds root:%s -f oci %s %s" %(src_auth,REGISTRY_PASSWORD,src_img,dest_img)
-    __run_cmd(cmd)
+def is_filtered(src_img):
+    y = []
+    with open("not_sync.yaml") as f:
+        y = yaml.safe_load(f)
+    for n in y.get('not_sync'):
+        if bool(re.match(n.get("image_pattern"), src_img)):
+            return True
+    return False
 
 def __parse_tag(output):
     # print(output)
@@ -89,7 +89,7 @@ def filter_tag(src_img,delta_tags):
                         need_to_sync.remove(t)
     return need_to_sync
 
-def skepo_delta_sync(src_img):
+def skepo_delta_sync(src_img,full_mode=False):
     dest_img = __dest_img(src_img)
     src_auth =''
     if 'docker.io' in src_img and DOCKER_IO_USER:
@@ -103,11 +103,15 @@ def skepo_delta_sync(src_img):
     result = subprocess.run(cmd, shell=True,stdout=subprocess.PIPE)
     dest_tags = __parse_tag(result.stdout)
     delta_tags = set(src_tags) - set(dest_tags)
-    need_to_sync = filter_tag(src_img,delta_tags)
+
+
+    need_to_sync =  filter_tag(src_img,delta_tags)
+    if full_mode:
+        need_to_sync = filter_tag(src_img,src_tags)
     
 
     filtered_num = len(delta_tags) - len(need_to_sync)
-    if 'latest' in src_tags:
+    if 'latest' in src_tags and 'lastest' not in need_to_sync:
         need_to_sync.append('latest')
 
     # print(src_img)
@@ -116,6 +120,19 @@ def skepo_delta_sync(src_img):
     for tag in need_to_sync:
         skepo_sync_one_tag(src_img,tag)
 
+def skepo_full_sync(src_img):
+    if is_filtered(src_img):
+        skepo_delta_sync(src_img,full_mode=True)
+    else:
+        dest_img = __dest_img(src_img)
+        dest_img = "/".join(dest_img.split("/")[:-1])
+        src_auth = ""
+        if 'docker.io' in src_img and DOCKER_IO_USER:
+            src_auth = " --src-creds %s:%s " % (DOCKER_IO_USER,DOCKER_IO_PASS)
+        cmd = SKOPEO_CMD + " sync --all --src docker --dest docker %s --dest-tls-verify=false --dest-creds root:%s -f oci %s %s" %(src_auth,REGISTRY_PASSWORD,src_img,dest_img)
+        __run_cmd(cmd)
+
+
 def main():
     lines = []
     with open("mirror.txt") as f: