예제 #1
0
    def __init__(self, **subfields):
        super(ParamMultiField, self).__init__()

        if len(subfields) == 0:
            raise error.DevopsException('subfields is empty')

        self.subfields = []
        for name, field in subfields.items():
            if not isinstance(field, ParamFieldBase):
                raise error.DevopsException(
                    'field "{}" has wrong type;'
                    ' should be ParamFieldBase subclass instance'
                    ''.format(name))
            field.set_param_key(name)
            self.subfields.append(field)

        self.choices = None
        self._proxy = None

        self.proxy_fields = {
            field.param_key: field
            for field in self.subfields
        }
        # noinspection PyPep8Naming
        Proxy = type('ParamMultiFieldProxy', (object, ), self.proxy_fields)
        self._proxy = Proxy()
예제 #2
0
 def __set__(self, instance, values):
     if not isinstance(values, dict):
         raise error.DevopsException('Can set only dict')
     self._init_proxy_params(instance)
     for field_name, field_value in values.items():
         if field_name not in self.proxy_fields:
             raise error.DevopsException(
                 'Unknown field "{}"'.format(field_name))
         setattr(self._proxy, field_name, field_value)
예제 #3
0
    def __init__(self, default=None, choices=None):
        super(ParamField, self).__init__()

        if choices and default not in choices:
            raise error.DevopsException('Default value not in choices list')

        self.default_value = default
        self.choices = choices
예제 #4
0
 def wrapped(*args, **kwargs):
     acquired = False
     if path is not None:
         logger.debug('Acquiring lock file {0} for {1}'.format(
             path, func.__name__))
         lock = fasteners.InterProcessLock(path)
         acquired = lock.acquire(blocking=True,
                                 delay=5,
                                 timeout=timeout)
         logger.debug('Acquired the lock file {0} for {1}'.format(
             path, func.__name__))
         if not acquired:
             raise error.DevopsException(
                 'Failed to aquire lock file in {0} sec'.format(
                     timeout))
     try:
         result = func(*args, **kwargs)
     finally:
         if acquired:
             logger.debug('Releasing the lock file {0} for {1}'.format(
                 path, func.__name__))
             lock.release()
     return result
예제 #5
0
    def decorator(func):
        if inspect.ismethod(func):
            full_name = '{}:{}.{}'.format(
                inspect.getmodule(func.im_class).__name__,
                func.im_class.__name__, func.__name__)
        elif inspect.isfunction(func):
            full_name = '{}.{}'.format(
                inspect.getmodule(func).__name__, func.__name__)
        else:
            raise error.DevopsException(
                'Wrong func parameter type {!r}'.format(func))

        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            i = 0
            while True:
                try:
                    return func(*args, **kwargs)
                except exception as e:
                    i += 1
                    if i >= count:
                        raise

                    logger.debug('Exception {!r} while running {!r}. '
                                 'Waiting {} seconds.'.format(
                                     e, func.__name__, delay),
                                 exc_info=True)  # logs traceback
                    time.sleep(delay)

                    arg_str = ', '.join((
                        ', '.join(map(repr, args)),
                        ', '.join('{}={!r}'.format(k, v) for k, v in kwargs),
                    ))
                    logger.debug('Retrying {}({})'.format(full_name, arg_str))

        return wrapper
예제 #6
0
    def __set__(self, instance, value):
        if self.choices and value not in self.choices:
            raise error.DevopsException('{}: Value not in choices list'.format(
                self.param_key))

        instance.params[self.param_key] = value