def when_authenticated(result): log.msg('otter.auth.cache.populate') self._cache[tenant_id] = (self._reactor.seconds(), result) waiters = self._waiters.pop(tenant_id, []) for waiter in waiters: waiter.callback(result) return result
def authenticate_tenant(self, tenant_id): """ see :meth:`IAuthenticator.authenticate_tenant` """ log = self._log.bind(tenant_id=tenant_id) if tenant_id in self._cache: (created, data) = self._cache[tenant_id] now = self._reactor.seconds() if now - created <= self._ttl: log.msg('otter.auth.cache.hit', age=now - created) return succeed(data) log.msg('otter.auth.cache.expired', age=now - created) if tenant_id in self._waiters: d = Deferred() self._waiters[tenant_id].append(d) log.msg('otter.auth.cache.waiting', waiters=len(self._waiters[tenant_id])) return d def when_authenticated(result): log.msg('otter.auth.cache.populate') self._cache[tenant_id] = (self._reactor.seconds(), result) waiters = self._waiters.pop(tenant_id, []) for waiter in waiters: waiter.callback(result) return result def when_auth_fails(failure): waiters = self._waiters.pop(tenant_id, []) for waiter in waiters: waiter.errback(failure) return failure log.msg('otter.auth.cache.miss') self._waiters[tenant_id] = [] d = self._authenticator.authenticate_tenant(tenant_id) d.addCallback(when_authenticated) d.addErrback(when_auth_fails) return d