示例#1
0
 def setUp(self):
     super(TestKeyStore, self).setUp()
     self.kv = KeyStore(CharField())
     self.ordered_kv = KeyStore(CharField(), ordered=True)
     self.pickled_kv = PickledKeyStore(ordered=True)
     self.json_kv = JSONKeyStore(ordered=True)
     self.kv.clear()
     self.json_kv.clear()
示例#2
0
class GreylistEntry(Model):

    key = CharField(index=True)

    timestamp = DateTimeFieldExtend(default=utils.utcnow)

    expire_time = DateTimeFieldExtend(null=True)

    rejects = IntegerField(default=0)

    accepts = IntegerField(default=0)

    last_state = DateTimeFieldExtend(null=True)

    delay = FloatField(default=0.0)

    protocol = KeyStore(TextField())

    policy = CharField(max_length=255, default='policy')

    def accept(self, now=None, expire=35 * 86400):
        now = now or utils.utcnow()
        self.accepts += 1
        self.last_state = now

        if self.accepts == 1:
            value = now - self.timestamp
            self.delay = round(value.total_seconds(), 2)

        if not self.expire_time:
            self.expire_time = now + datetime.timedelta(seconds=expire)

        self.save()

    def reject(self, now=None):
        now = now or utils.utcnow()
        self.rejects += 1
        self.last_state = now
        self.save()

    def expire(self, delta=60, now=None):
        now = now or utils.utcnow()
        expire_date = self.timestamp + datetime.timedelta(seconds=delta)
        value = expire_date - now
        return round(value.total_seconds(), 2)

    @classmethod
    def create_entry(cls,
                     key=None,
                     protocol=None,
                     policy='default',
                     timestamp=None,
                     last_state=None,
                     now=None,
                     **kwargs):
        now = now or utils.utcnow()

        with database_proxy.transaction():
            return cls.create(key=key,
                              rejects=1,
                              timestamp=timestamp or now,
                              last_state=last_state or now,
                              policy=policy,
                              protocol=protocol,
                              **kwargs)

    @classmethod
    def search_entry(cls, key=None, now=None):
        """
        expire_time is None or greater than or equal to now AND key == key
        """
        now = now or utils.utcnow()

        try:
            return cls.select().where((
                (cls.expire_time == None) | (cls.expire_time > now))
                                      & (cls.key == key)).get()
        except:
            pass

    @classmethod
    def last_metrics(cls):
        last_24_hours = arrow.utcnow().replace(hours=-24).datetime

        objects = cls.select().where(cls.timestamp >= last_24_hours)
        count = objects.count()
        if count == 0:
            return

        last_1_hour = arrow.utcnow().replace(hours=-1).datetime

        accepted = cls.select(fn.Sum(
            cls.accepts)).where(cls.timestamp >= last_24_hours)
        rejected = cls.select(fn.Sum(
            cls.rejects)).where(cls.timestamp >= last_24_hours)
        delay = cls.select(fn.Avg(cls.delay)).where(
            cls.timestamp >= last_24_hours, cls.accepts >= 0, cls.delay >= 0)

        metrics = {
            'count':
            count,
            'accepted':
            accepted or 0,
            'rejected':
            rejected or 0,
            'delay':
            delay or 0.0,
            'abandoned':
            objects.filter(cls.accepts == 0,
                           cls.timestamp <= last_1_hour).count(),
            #'count_accepts': objects.filter(accepts__gte=1).count(),
        }

        metrics['requests'] = metrics['accepted'] + metrics['rejected']

        return metrics

    def __unicode__(self):
        return self.key

    class Meta:  # noqa
        database = database_proxy
        order_by = ('-timestamp', )
示例#3
0
 def setUp(self):
     self.db = PostgresqlDatabase('peewee_test')
     self.kv = KeyStore(CharField(), ordered=True, database=self.db)
     self.kv.clear()
示例#4
0
 def set_k():
     kv_t = KeyStore(CharField())
     kv_t['b'] = 'yyy'
示例#5
0
 def setUp(self):
     super(KeyStoreTestCase, self).setUp()
     self.kv = KeyStore(CharField())
     self.ordered_kv = KeyStore(CharField(), ordered=True)
     self.pickled_kv = PickledKeyStore(ordered=True)
     self.kv.clear()
示例#6
0
 def setUp(self):
     self.kv = KeyStore(CharField())
     self.ordered_kv = KeyStore(CharField(), ordered=True)
     self.pickled_kv = PickledKeyStore(ordered=True)
     self.kv.clear()
示例#7
0
 def setUp(self):
     self.kv = KeyStore(CharField(), ordered=True, database=db)
     self.kv.clear()