8567: Fix migrate links to use PDH instead of UUID.
authorPeter Amstutz <peter.amstutz@curoverse.com>
Thu, 9 Mar 2017 22:41:55 +0000 (17:41 -0500)
committerPeter Amstutz <peter.amstutz@curoverse.com>
Tue, 14 Mar 2017 16:30:25 +0000 (12:30 -0400)
Better error reporting.

Migrate script cleans up /var/lib/docker inside container.

docker/migrate-docker19/migrate.sh
sdk/python/arvados/commands/keepdocker.py

index 63d7274360941e9639d646b6d45daf0518a43d18..58d6665f2233cd206e7401f01444d9b1bc5339af 100755 (executable)
@@ -2,6 +2,14 @@
 
 set -e
 
+function cleanup {
+    kill $(cat /var/run/docker.pid)
+    sleep 1
+    rm -rf /var/lib/docker/*
+}
+
+trap cleanup EXIT
+
 /root/dnd.sh &
 sleep 2
 
@@ -28,11 +36,6 @@ sleep 2
 
 docker images -a
 
-UUID=$(arv-keepdocker --project-uuid=$project_uuid $image_repo $image_tag)
-
-kill $(cat /var/run/docker.pid)
-sleep 1
-
-chmod ugo+rwx -R /var/lib/docker
+UUID=$(arv-keepdocker --force-image-format --project-uuid=$project_uuid $image_repo $image_tag)
 
 echo "Migrated uuid is $UUID"
index 569b3152e9b6776c652f0b953c39d25250e249c3..5603ade4924342c926d62080cbe804411e0b7386 100644 (file)
@@ -393,16 +393,26 @@ def migrate19():
     for m in migration_links:
         already_migrated.add(m["tail_uuid"])
 
-    need_migrate = [img for img in old_images if img["collection"] not in already_migrated]
+    items = arvados.util.list_all(api_client.collections().list,
+                                  filters=[["uuid", "in", [img["collection"] for img in old_images]]],
+                                  select=["uuid", "portable_data_hash"])
+    uuid_to_pdh = {i["uuid"]: i["portable_data_hash"] for i in items}
+    need_migrate = [img for img in old_images
+                    if uuid_to_pdh[img["collection"]] not in already_migrated]
 
     logger.info("Already migrated %i images", len(already_migrated))
     logger.info("Need to migrate %i images", len(need_migrate))
 
+    success = []
+    failures = []
     for old_image in need_migrate:
-        logger.info("Migrating %s", old_image["collection"])
+        if uuid_to_pdh[old_image["collection"]] in already_migrated:
+            continue
+
+        logger.info("Migrating %s:%s (%s)", old_image["repo"], old_image["tag"], old_image["collection"])
 
-        col = CollectionReader(old_image["collection"])
-        tarfile = col.keys()[0]
+        oldcol = CollectionReader(old_image["collection"])
+        tarfile = oldcol.keys()[0]
 
         try:
             varlibdocker = tempfile.mkdtemp()
@@ -424,26 +434,37 @@ def migrate19():
                              tarfile[0:40],
                              old_image["repo"],
                              old_image["tag"],
-                             col.api_response()["owner_uuid"]]
+                             oldcol.api_response()["owner_uuid"]]
 
                 out = subprocess.check_output(dockercmd)
 
-            new_collection = re.search(r"Migrated uuid is ([a-z0-9]{5}-[a-z0-9]{5}-[a-z0-9]{15})", out)
-            api_client.links().create(body={"link": {
-                'owner_uuid': col.api_response()["owner_uuid"],
-                'link_class': arvados.commands.keepdocker._migration_link_class,
-                'name': arvados.commands.keepdocker._migration_link_name,
-                'tail_uuid': old_image["collection"],
-                'head_uuid': new_collection.group(1)
-                }}).execute(num_retries=3)
-
-            logger.info("Migrated '%s' to '%s'", old_image["collection"], new_collection.group(1))
+            migrated = re.search(r"Migrated uuid is ([a-z0-9]{5}-[a-z0-9]{5}-[a-z0-9]{15})", out)
+            if migrated:
+                newcol = CollectionReader(migrated.group(1))
+
+                api_client.links().create(body={"link": {
+                    'owner_uuid': oldcol.api_response()["owner_uuid"],
+                    'link_class': arvados.commands.keepdocker._migration_link_class,
+                    'name': arvados.commands.keepdocker._migration_link_name,
+                    'tail_uuid': oldcol.portable_data_hash(),
+                    'head_uuid': newcol.portable_data_hash()
+                    }}).execute(num_retries=3)
+
+                logger.info("Migrated '%s' to '%s'", oldcol.portable_data_hash(), newcol.portable_data_hash())
+                already_migrated.add(oldcol.portable_data_hash())
+                success.append(old_image["collection"])
+            else:
+                logger.error("Error migrating '%s'", old_image["collection"])
+                failures.append(old_image["collection"])
         except Exception as e:
             logger.exception("Migration failed")
+            failures.append(old_image["collection"])
         finally:
             shutil.rmtree(varlibdocker)
 
-    logger.info("All done")
+    logger.info("Successfully migrated %i images", len(success))
+    if failures:
+        logger.error("Failure migrating images: %s", failures)
 
 
 def main(arguments=None, stdout=sys.stdout):