diff --git a/anvil/__main__.py b/anvil/__main__.py index 9815ec0e..e8c89a1b 100644 --- a/anvil/__main__.py +++ b/anvil/__main__.py @@ -94,7 +94,17 @@ def run(args): # !! # Ensure the anvil dirs are there if others are about to use it... - ensure_anvil_dirs(root_dir) + if not sh.isdir(root_dir): + LOG.info("Creating anvil root directory at path: %s", root_dir) + sh.mkdir(root_dir) + try: + for d in ANVIL_DIRS: + if sh.isdir(d): + continue + LOG.info("Creating anvil auxiliary directory at path: %s", d) + sh.mkdir(d) + except OSError as e: + LOG.warn("Failed ensuring auxiliary directories due to %s", e) # Load the origins... origins = _origins.load(args['origins_fn'], @@ -159,32 +169,21 @@ def load_previous_settings(): return settings_prev -def ensure_anvil_dirs(root_dir): - wanted_dirs = list(ANVIL_DIRS) - if root_dir and root_dir not in wanted_dirs: - wanted_dirs.append(root_dir) - for d in wanted_dirs: - if sh.isdir(d): - continue - LOG.info("Creating anvil directory at path: %s", d) - sh.mkdir(d) - - def store_current_settings(c_settings): + # Remove certain keys that just shouldn't be saved + to_save = dict(c_settings) + for k in ['action', 'verbose']: + if k in c_settings: + to_save.pop(k, None) + buf = six.StringIO() + buf.write("# Anvil last used settings\n") + buf.write(utils.add_header(SETTINGS_FILE, + utils.prettify_yaml(to_save), + adjusted=sh.isfile(SETTINGS_FILE))) try: - # Remove certain keys that just shouldn't be saved - to_save = dict(c_settings) - for k in ['action', 'verbose']: - if k in c_settings: - to_save.pop(k, None) - buf = six.StringIO() - buf.write("# Anvil last used settings\n") - buf.write(utils.add_header(SETTINGS_FILE, - utils.prettify_yaml(to_save), - adjusted=sh.isfile(SETTINGS_FILE))) sh.write_file(SETTINGS_FILE, buf.getvalue()) - except Exception as e: - LOG.debug("Failed writing to %s due to %s", SETTINGS_FILE, e) + except OSError as e: + LOG.warn("Failed writing to %s due to %s", SETTINGS_FILE, e) def ensure_perms(): @@ -209,7 +208,7 @@ def main(): log_level = logging.INFO if args['verbose']: log_level = logging.DEBUG - logging.setupLogging(log_level) + logging.setupLogging(log_level, tee_filename=args['tee_file']) LOG.debug("Log level is: %s" % (logging.getLevelName(log_level))) def print_exc(exc): diff --git a/anvil/log.py b/anvil/log.py index 7d8a7b37..c409f74d 100644 --- a/anvil/log.py +++ b/anvil/log.py @@ -102,18 +102,19 @@ class TermAdapter(logging.LoggerAdapter): def setupLogging(log_level, - format='%(levelname)s: @%(name)s : %(message)s', - log_name='/var/log/anvil.log'): + term_format='%(levelname)s: @%(name)s : %(message)s', + tee_filename='/var/log/anvil.log', + tee_format='%(asctime)s : %(levelname)s: @%(name)s : %(message)s'): root_logger = getLogger().logger - console_formatter = TermFormatter(format) + console_formatter = TermFormatter(term_format) console_logger = StreamHandler(sys.stdout) console_logger.setLevel(log_level) console_logger.setFormatter(console_formatter) root_logger.addHandler(console_logger) - file_formatter = logging.Formatter('%(asctime)s : ' + format) - file_logger = FileHandler(log_name) + file_formatter = logging.Formatter(tee_format) + file_logger = FileHandler(tee_filename) file_logger.setFormatter(file_formatter) file_logger.setLevel(DEBUG) root_logger.addHandler(file_logger) diff --git a/anvil/opts.py b/anvil/opts.py index 48b425ae..9bb6b072 100644 --- a/anvil/opts.py +++ b/anvil/opts.py @@ -160,6 +160,13 @@ def parse(previous_settings=None): metavar="DIR", default=_get_default_dir(), help=("empty root DIR or DIR with existing components (default: %default)")) + base_group.add_option("--tee-file", + action="store", + type="string", + dest="tee_file", + metavar="FILE", + default='/var/log/anvil.log', + help=("location to store tee of output (default: %default)")) parser.add_option_group(base_group) build_group = OptionGroup(parser, "Build specific options") @@ -194,6 +201,7 @@ def parse(previous_settings=None): values['origins_fn'] = options.origins_fn values['verbose'] = options.verbose values['usr_only'] = options.usr_only + values['tee_file'] = options.tee_file if options.origins_patch_fn: with open(options.origins_patch_fn) as fp: values['origins_patch'] = json.load(fp) diff --git a/anvil/tests/test_log.py b/anvil/tests/test_log.py index d564c1cb..c1458366 100644 --- a/anvil/tests/test_log.py +++ b/anvil/tests/test_log.py @@ -34,5 +34,5 @@ class TestLog(test.TestCase): super(TestLog, self).tearDown() def test_logger_has_two_handlers(self): - log.setupLogging(log.INFO, log_name=self.log_name) + log.setupLogging(log.INFO, tee_filename=self.log_name) self.assertEqual(len(self.test_logger.handlers), 2) diff --git a/smithy b/smithy index 14577c25..9e4a9794 100755 --- a/smithy +++ b/smithy @@ -236,6 +236,9 @@ puke() needs_bootstrap() { # Checks if we need to perform the bootstrap phase. + if [ "$SKIP_BOOTSTRAP" == "yes" ]; then + return 1 + fi if [ "$BOOTSTRAP" == "true" ]; then return 0 fi diff --git a/tools/bootstrap/Ubuntu b/tools/bootstrap/Ubuntu index cb527074..1a3f21ca 100644 --- a/tools/bootstrap/Ubuntu +++ b/tools/bootstrap/Ubuntu @@ -6,7 +6,7 @@ MIN_RELEASE=14.04 STEPS="apt_packages virtualenv" # Ensure anvil python gets access to this... -VENV_CMD="virtualenv-2.7" +VENV_CMD="virtualenv" export VENV_CMD REQUIRES=' diff --git a/tox.ini b/tox.ini index f707705f..e0a93fac 100644 --- a/tox.ini +++ b/tox.ini @@ -12,11 +12,21 @@ setenv = VIRTUAL_ENV={envdir} deps = -r{toxinidir}/requirements.txt -r{toxinidir}/test-requirements.txt commands = nosetests {posargs} - {toxinidir}/tools/verify_yaml [tox:jenkins] downloadcache = ~/cache/pip +[testenv:py27] +setenv = VIRTUAL_ENV={envdir} + SKIP_BOOTSTRAP=yes + PYTHONHASHSEED=0 +commands = nosetests {posargs} + {toxinidir}/tools/verify_yaml + {toxinidir}/smithy -a prepare \ + -p {toxinidir}/conf/personas/in-a-box/venv-all.yaml \ + -o {toxinidir}/conf/origins/kilo-venv-2015.1.0.yaml \ + --tee-file {toxinidir}/tee.out -v -j1 + [testenv:pep8] commands = flake8 {posargs}