From 287258e10451f37ffe47a60bfaaaa88886e26aaa Mon Sep 17 00:00:00 2001 From: Noah Levitt Date: Fri, 6 Nov 2015 23:42:06 +0000 Subject: [PATCH] add method available_services to ServiceRegistry, returns all services considered up for the supplied role --- rethinkstuff/__init__.py | 8 ++++++++ tests/test_rethinker.py | 13 +++++++++++++ 2 files changed, 21 insertions(+) diff --git a/rethinkstuff/__init__.py b/rethinkstuff/__init__.py index b7666fc..cb3d95b 100644 --- a/rethinkstuff/__init__.py +++ b/rethinkstuff/__init__.py @@ -161,3 +161,11 @@ class ServiceRegistry(object): except r.ReqlNonExistenceError: return None + def available_services(self, role): + try: + result = self.r.table('services').filter({"role":role}).filter( + lambda svc: r.now().sub(svc["last_heartbeat"]) < 3 * svc["heartbeat_interval"] #.default(20.0) + ).order_by("load").run() + return result + except r.ReqlNonExistenceError: + return [] diff --git a/tests/test_rethinker.py b/tests/test_rethinker.py index 14bf3ef..066cf0a 100644 --- a/tests/test_rethinker.py +++ b/tests/test_rethinker.py @@ -151,3 +151,16 @@ def test_service_registry(r): assert svcreg.available_service("no-such-role") == None assert svcreg.available_service("yes-such-role") == None + svc0 = { + "role": "yes-such-role", + "load": 100.0, + "heartbeat_interval": 0.2, + } + svc1 = { + "role": "yes-such-role", + "load": 200.0, + "heartbeat_interval": 0.2, + } + svc0 = svcreg.heartbeat(svc0) + svc1 = svcreg.heartbeat(svc1) + assert len(svcreg.available_services("yes-such-role")) == 2