]> scripts.mit.edu Git - wizard.git/blobdiff - wizard/command/mass_migrate.py
Rewrite parametrize to use new parametrizeWithVars
[wizard.git] / wizard / command / mass_migrate.py
index b72bfd4d1f3afe9dfcc38bc44cc048d940bb19c0..956399a009d034a86a16e4ef5ea505981be4738b 100644 (file)
@@ -1,61 +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
-    # [] needed to workaround subtle behavior of frozenset("")
-    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,
@@ -72,14 +63,8 @@ Essentially equivalent to running '%prog migrate' on all
 autoinstalls for a particular application found by parallel-find,
 but with advanced reporting.
 
-When doing an actual run, it is recommended to use --seen to
-be able to resume gracefully (without it, mass-migrate must
-stat every install to find out if it migrated it yet).
-
 This command is intended to be run as root on a server with
-the scripts AFS patch.  You may run it as an unpriviledged
-user for testing purposes, but then you MUST NOT run this on
-untrusted repositories."""
+the scripts AFS patch."""
     parser = command.WizardOptionParser(usage)
     baton.push(parser, "log_dir")
     baton.push(parser, "seen")
@@ -91,16 +76,15 @@ untrusted repositories."""
     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")