Source code for hammers.util

# coding: utf-8
import argparse
import contextlib
from datetime import datetime
import functools
from pytz import timezone
from subprocess import Popen, PIPE, check_output
from time import time


def base_parser(description=None):
    parser = argparse.ArgumentParser(description=description)
    parser.add_argument('--slack', type=str, help=(
        'JSON file with Slack webhook information to send a notification to'))
    parser.add_argument('--osrc', type=str, help=(
        'OpenStack parameters file that overrides envvars.'))

    return parser


def error_message_factory(subcommand):
    return functools.partial(error_with_message, subcommand)


def error_with_message(subcommand, reason, slack=None):
    """Raises a :py:exc:`RuntimeError` with `reason`, but if `slack` is not
    :py:not before sending
    a message to Slack"""
    if slack:
        slack.post(subcommand, reason, color='xkcd:red')
    raise RuntimeError(reason)


[docs]def drop_prefix(s, start): """Remove prefix `start` from sting `s`. Raises a :py:exc:`ValueError` if `s` didn't start with `start`.""" l = len(start) if s[:l] != start: raise ValueError('string does not start with expected value') return s[l:]
DATE_FORMATS = { "cli": "%Y-%m-%d %H:%M:%S", "nova": "%Y-%m-%d %H:%M:%S", "ironic": "%Y-%m-%dT%H:%M:%S", "blazar_event": "%Y-%m-%d %H:%M:%S", "blazar_lease": "%Y-%m-%dT%H:%M:%S.%f", } def parse_datestr(datestr, fmt=None): if fmt: formats = [fmt] else: formats = DATE_FORMATS.keys() # HACK(jca): Chop of timezone for sanity, assume UTC datestr = datestr.split('+')[0] for f in formats: try: dateobj = datetime.strptime(datestr, DATE_FORMATS[f]) dateobj = dateobj.replace(tzinfo=timezone("UTC")) return dateobj except ValueError: continue return None def now_utc(): return datetime.utcnow().replace(tzinfo=timezone("UTC")) # 3.7+ has https://bugs.python.org/issue10049
[docs]@contextlib.contextmanager def nullcontext(*args, **kwargs): """With ``with``, wiff (do nothing). `Added to stdlib in 3.7 <https://bugs.python.org/issue10049>`_ as :py:func:`contextlib.nullcontext`""" yield
if __name__ == '__main__': assert drop_prefix('x:1234', 'x:') == '1234' assert drop_prefix('abcde', 'abc') == 'de' try: drop_prefix('1234', 'a') except ValueError: pass else: assert False