Merge branch '18947-githttpd'
[arvados.git] / tools / vocabulary-migrate / vocabulary-migrate.py
index 72bbd0ecb0c3b79f6269b4562c620e4d48f19638..89a4f030e862521251052328f9e3a4539fb62584 100644 (file)
@@ -1,9 +1,8 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 #
 # Copyright (C) The Arvados Authors. All rights reserved.
 #
-# SPDX-License-Identifier: AGPL-3.0
-#
+# SPDX-License-Identifier: CC-BY-SA-3.0
 
 import argparse
 import copy
@@ -18,8 +17,11 @@ import arvados.util
 logger = logging.getLogger('arvados.vocabulary_migrate')
 logger.setLevel(logging.INFO)
 
+class VocabularyError(Exception):
+    pass
+
 opts = argparse.ArgumentParser(add_help=False)
-opts.add_argument('--vocabulary-file', type=str, metavar='PATH', default=None,
+opts.add_argument('--vocabulary-file', type=str, metavar='PATH', required=True,
                   help="""
 Use vocabulary definition file at PATH for migration decisions.
 """)
@@ -40,9 +42,7 @@ def parse_arguments(arguments):
     args = arg_parser.parse_args(arguments)
     if args.debug:
         logger.setLevel(logging.DEBUG)
-    if args.vocabulary_file is None:
-        arg_parser.error('Please specify the vocabulary file with --vocabulary-file')
-    elif not os.path.isfile(args.vocabulary_file):
+    if not os.path.isfile(args.vocabulary_file):
         arg_parser.error("{} doesn't exist or isn't a file.".format(args.vocabulary_file))
     return args
 
@@ -54,7 +54,7 @@ def _label_to_id_mappings(data, obj_name):
             if obj_lbl not in result:
                 result[obj_lbl] = obj_id
             else:
-                logger.warning('{} label "{}" for {} ID "{}" already seen at {} ID "{}". Skipping.'.format(obj_name, obj_lbl, obj_name, obj_id, obj_name, result[obj_lbl]))
+                raise VocabularyError('{} label "{}" for {} ID "{}" already seen at {} ID "{}".'.format(obj_name, obj_lbl, obj_name, obj_id, obj_name, result[obj_lbl]))
     return result
 
 def key_labels_to_ids(vocab):
@@ -93,6 +93,7 @@ def main(arguments=None):
         for resource in [arv.collections(), arv.groups()]:
             objs = arvados.util.list_all(
                 resource.list,
+                order=['created_at'],
                 select=['uuid', 'properties'],
                 filters=[['properties', 'exists', key_label]]
             )
@@ -110,8 +111,10 @@ def main(arguments=None):
                 if not args.dry_run and migrated_counter % 100 == 0:
                     logger.info('Migrating {} objects...'.format(migrated_counter))
 
-    if not args.dry_run:
-        logger.info('Done, total object migrated: {}.'.format(migrated_counter))
+    if args.dry_run and migrated_counter == 0:
+        logger.info('Nothing to do.')
+    elif not args.dry_run:
+        logger.info('Done, total objects migrated: {}.'.format(migrated_counter))
     return 0
 
 if __name__ == "__main__":