-#!/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
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.
""")
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
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):
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]]
)
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__":