Exemple #1
0
def ssh_execute(ssh,
                cmd,
                process_input=None,
                addl_env=None,
                check_exit_code=True):
    sanitized_cmd = strutils.mask_password(cmd)
    LOG.debug(_('Running cmd (SSH): %s'), sanitized_cmd)
    if addl_env:
        raise InvalidArgumentError(_('Environment not supported over SSH'))
    if process_input:
        raise InvalidArgumentError(_('process_input not supported over SSH'))
    stdin_stream, stdout_stream, stderr_stream = ssh.exec_command(cmd)
    channel = stdout_stream.channel
    stdout = stdout_stream.read()
    sanitized_stdout = strutils.mask_password(stdout)
    stderr = stderr_stream.read()
    sanitized_stderr = strutils.mask_password(stderr)
    stdin_stream.close()
    exit_status = channel.recv_exit_status()
    if exit_status != -1:
        LOG.debug(_('Result was %s') % exit_status)
        if check_exit_code and exit_status != 0:
            raise ProcessExecutionError(exit_code=exit_status,
                                        stdout=sanitized_stdout,
                                        stderr=sanitized_stderr,
                                        cmd=sanitized_cmd)
    return (sanitized_stdout, sanitized_stderr)
Exemple #2
0
        def _inner():
            if initial_delay:
                greenthread.sleep(initial_delay)
            try:
                while self._running:
                    start = timeutils.utcnow()
                    self.f(*self.args, **self.kw)
                    end = timeutils.utcnow()
                    if not self._running:
                        break
                    delay = interval - timeutils.delta_seconds(start, end)
                    if delay <= 0:
                        LOG.warn(
                            _('task run outlasted interval by %s sec') %
                            -delay)
                    greenthread.sleep(delay if delay > 0 else 0)

            except LoopingCallDone as e:
                self.stop()
                done.send(e.retvalue)
            except Exception:
                LOG.exception(_('in fixed duration looping call'))
                done.send_exception(*sys.exc_info())
                return
            else:
                done.send(True)
Exemple #3
0
        def _inner():
            if initial_delay:
                greenthread.sleep(initial_delay)
            try:
                while self._running:
                    idle = self.f(*self.args, **self.kw)
                    if not self._running:
                        break
                    if periodic_interval_max is not None:
                        idle = min(idle, periodic_interval_max)
                    LOG.debug(
                        _('Dynamic looping call sleeping for %.02f seconds'),
                        idle)
                    greenthread.sleep(idle)

            except LoopingCallDone as e:
                self.stop()
                done.send(e.retvalue)
            except Exception:
                LOG.exception(_('in dynamic looping call'))
                done.send_exception(*sys.exc_info())
                return
            else:
                done.send(True)

            return
Exemple #4
0
 def inner(*args, **kwargs):
     try:
         with lock(name, lock_file_prefix, external, lock_path):
             LOG.debug(_('Got semaphore / lock "%(function)s"'), {'function': f.__name__})
             return f(*args, **kwargs)
     finally:
         LOG.debug(_('Semaphore / lock released "%(function)s"'), {'function': f.__name__})
Exemple #5
0
 def __init__(self,
              stdout=None,
              stderr=None,
              exit_code=None,
              cmd=None,
              description=None):
     self.exit_code = exit_code
     self.stderr = stderr
     self.stdout = stdout
     self.cmd = cmd
     self.description = description
     if description is None:
         description = _('Unexpected error while running command.')
     if exit_code is None:
         exit_code = '-'
     message = _(
         '%(description)s\nCommand: %(cmd)s\nExit code: %(exit_code)s\nStdout: %(stdout)r\nStderr: %(stderr)r'
     ) % {
         'description': description,
         'cmd': cmd,
         'exit_code': exit_code,
         'stdout': stdout,
         'stderr': stderr
     }
     super(ProcessExecutionError, self).__init__(message)
     return
Exemple #6
0
    def wait(self):
        """Loop waiting on children to die and respawning as necessary."""
        LOG.debug(_('Full set of CONF:'))
        CONF.log_opt_values(LOG, std_logging.DEBUG)
        try:
            while True:
                self.handle_signal()
                self._respawn_children()
                if self.sigcaught:
                    signame = _signo_to_signame(self.sigcaught)
                    LOG.info(_('Caught %s, stopping children'), signame)
                if not _is_sighup_and_daemon(self.sigcaught):
                    break
                for pid in self.children:
                    os.kill(pid, signal.SIGHUP)

                self.running = True
                self.sigcaught = None

        except eventlet.greenlet.GreenletExit:
            LOG.info(_('Wait called after thread killed.  Cleaning up.'))

        for pid in self.children:
            try:
                os.kill(pid, signal.SIGTERM)
            except OSError as exc:
                if exc.errno != errno.ESRCH:
                    raise

        if self.children:
            LOG.info(_('Waiting on %d children to exit'), len(self.children))
            while self.children:
                self._wait_child()

        return
def to_bytes(text, default=0):
    """Converts a string into an integer of bytes.
    
    Looks at the last characters of the text to determine
    what conversion is needed to turn the input text into a byte number.
    Supports "B, K(B), M(B), G(B), and T(B)". (case insensitive)
    
    :param text: String input for bytes size conversion.
    :param default: Default return value when text is blank.
    
    """
    match = BYTE_REGEX.search(text)
    if match:
        magnitude = int(match.group(1))
        mult_key_org = match.group(2)
        if not mult_key_org:
            return magnitude
    elif text:
        msg = _('Invalid string format: %s') % text
        raise TypeError(msg)
    else:
        return default
    mult_key = mult_key_org.lower().replace('b', '', 1)
    multiplier = BYTE_MULTIPLIERS.get(mult_key)
    if multiplier is None:
        msg = _('Unknown byte multiplier: %s') % mult_key_org
        raise TypeError(msg)
    return magnitude * multiplier
Exemple #8
0
    def _wait_child(self):
        try:
            pid, status = os.waitpid(0, os.WNOHANG)
            if not pid:
                return None
        except OSError as exc:
            if exc.errno not in (errno.EINTR, errno.ECHILD):
                raise
            return None

        if os.WIFSIGNALED(status):
            sig = os.WTERMSIG(status)
            LOG.info(_('Child %(pid)d killed by signal %(sig)d'),
                     dict(pid=pid, sig=sig))
        else:
            code = os.WEXITSTATUS(status)
            LOG.info(_('Child %(pid)s exited with status %(code)d'),
                     dict(pid=pid, code=code))
        if pid not in self.children:
            LOG.warning(_('pid %d not in child list'), pid)
            return None
        else:
            wrap = self.children.pop(pid)
            wrap.children.remove(pid)
            return wrap
    def run_periodic_tasks(self, context, raise_on_error=False):
        """Tasks to be run at a periodic interval."""
        idle_for = DEFAULT_INTERVAL
        for task_name, task in self._periodic_tasks:
            full_task_name = '.'.join([self.__class__.__name__, task_name])
            now = timeutils.utcnow()
            spacing = self._periodic_spacing[task_name]
            last_run = self._periodic_last_run[task_name]
            if spacing is not None and last_run is not None:
                due = last_run + datetime.timedelta(seconds=spacing)
                if not timeutils.is_soon(due, 0.2):
                    idle_for = min(idle_for, timeutils.delta_seconds(now, due))
                    continue
            if spacing is not None:
                idle_for = min(idle_for, spacing)
            LOG.debug(_('Running periodic task %(full_task_name)s'),
                      {'full_task_name': full_task_name})
            self._periodic_last_run[task_name] = timeutils.utcnow()
            try:
                task(self, context)
            except Exception as e:
                if raise_on_error:
                    raise
                LOG.exception(_('Error during %(full_task_name)s: %(e)s'), {
                    'full_task_name': full_task_name,
                    'e': e
                })

            time.sleep(0)

        return idle_for
Exemple #10
0
    def _wait_for_exit_or_signal(self, ready_callback=None):
        status = None
        signo = 0
        LOG.debug(_('Full set of CONF:'))
        CONF.log_opt_values(LOG, std_logging.DEBUG)
        try:
            try:
                if ready_callback:
                    ready_callback()
                super(ServiceLauncher, self).wait()
            except SignalExit as exc:
                signame = _signo_to_signame(exc.signo)
                LOG.info(_('Caught %s, exiting'), signame)
                status = exc.code
                signo = exc.signo
            except SystemExit as exc:
                status = exc.code

        finally:
            self.stop()
            if rpc:
                try:
                    rpc.cleanup()
                except Exception:
                    LOG.exception(_('Exception during rpc cleanup.'))

        return (status, signo)
Exemple #11
0
 def deprecated(self, msg, *args, **kwargs):
     stdmsg = _('Deprecated: %s') % msg
     if CONF.fatal_deprecations:
         self.critical(stdmsg, *args, **kwargs)
         raise DeprecatedConfig(msg=stdmsg)
     else:
         self.warn(stdmsg, *args, **kwargs)
Exemple #12
0
def bool_from_string(subject, strict=False):
    """Interpret a string as a boolean.
    
    A case-insensitive match is performed such that strings matching 't',
    'true', 'on', 'y', 'yes', or '1' are considered True and, when
    `strict=False`, anything else is considered False.
    
    Useful for JSON-decoded stuff and config file parsing.
    
    If `strict=True`, unrecognized values, including None, will raise a
    ValueError which is useful when parsing values passed in from an API call.
    Strings yielding False are 'f', 'false', 'off', 'n', 'no', or '0'.
    """
    if not isinstance(subject, basestring):
        subject = str(subject)
    lowered = subject.strip().lower()
    if lowered in TRUE_STRINGS:
        return True
    if lowered in FALSE_STRINGS:
        return False
    if strict:
        acceptable = ', '.join(
            ("'%s'" % s for s in sorted(TRUE_STRINGS + FALSE_STRINGS)))
        msg = _(
            "Unrecognized value '%(val)s', acceptable values are: %(acceptable)s"
        ) % {
            'val': subject,
            'acceptable': acceptable
        }
        raise ValueError(msg)
    else:
        return False
def initialize_if_enabled():
    backdoor_locals = {
        'exit': _dont_use_this,
        'quit': _dont_use_this,
        'fo': _find_objects,
        'pgt': _print_greenthreads,
        'pnt': _print_nativethreads
    }
    if CONF.backdoor_port is None:
        return
    else:
        start_port, end_port = _parse_port_range(str(CONF.backdoor_port))

        def displayhook(val):
            if val is not None:
                pprint.pprint(val)
            return

        sys.displayhook = displayhook
        sock = _listen('localhost', start_port, end_port, eventlet.listen)
        port = sock.getsockname()[1]
        LOG.info(
            _('Eventlet backdoor listening on %(port)s for process %(pid)d') %
            {
                'port': port,
                'pid': os.getpid()
            })
        eventlet.spawn_n(eventlet.backdoor.backdoor_server,
                         sock,
                         locals=backdoor_locals)
        return port
Exemple #14
0
class LogConfigError(Exception):
    message = _('Error loading logging config %(log_config)s: %(err_msg)s')

    def __init__(self, log_config, err_msg):
        self.log_config = log_config
        self.err_msg = err_msg

    def __str__(self):
        return self.message % dict(log_config=self.log_config, err_msg=self.err_msg)
Exemple #15
0
 def __exit__(self, exc_type, exc_val, exc_tb):
     if exc_type is not None:
         logging.error(
             _('Original exception being dropped: %s'),
             traceback.format_exception(self.type_, self.value, self.tb))
         return False
     else:
         if self.reraise:
             six.reraise(self.type_, self.value, self.tb)
         return
Exemple #16
0
    def _child_wait_for_exit_or_signal(self, launcher):
        status = 0
        signo = 0
        try:
            try:
                launcher.wait()
            except SignalExit as exc:
                signame = _signo_to_signame(exc.signo)
                LOG.info(_('Caught %s, exiting'), signame)
                status = exc.code
                signo = exc.signo
            except SystemExit as exc:
                status = exc.code
            except BaseException:
                LOG.exception(_('Unhandled exception'))
                status = 2

        finally:
            launcher.stop()

        return (status, signo)
    def __init__(cls, names, bases, dict_):
        """Metaclass that allows us to collect decorated periodic tasks."""
        super(_PeriodicTasksMeta, cls).__init__(names, bases, dict_)
        try:
            cls._periodic_tasks = cls._periodic_tasks[:]
        except AttributeError:
            cls._periodic_tasks = []

        try:
            cls._periodic_last_run = cls._periodic_last_run.copy()
        except AttributeError:
            cls._periodic_last_run = {}

        try:
            cls._periodic_spacing = cls._periodic_spacing.copy()
        except AttributeError:
            cls._periodic_spacing = {}

        for value in cls.__dict__.values():
            if getattr(value, '_periodic_task', False):
                task = value
                name = task.__name__
                if task._periodic_spacing < 0:
                    LOG.info(
                        _('Skipping periodic task %(task)s because its interval is negative'
                          ), {'task': name})
                    continue
                if not task._periodic_enabled:
                    LOG.info(
                        _('Skipping periodic task %(task)s because it is disabled'
                          ), {'task': name})
                    continue
                if task._periodic_spacing == 0:
                    task._periodic_spacing = None
                cls._periodic_tasks.append((name, task))
                cls._periodic_spacing[name] = task._periodic_spacing
                cls._periodic_last_run[name] = task._periodic_last_run

        return
Exemple #18
0
    def _start_child(self, wrap):
        if len(wrap.forktimes) > wrap.workers:
            if time.time() - wrap.forktimes[0] < wrap.workers:
                LOG.info(_('Forking too fast, sleeping'))
                time.sleep(1)
            wrap.forktimes.pop(0)
        wrap.forktimes.append(time.time())
        pid = os.fork()
        if pid == 0:
            launcher = self._child_process(wrap.service)
            while True:
                self._child_process_handle_signal()
                status, signo = self._child_wait_for_exit_or_signal(launcher)
                if not _is_sighup_and_daemon(signo):
                    break
                launcher.restart()

            os._exit(status)
        LOG.info(_('Started child %d'), pid)
        wrap.children.add(pid)
        self.children[pid] = wrap
        return pid
Exemple #19
0
    def stop(self):
        if CONF.use_rpc:
            try:
                self.rpcserver.stop()
                self.rpcserver.wait()
            except Exception:
                pass

        try:
            self.manager.cleanup_host()
        except Exception:
            LOG.exception(_('Service error occurred during cleanup_host'))

        super(Service, self).stop()
Exemple #20
0
def _find_facility_from_conf():
    facility_names = logging.handlers.SysLogHandler.facility_names
    facility = getattr(logging.handlers.SysLogHandler, CONF.syslog_log_facility, None)
    if facility is None and CONF.syslog_log_facility in facility_names:
        facility = facility_names.get(CONF.syslog_log_facility)
    if facility is None:
        valid_facilities = facility_names.keys()
        consts = ['LOG_AUTH', 'LOG_AUTHPRIV', 'LOG_CRON', 'LOG_DAEMON',
         'LOG_FTP', 'LOG_KERN', 'LOG_LPR', 'LOG_MAIL', 'LOG_NEWS',
         'LOG_AUTH', 'LOG_SYSLOG', 'LOG_USER', 'LOG_UUCP',
         'LOG_LOCAL0', 'LOG_LOCAL1', 'LOG_LOCAL2', 'LOG_LOCAL3',
         'LOG_LOCAL4', 'LOG_LOCAL5', 'LOG_LOCAL6', 'LOG_LOCAL7']
        valid_facilities.extend(consts)
        raise TypeError(_('syslog facility must be one of: %s') % ', '.join(("'%s'" % fac for fac in valid_facilities)))
    return facility
Exemple #21
0
 def start(self):
     if CONF.use_rpc:
         LOG.audit(_('Starting %(topic)s node (version %(version)s)'), {
             'topic': self.topic,
             'version': '0.1'
         })
         LOG.debug('Creating RPC server for service %s', self.topic)
         target = messaging.Target(topic=self.topic, server=self.host)
         endpoints = [
             self.manager,
             baserpc.BaseRPCAPI('nova_compute_agent')
         ]
         self.rpcserver = rpc.get_server(target, endpoints)
         self.rpcserver.start()
     self.tg.add_dynamic_timer(self.periodic_tasks,
                               initial_delay=None,
                               periodic_interval_max=30)
     LOG.debug('Started service %s', self.topic)
     return
Exemple #22
0
def read_cached_file(filename, force_reload=False):
    """Read from a file if it has been modified.
    
    :param force_reload: Whether to reload the file.
    :returns: A tuple with a boolean specifying if the data is fresh
              or not.
    """
    global _FILE_CACHE
    if force_reload and filename in _FILE_CACHE:
        del _FILE_CACHE[filename]
    reloaded = False
    mtime = os.path.getmtime(filename)
    cache_info = _FILE_CACHE.setdefault(filename, {})
    if not cache_info or mtime > cache_info.get('mtime', 0):
        LOG.debug(_('Reloading cached file %s') % filename)
        with open(filename) as fap:
            cache_info['data'] = fap.read()
        cache_info['mtime'] = mtime
        reloaded = True
    return (reloaded, cache_info['data'])
Exemple #23
0
    def inner_func(*args, **kwargs):
        last_log_time = 0
        last_exc_message = None
        exc_count = 0
        while True:
            try:
                return infunc(*args, **kwargs)
            except Exception as exc:
                this_exc_message = six.u(str(exc))
                if this_exc_message == last_exc_message:
                    exc_count += 1
                else:
                    exc_count = 1
                cur_time = int(time.time())
                if cur_time - last_log_time > 60 or this_exc_message != last_exc_message:
                    logging.exception(
                        _('Unexpected exception occurred %d time(s)... retrying.'
                          ) % exc_count)
                    last_log_time = cur_time
                    last_exc_message = this_exc_message
                    exc_count = 0
                time.sleep(1)

        return
class InvalidPeriodicTaskArg(Exception):
    message = _('Unexpected argument for periodic task creation: %(arg)s.')
Exemple #25
0
 def launch_service(self, service, workers=1):
     wrap = ServiceWrapper(service, workers)
     LOG.info(_('Starting %d workers'), wrap.workers)
     while self.running and len(wrap.children) < wrap.workers:
         self._start_child(wrap)
Exemple #26
0
def lock(name, lock_file_prefix=None, external=False, lock_path=None):
    """Context based lock
    
    This function yields a `threading.Semaphore` instance (if we don't use
    eventlet.monkey_patch(), else `semaphore.Semaphore`) unless external is
    True, in which case, it'll yield an InterProcessLock instance.
    
    :param lock_file_prefix: The lock_file_prefix argument is used to provide
    lock files on disk with a meaningful prefix.
    
    :param external: The external keyword argument denotes whether this lock
    should work across multiple processes. This means that if two different
    workers both run a a method decorated with @synchronized('mylock',
    external=True), only one of them will execute at a time.
    
    :param lock_path: The lock_path keyword argument is used to specify a
    special location for external lock files to live. If nothing is set, then
    CONF.lock_path is used as a default.
    """
    with _semaphores_lock:
        try:
            sem = _semaphores[name]
        except KeyError:
            sem = threading.Semaphore()
            _semaphores[name] = sem

    with sem:
        LOG.debug(_('Got semaphore "%(lock)s"'), {'lock': name})
        if not hasattr(local.strong_store, 'locks_held'):
            local.strong_store.locks_held = []
        local.strong_store.locks_held.append(name)
        try:
            if external and not CONF.disable_process_locking:
                LOG.debug(_('Attempting to grab file lock "%(lock)s"'), {'lock': name})
                local_lock_path = lock_path or CONF.lock_path
                if not local_lock_path:
                    raise cfg.RequiredOptError('lock_path')
                if not os.path.exists(local_lock_path):
                    fileutils.ensure_tree(local_lock_path)
                    LOG.info(_('Created lock path: %s'), local_lock_path)

                def add_prefix(name, prefix):
                    if not prefix:
                        return name
                    sep = '' if prefix.endswith('-') else '-'
                    return '%s%s%s' % (prefix, sep, name)

                lock_file_name = add_prefix(name.replace(os.sep, '_'), lock_file_prefix)
                lock_file_path = os.path.join(local_lock_path, lock_file_name)
                try:
                    lock = InterProcessLock(lock_file_path)
                    with lock as lock:
                        LOG.debug(_('Got file lock "%(lock)s" at %(path)s'), {'lock': name,'path': lock_file_path})
                        yield lock
                finally:
                    LOG.debug(_('Released file lock "%(lock)s" at %(path)s'), {'lock': name,'path': lock_file_path})

            else:
                yield sem
        finally:
            local.strong_store.locks_held.remove(name)
Exemple #27
0
def serve(server, workers=None):
    global _launcher
    if _launcher:
        raise RuntimeError(_('serve() can only be called once'))
    _launcher = service.launch(server, workers=workers)
Exemple #28
0
def execute(*cmd, **kwargs):
    """Helper method to shell out and execute a command through subprocess.
    
    Allows optional retry.
    
    :param cmd:             Passed to subprocess.Popen.
    :type cmd:              string
    :param process_input:   Send to opened process.
    :type process_input:    string
    :param check_exit_code: Single bool, int, or list of allowed exit
                            codes.  Defaults to [0].  Raise
                            :class:`ProcessExecutionError` unless
                            program exits with one of these code.
    :type check_exit_code:  boolean, int, or [int]
    :param delay_on_retry:  True | False. Defaults to True. If set to True,
                            wait a short amount of time before retrying.
    :type delay_on_retry:   boolean
    :param attempts:        How many times to retry cmd.
    :type attempts:         int
    :param run_as_root:     True | False. Defaults to False. If set to True,
                            the command is prefixed by the command specified
                            in the root_helper kwarg.
    :type run_as_root:      boolean
    :param root_helper:     command to prefix to commands called with
                            run_as_root=True
    :type root_helper:      string
    :param shell:           whether or not there should be a shell used to
                            execute this command. Defaults to false.
    :type shell:            boolean
    :param loglevel:        log level for execute commands.
    :type loglevel:         int.  (Should be logging.DEBUG or logging.INFO)
    :returns:               (stdout, stderr) from process execution
    :raises:                :class:`UnknownArgumentError` on
                            receiving unknown arguments
    :raises:                :class:`ProcessExecutionError`
    """
    process_input = kwargs.pop('process_input', None)
    check_exit_code = kwargs.pop('check_exit_code', [0])
    ignore_exit_code = False
    delay_on_retry = kwargs.pop('delay_on_retry', True)
    attempts = kwargs.pop('attempts', 1)
    run_as_root = kwargs.pop('run_as_root', False)
    root_helper = kwargs.pop('root_helper', '')
    shell = kwargs.pop('shell', False)
    loglevel = kwargs.pop('loglevel', logging.DEBUG)
    if isinstance(check_exit_code, bool):
        ignore_exit_code = not check_exit_code
        check_exit_code = [0]
    else:
        if isinstance(check_exit_code, int):
            check_exit_code = [check_exit_code]
        if kwargs:
            raise UnknownArgumentError(
                _('Got unknown keyword args to utils.execute: %r') % kwargs)
        if run_as_root and hasattr(os, 'geteuid') and os.geteuid() != 0:
            if not root_helper:
                raise NoRootWrapSpecified(message=_(
                    'Command requested root, but did not specify a root helper.'
                ))
            cmd = shlex.split(root_helper) + list(cmd)
        cmd = map(str, cmd)
        sanitized_cmd = strutils.mask_password(' '.join(cmd))
        while attempts > 0:
            attempts -= 1
            try:
                try:
                    LOG.log(loglevel, _('Running cmd (subprocess): %s'),
                            sanitized_cmd)
                    _PIPE = subprocess.PIPE
                    if os.name == 'nt':
                        preexec_fn = None
                        close_fds = False
                    else:
                        preexec_fn = _subprocess_setup
                        close_fds = True
                    obj = subprocess.Popen(cmd,
                                           stdin=_PIPE,
                                           stdout=_PIPE,
                                           stderr=_PIPE,
                                           close_fds=close_fds,
                                           preexec_fn=preexec_fn,
                                           shell=shell)
                    result = None
                    for _i in six.moves.range(20):
                        try:
                            if process_input is not None:
                                result = obj.communicate(process_input)
                            else:
                                result = obj.communicate()
                        except OSError as e:
                            if e.errno in (errno.EAGAIN, errno.EINTR):
                                continue
                            raise

                        break

                    obj.stdin.close()
                    _returncode = obj.returncode
                    LOG.log(loglevel, _('Result was %s') % _returncode)
                    if not ignore_exit_code and _returncode not in check_exit_code:
                        stdout, stderr = result
                        sanitized_stdout = strutils.mask_password(stdout)
                        sanitized_stderr = strutils.mask_password(stderr)
                        raise ProcessExecutionError(exit_code=_returncode,
                                                    stdout=sanitized_stdout,
                                                    stderr=sanitized_stderr,
                                                    cmd=sanitized_cmd)
                    return result
                except ProcessExecutionError:
                    if not attempts:
                        raise
                    else:
                        LOG.log(loglevel, _('%r failed. Retrying.'),
                                sanitized_cmd)
                        if delay_on_retry:
                            greenthread.sleep(random.randint(20, 200) / 100.0)

            finally:
                greenthread.sleep(0)

    return
Exemple #29
0
 def __exit__(self, exc_type, exc_val, exc_tb):
     try:
         self.unlock()
         self.lockfile.close()
     except IOError:
         LOG.exception(_('Could not release the acquired lock `%s`'), self.fname)
Exemple #30
0
class DeprecatedConfig(Exception):
    message = _('Fatal call to deprecated config: %(msg)s')

    def __init__(self, msg):
        super(Exception, self).__init__(self.message % dict(msg=msg))