|
@@ -54,6 +54,13 @@ class Consumer(object):
|
|
|
self.app = app_or_default()
|
|
|
self.event_dispatcher = Dispatcher()
|
|
|
|
|
|
+ from celery.concurrency.base import BasePool
|
|
|
+ self.pool = BasePool(10)
|
|
|
+
|
|
|
+ @property
|
|
|
+ def info(self):
|
|
|
+ return {"xyz": "XYZ"}
|
|
|
+
|
|
|
|
|
|
class test_ControlPanel(unittest.TestCase):
|
|
|
|
|
@@ -63,6 +70,7 @@ class test_ControlPanel(unittest.TestCase):
|
|
|
|
|
|
def create_state(self, **kwargs):
|
|
|
kwargs.setdefault("logger", self.app.log.get_default_logger())
|
|
|
+ kwargs.setdefault("app", self.app)
|
|
|
return AttributeDict(kwargs)
|
|
|
|
|
|
def create_panel(self, **kwargs):
|
|
@@ -70,6 +78,15 @@ class test_ControlPanel(unittest.TestCase):
|
|
|
state=self.create_state(**kwargs),
|
|
|
handlers=Panel.data)
|
|
|
|
|
|
+ def test_enable_events(self):
|
|
|
+ consumer = Consumer()
|
|
|
+ panel = self.create_panel(consumer=consumer)
|
|
|
+ consumer.event_dispatcher.enabled = False
|
|
|
+ panel.handle("enable_events")
|
|
|
+ self.assertEqual(consumer.event_dispatcher.enabled, True)
|
|
|
+ self.assertIn("worker-online", consumer.event_dispatcher.sent)
|
|
|
+ self.assertTrue(panel.handle("enable_events")["ok"])
|
|
|
+
|
|
|
def test_disable_events(self):
|
|
|
consumer = Consumer()
|
|
|
panel = self.create_panel(consumer=consumer)
|
|
@@ -77,20 +94,103 @@ class test_ControlPanel(unittest.TestCase):
|
|
|
panel.handle("disable_events")
|
|
|
self.assertEqual(consumer.event_dispatcher.enabled, False)
|
|
|
self.assertIn("worker-offline", consumer.event_dispatcher.sent)
|
|
|
+ self.assertTrue(panel.handle("disable_events")["ok"])
|
|
|
|
|
|
- def test_enable_events(self):
|
|
|
+ def test_heartbeat(self):
|
|
|
consumer = Consumer()
|
|
|
panel = self.create_panel(consumer=consumer)
|
|
|
- consumer.event_dispatcher.enabled = False
|
|
|
- panel.handle("enable_events")
|
|
|
- self.assertEqual(consumer.event_dispatcher.enabled, True)
|
|
|
- self.assertIn("worker-online", consumer.event_dispatcher.sent)
|
|
|
+ consumer.event_dispatcher.enabled = True
|
|
|
+ panel.handle("heartbeat")
|
|
|
+ self.assertIn("worker-heartbeat", consumer.event_dispatcher.sent)
|
|
|
|
|
|
def test_dump_tasks(self):
|
|
|
info = "\n".join(self.panel.handle("dump_tasks"))
|
|
|
self.assertIn("mytask", info)
|
|
|
self.assertIn("rate_limit=200", info)
|
|
|
|
|
|
+ def test_stats(self):
|
|
|
+ from celery.worker import state
|
|
|
+ prev_count, state.total_count = state.total_count, 100
|
|
|
+ try:
|
|
|
+ self.assertDictContainsSubset({"total": 100,
|
|
|
+ "consumer": {"xyz": "XYZ"}},
|
|
|
+ self.panel.handle("stats"))
|
|
|
+ finally:
|
|
|
+ state.total_count = prev_count
|
|
|
+
|
|
|
+ def test_active(self):
|
|
|
+ from celery.worker import state
|
|
|
+ from celery.worker.job import TaskRequest
|
|
|
+ from celery.task import PingTask
|
|
|
+
|
|
|
+ r = TaskRequest(PingTask.name, "do re mi", (), {})
|
|
|
+ state.active_requests.add(r)
|
|
|
+ try:
|
|
|
+ self.assertTrue(self.panel.handle("dump_active"))
|
|
|
+ finally:
|
|
|
+ state.active_requests.discard(r)
|
|
|
+
|
|
|
+ def test_pool_grow(self):
|
|
|
+
|
|
|
+ class MockPool(object):
|
|
|
+
|
|
|
+ def __init__(self, size=1):
|
|
|
+ self.size = size
|
|
|
+
|
|
|
+ def grow(self, n=1):
|
|
|
+ self.size += n
|
|
|
+
|
|
|
+ def shrink(self, n=1):
|
|
|
+ self.size -= n
|
|
|
+
|
|
|
+ consumer = Consumer()
|
|
|
+ consumer.pool = MockPool()
|
|
|
+ panel = self.create_panel(consumer=consumer)
|
|
|
+
|
|
|
+ panel.handle("pool_grow")
|
|
|
+ self.assertEqual(consumer.pool.size, 2)
|
|
|
+ panel.handle("pool_shrink")
|
|
|
+ self.assertEqual(consumer.pool.size, 1)
|
|
|
+
|
|
|
+ def test_add__cancel_consumer(self):
|
|
|
+
|
|
|
+ class MockConsumer(object):
|
|
|
+ queues = []
|
|
|
+ cancelled = []
|
|
|
+ consuming = False
|
|
|
+
|
|
|
+ def add_consumer_from_dict(self, **declaration):
|
|
|
+ self.queues.append(declaration["queue"])
|
|
|
+
|
|
|
+ def consume(self):
|
|
|
+ self.consuming = True
|
|
|
+
|
|
|
+ def cancel_by_queue(self, queue):
|
|
|
+ self.cancelled.append(queue)
|
|
|
+
|
|
|
+ consumer = Consumer()
|
|
|
+ consumer.task_consumer = MockConsumer()
|
|
|
+ panel = self.create_panel(consumer=consumer)
|
|
|
+
|
|
|
+ panel.handle("add_consumer", {"queue": "MyQueue"})
|
|
|
+ self.assertIn("MyQueue", consumer.task_consumer.queues)
|
|
|
+ self.assertTrue(consumer.task_consumer.consuming)
|
|
|
+ panel.handle("cancel_consumer", {"queue": "MyQueue"})
|
|
|
+ self.assertIn("MyQueue", consumer.task_consumer.cancelled)
|
|
|
+
|
|
|
+
|
|
|
+ def test_revoked(self):
|
|
|
+ from celery.worker import state
|
|
|
+ state.revoked.clear()
|
|
|
+ state.revoked.add("a1")
|
|
|
+ state.revoked.add("a2")
|
|
|
+
|
|
|
+ try:
|
|
|
+ self.assertListEqual(self.panel.handle("dump_revoked"),
|
|
|
+ ["a1", "a2"])
|
|
|
+ finally:
|
|
|
+ state.revoked.clear()
|
|
|
+
|
|
|
def test_dump_schedule(self):
|
|
|
consumer = Consumer()
|
|
|
panel = self.create_panel(consumer=consumer)
|