]> scripts.mit.edu Git - wizard.git/blob - lib/wizard/command/massmigrate.py
Make mass-migrate handle child error conditions.
[wizard.git] / lib / wizard / command / massmigrate.py
1 import optparse
2 import sys
3 import os
4 import shutil
5
6 import migrate
7 import wizard.deploy as wd
8 import wizard.shell as sh
9 from wizard import *
10
11 def massmigrate(argv, global_options, logger = None):
12     usage = """usage: %prog massmigrate [ARGS] APPLICATION
13
14 Mass migrates an application to the new repository format.
15 Essentially equivalent to running '%prog migrate' on all
16 autoinstalls for a particular application found by parallel-find,
17 but with advanced reporting.
18
19 NOTE: --verbose implies --no-parallelize, as it results in
20 output going to stdout/stderr."""
21     parser = WizardOptionParser(usage)
22     parser.add_option("--no-parallelize", dest="no_parallelize", action="store_true",
23             default=False, help="Turn off parallelization")
24     parser.add_option("--dry-run", dest="dry_run", action="store_true",
25             default=False, help="Print commands that would be run. Implies --no-parallelize")
26     options, args, logger = parser.parse_all(argv, logger)
27     if len(args) > 1:
28         parser.error("too many arguments")
29     elif not args:
30         parser.error("must specify application to migrate")
31     if options.verbose or options.dry_run:
32         options.no_parallelize = True
33     app = args[0]
34     base_args = []
35     if options.verbose: base_args.append("--verbose")
36     if options.dry_run: base_args.append("--dry-run")
37     deploys = []
38     for line in wd.getInstallLines(global_options):
39         try:
40             deploy = wd.Deployment.parse(line)
41         except wd.DeploymentParseError, wd.NoSuchApplication:
42             continue
43         name = deploy.getApplication().name
44         if name != app: continue
45         deploys.append(deploy)
46     # parallelization code would go here
47     errors = {}
48     for deploy in deploys:
49         sub_argv = base_args + [deploy.location]
50         logger.info("$ wizard migrate " + " ".join(sub_argv))
51         try:
52             migrate.migrate(sub_argv, global_options, logger)
53         except UserException as e:
54             name = e.__class__.__name__
55             if name not in errors: errors[name] = []
56             errors[name].append(deploy)
57             logger.error("ERROR [%s] in %s" % (name, d.location))
58     for name, deploys in errors.items():
59         logger.warning("ERROR [%s] from %d installs" % (name, len(deploys)))