X-Git-Url: https://scripts.mit.edu/gitweb/wizard.git/blobdiff_plain/9dc3f5e88263cc15f8876dc421057f5b96af0335..6554c6378a6e801b4fe47c50688cdae1d627bc18:/wizard/command/mass_migrate.py diff --git a/wizard/command/mass_migrate.py b/wizard/command/mass_migrate.py index 04ea06f..956399a 100644 --- a/wizard/command/mass_migrate.py +++ b/wizard/command/mass_migrate.py @@ -1,60 +1,52 @@ -import optparse import logging import os import os.path -import pwd -import hashlib -import errno -import time import itertools -import wizard -from wizard import deploy, util, shell, sset, command +from wizard import deploy, report, shell, sset, command def main(argv, baton): options, args = parse_args(argv, baton) app = args[0] base_args = calculate_base_args(options) sh = shell.ParallelShell.make(options.no_parallelize, options.max_processes) + command.create_logdir(options.log_dir) seen = sset.make(options.seen) is_root = not os.getuid() - warnings_log, errors_log = command.open_logs(options.log_dir) + runtime = report.make_fresh(options.log_dir, "success", "warnings", "errors") # loop stuff errors = {} i = 0 - deploys = deploy.parse_install_lines(app, options.versions_path) + deploys = deploy.parse_install_lines(app, options.versions_path, user=options.user) requested_deploys = itertools.islice(deploys, options.limit) for i, d in enumerate(requested_deploys, 1): # check if we want to punt due to --limit if d.location in seen: continue - if is_root and not command.security_check_homedir(d): + if is_root and not command.security_check_homedir(d.location): continue logging.info("Processing %s" % d.location) child_args = list(base_args) # calculate the log file, if a log dir was specified if options.log_dir: - log_file = command.calculate_log_name(options.log_dir, i, d.location) + log_file = command.calculate_log_name(options.log_dir, i) child_args.append("--log-file=" + log_file) # actual meat def make_on_pair(d, i): # we need to make another stack frame so that d and i get specific bindings. def on_success(stdout, stderr): if stderr: - warnings_log.write("%s\n" % d.location) logging.warning("Warnings [%04d] %s:\n%s" % (i, d.location, stderr)) - seen.add(d.location) + runtime.write("warnings", i, d.location) + runtime.write("success", i, d.location) def on_error(e): if e.name == "wizard.command.migrate.AlreadyMigratedError" or \ e.name == "AlreadyMigratedError": - seen.add(d.location) logging.info("Skipped already migrated %s" % d.location) else: - name = e.name - if name not in errors: errors[name] = [] - errors[name].append(d) - logging.error("%s in [%04d] %s" % (name, i, d.location)) - errors_log.write("%s\n" % d.location) + errors.setdefault(e.name, []).append(d) + logging.error("%s in [%04d] %s", e.name, i, d.location) + runtime.write("errors", i, d.location) return (on_success, on_error) on_success, on_error = make_on_pair(d, i) sh.call("wizard", "migrate", d.location, *child_args, @@ -84,16 +76,15 @@ the scripts AFS patch.""" baton.push(parser ,"limit") baton.push(parser, "versions_path") baton.push(parser, "srv_path") + baton.push(parser, "user") options, args, = parser.parse_all(argv) if len(args) > 1: parser.error("too many arguments") elif not args: parser.error("must specify application to migrate") - if options.dry_run: - options.no_parallelize = True return options, args def calculate_base_args(options): - return command.makeBaseArgs(options, dry_run="--dry-run", srv_path="--srv-path", + return command.make_base_args(options, dry_run="--dry-run", srv_path="--srv-path", force="--force")