Files
edx-platform/openedx/core/lib/celery/routers.py
Andrés González 26b3a40133 INCR-108 (#20058)
* INCR-108: Run python-modernize on openedx/core/lib

* Fixed urlencode import

* Fixed diff quality warnings and six.string_types error

* Fixed pickle import

* Fixed iteritems import

* Fixed ungrouped imports

* Fixed six.moves import issues
2019-04-02 10:26:00 -04:00

67 lines
1.9 KiB
Python

"""
Custom routers used by both lms and cms when routing tasks to worker queues.
For more, see https://celery.readthedocs.io/en/latest/userguide/routing.html#routers
"""
from __future__ import absolute_import
import logging
from abc import ABCMeta, abstractproperty
from django.conf import settings
import six
log = logging.getLogger(__name__)
class AlternateEnvironmentRouter(six.with_metaclass(ABCMeta, object)):
"""
A custom Router class for use in routing celery tasks to non-default queues.
"""
@abstractproperty
def alternate_env_tasks(self):
"""
Defines the task -> alternate worker environment to be used when routing.
Subclasses must override this property with their own specific mappings.
"""
return {}
@property
def explicit_queues(self):
"""
Defines the task -> alternate worker queue to be used when routing.
"""
return {}
def route_for_task(self, task, args=None, kwargs=None): # pylint: disable=unused-argument
"""
Celery-defined method allowing for custom routing logic.
If None is returned from this method, default routing logic is used.
"""
if task in self.explicit_queues:
return self.explicit_queues[task]
alternate_env = self.alternate_env_tasks.get(task, None)
if alternate_env:
return self.ensure_queue_env(alternate_env)
return None
def ensure_queue_env(self, desired_env):
"""
Helper method to get the desired type of queue.
If no such queue is defined, default routing logic is used.
"""
queues = getattr(settings, 'CELERY_QUEUES', None)
return next(
(
queue
for queue in queues
if '.{}.'.format(desired_env) in queue
),
None
)