Development of an internal social media platform with personalised dashboards for students
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

defaults.py 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. # -*- coding: utf-8 -*-
  2. """
  3. celery.app.defaults
  4. ~~~~~~~~~~~~~~~~~~~
  5. Configuration introspection and defaults.
  6. """
  7. from __future__ import absolute_import
  8. import sys
  9. from collections import deque, namedtuple
  10. from datetime import timedelta
  11. from celery.five import items
  12. from celery.utils import strtobool
  13. from celery.utils.functional import memoize
  14. __all__ = ['Option', 'NAMESPACES', 'flatten', 'find']
  15. is_jython = sys.platform.startswith('java')
  16. is_pypy = hasattr(sys, 'pypy_version_info')
  17. DEFAULT_POOL = 'prefork'
  18. if is_jython:
  19. DEFAULT_POOL = 'threads'
  20. elif is_pypy:
  21. if sys.pypy_version_info[0:3] < (1, 5, 0):
  22. DEFAULT_POOL = 'solo'
  23. else:
  24. DEFAULT_POOL = 'prefork'
  25. DEFAULT_ACCEPT_CONTENT = ['json', 'pickle', 'msgpack', 'yaml']
  26. DEFAULT_PROCESS_LOG_FMT = """
  27. [%(asctime)s: %(levelname)s/%(processName)s] %(message)s
  28. """.strip()
  29. DEFAULT_LOG_FMT = '[%(asctime)s: %(levelname)s] %(message)s'
  30. DEFAULT_TASK_LOG_FMT = """[%(asctime)s: %(levelname)s/%(processName)s] \
  31. %(task_name)s[%(task_id)s]: %(message)s"""
  32. _BROKER_OLD = {'deprecate_by': '2.5', 'remove_by': '4.0',
  33. 'alt': 'BROKER_URL setting'}
  34. _REDIS_OLD = {'deprecate_by': '2.5', 'remove_by': '4.0',
  35. 'alt': 'URL form of CELERY_RESULT_BACKEND'}
  36. searchresult = namedtuple('searchresult', ('namespace', 'key', 'type'))
  37. # logging: processName first introduced in Py 2.6.2 (Issue #1644).
  38. if sys.version_info < (2, 6, 2):
  39. DEFAULT_PROCESS_LOG_FMT = DEFAULT_LOG_FMT
  40. class Option(object):
  41. alt = None
  42. deprecate_by = None
  43. remove_by = None
  44. typemap = dict(string=str, int=int, float=float, any=lambda v: v,
  45. bool=strtobool, dict=dict, tuple=tuple)
  46. def __init__(self, default=None, *args, **kwargs):
  47. self.default = default
  48. self.type = kwargs.get('type') or 'string'
  49. for attr, value in items(kwargs):
  50. setattr(self, attr, value)
  51. def to_python(self, value):
  52. return self.typemap[self.type](value)
  53. def __repr__(self):
  54. return '<Option: type->{0} default->{1!r}>'.format(self.type,
  55. self.default)
  56. NAMESPACES = {
  57. 'BROKER': {
  58. 'URL': Option(None, type='string'),
  59. 'CONNECTION_TIMEOUT': Option(4, type='float'),
  60. 'CONNECTION_RETRY': Option(True, type='bool'),
  61. 'CONNECTION_MAX_RETRIES': Option(100, type='int'),
  62. 'FAILOVER_STRATEGY': Option(None, type='string'),
  63. 'HEARTBEAT': Option(None, type='int'),
  64. 'HEARTBEAT_CHECKRATE': Option(3.0, type='int'),
  65. 'LOGIN_METHOD': Option(None, type='string'),
  66. 'POOL_LIMIT': Option(10, type='int'),
  67. 'USE_SSL': Option(False, type='bool'),
  68. 'TRANSPORT': Option(type='string'),
  69. 'TRANSPORT_OPTIONS': Option({}, type='dict'),
  70. 'HOST': Option(type='string', **_BROKER_OLD),
  71. 'PORT': Option(type='int', **_BROKER_OLD),
  72. 'USER': Option(type='string', **_BROKER_OLD),
  73. 'PASSWORD': Option(type='string', **_BROKER_OLD),
  74. 'VHOST': Option(type='string', **_BROKER_OLD),
  75. },
  76. 'CASSANDRA': {
  77. 'COLUMN_FAMILY': Option(type='string'),
  78. 'DETAILED_MODE': Option(False, type='bool'),
  79. 'KEYSPACE': Option(type='string'),
  80. 'READ_CONSISTENCY': Option(type='string'),
  81. 'SERVERS': Option(type='list'),
  82. 'WRITE_CONSISTENCY': Option(type='string'),
  83. },
  84. 'CELERY': {
  85. 'ACCEPT_CONTENT': Option(DEFAULT_ACCEPT_CONTENT, type='list'),
  86. 'ACKS_LATE': Option(False, type='bool'),
  87. 'ALWAYS_EAGER': Option(False, type='bool'),
  88. 'ANNOTATIONS': Option(type='any'),
  89. 'BROADCAST_QUEUE': Option('celeryctl'),
  90. 'BROADCAST_EXCHANGE': Option('celeryctl'),
  91. 'BROADCAST_EXCHANGE_TYPE': Option('fanout'),
  92. 'CACHE_BACKEND': Option(),
  93. 'CACHE_BACKEND_OPTIONS': Option({}, type='dict'),
  94. 'CHORD_PROPAGATES': Option(True, type='bool'),
  95. 'COUCHBASE_BACKEND_SETTINGS': Option(None, type='dict'),
  96. 'CREATE_MISSING_QUEUES': Option(True, type='bool'),
  97. 'DEFAULT_RATE_LIMIT': Option(type='string'),
  98. 'DISABLE_RATE_LIMITS': Option(False, type='bool'),
  99. 'DEFAULT_ROUTING_KEY': Option('celery'),
  100. 'DEFAULT_QUEUE': Option('celery'),
  101. 'DEFAULT_EXCHANGE': Option('celery'),
  102. 'DEFAULT_EXCHANGE_TYPE': Option('direct'),
  103. 'DEFAULT_DELIVERY_MODE': Option(2, type='string'),
  104. 'EAGER_PROPAGATES_EXCEPTIONS': Option(False, type='bool'),
  105. 'ENABLE_UTC': Option(True, type='bool'),
  106. 'ENABLE_REMOTE_CONTROL': Option(True, type='bool'),
  107. 'EVENT_SERIALIZER': Option('json'),
  108. 'EVENT_QUEUE_EXPIRES': Option(None, type='float'),
  109. 'EVENT_QUEUE_TTL': Option(None, type='float'),
  110. 'IMPORTS': Option((), type='tuple'),
  111. 'INCLUDE': Option((), type='tuple'),
  112. 'IGNORE_RESULT': Option(False, type='bool'),
  113. 'MAX_CACHED_RESULTS': Option(100, type='int'),
  114. 'MESSAGE_COMPRESSION': Option(type='string'),
  115. 'MONGODB_BACKEND_SETTINGS': Option(type='dict'),
  116. 'REDIS_HOST': Option(type='string', **_REDIS_OLD),
  117. 'REDIS_PORT': Option(type='int', **_REDIS_OLD),
  118. 'REDIS_DB': Option(type='int', **_REDIS_OLD),
  119. 'REDIS_PASSWORD': Option(type='string', **_REDIS_OLD),
  120. 'REDIS_MAX_CONNECTIONS': Option(type='int'),
  121. 'RESULT_BACKEND': Option(type='string'),
  122. 'RESULT_DB_SHORT_LIVED_SESSIONS': Option(False, type='bool'),
  123. 'RESULT_DB_TABLENAMES': Option(type='dict'),
  124. 'RESULT_DBURI': Option(),
  125. 'RESULT_ENGINE_OPTIONS': Option(type='dict'),
  126. 'RESULT_EXCHANGE': Option('celeryresults'),
  127. 'RESULT_EXCHANGE_TYPE': Option('direct'),
  128. 'RESULT_SERIALIZER': Option('pickle'),
  129. 'RESULT_PERSISTENT': Option(None, type='bool'),
  130. 'ROUTES': Option(type='any'),
  131. 'SEND_EVENTS': Option(False, type='bool'),
  132. 'SEND_TASK_ERROR_EMAILS': Option(False, type='bool'),
  133. 'SEND_TASK_SENT_EVENT': Option(False, type='bool'),
  134. 'STORE_ERRORS_EVEN_IF_IGNORED': Option(False, type='bool'),
  135. 'TASK_PUBLISH_RETRY': Option(True, type='bool'),
  136. 'TASK_PUBLISH_RETRY_POLICY': Option({
  137. 'max_retries': 3,
  138. 'interval_start': 0,
  139. 'interval_max': 1,
  140. 'interval_step': 0.2}, type='dict'),
  141. 'TASK_RESULT_EXPIRES': Option(timedelta(days=1), type='float'),
  142. 'TASK_SERIALIZER': Option('pickle'),
  143. 'TIMEZONE': Option(type='string'),
  144. 'TRACK_STARTED': Option(False, type='bool'),
  145. 'REDIRECT_STDOUTS': Option(True, type='bool'),
  146. 'REDIRECT_STDOUTS_LEVEL': Option('WARNING'),
  147. 'QUEUES': Option(type='dict'),
  148. 'QUEUE_HA_POLICY': Option(None, type='string'),
  149. 'SECURITY_KEY': Option(type='string'),
  150. 'SECURITY_CERTIFICATE': Option(type='string'),
  151. 'SECURITY_CERT_STORE': Option(type='string'),
  152. 'WORKER_DIRECT': Option(False, type='bool'),
  153. },
  154. 'CELERYD': {
  155. 'AGENT': Option(None, type='string'),
  156. 'AUTOSCALER': Option('celery.worker.autoscale:Autoscaler'),
  157. 'AUTORELOADER': Option('celery.worker.autoreload:Autoreloader'),
  158. 'CONCURRENCY': Option(0, type='int'),
  159. 'TIMER': Option(type='string'),
  160. 'TIMER_PRECISION': Option(1.0, type='float'),
  161. 'FORCE_EXECV': Option(False, type='bool'),
  162. 'HIJACK_ROOT_LOGGER': Option(True, type='bool'),
  163. 'CONSUMER': Option('celery.worker.consumer:Consumer', type='string'),
  164. 'LOG_FORMAT': Option(DEFAULT_PROCESS_LOG_FMT),
  165. 'LOG_COLOR': Option(type='bool'),
  166. 'LOG_LEVEL': Option('WARN', deprecate_by='2.4', remove_by='4.0',
  167. alt='--loglevel argument'),
  168. 'LOG_FILE': Option(deprecate_by='2.4', remove_by='4.0',
  169. alt='--logfile argument'),
  170. 'MAX_TASKS_PER_CHILD': Option(type='int'),
  171. 'POOL': Option(DEFAULT_POOL),
  172. 'POOL_PUTLOCKS': Option(True, type='bool'),
  173. 'POOL_RESTARTS': Option(False, type='bool'),
  174. 'PREFETCH_MULTIPLIER': Option(4, type='int'),
  175. 'STATE_DB': Option(),
  176. 'TASK_LOG_FORMAT': Option(DEFAULT_TASK_LOG_FMT),
  177. 'TASK_SOFT_TIME_LIMIT': Option(type='float'),
  178. 'TASK_TIME_LIMIT': Option(type='float'),
  179. 'WORKER_LOST_WAIT': Option(10.0, type='float')
  180. },
  181. 'CELERYBEAT': {
  182. 'SCHEDULE': Option({}, type='dict'),
  183. 'SCHEDULER': Option('celery.beat:PersistentScheduler'),
  184. 'SCHEDULE_FILENAME': Option('celerybeat-schedule'),
  185. 'SYNC_EVERY': Option(0, type='int'),
  186. 'MAX_LOOP_INTERVAL': Option(0, type='float'),
  187. 'LOG_LEVEL': Option('INFO', deprecate_by='2.4', remove_by='4.0',
  188. alt='--loglevel argument'),
  189. 'LOG_FILE': Option(deprecate_by='2.4', remove_by='4.0',
  190. alt='--logfile argument'),
  191. },
  192. 'CELERYMON': {
  193. 'LOG_LEVEL': Option('INFO', deprecate_by='2.4', remove_by='4.0',
  194. alt='--loglevel argument'),
  195. 'LOG_FILE': Option(deprecate_by='2.4', remove_by='4.0',
  196. alt='--logfile argument'),
  197. 'LOG_FORMAT': Option(DEFAULT_LOG_FMT),
  198. },
  199. 'EMAIL': {
  200. 'HOST': Option('localhost'),
  201. 'PORT': Option(25, type='int'),
  202. 'HOST_USER': Option(),
  203. 'HOST_PASSWORD': Option(),
  204. 'TIMEOUT': Option(2, type='float'),
  205. 'USE_SSL': Option(False, type='bool'),
  206. 'USE_TLS': Option(False, type='bool'),
  207. },
  208. 'SERVER_EMAIL': Option('celery@localhost'),
  209. 'ADMINS': Option((), type='tuple'),
  210. }
  211. def flatten(d, ns=''):
  212. stack = deque([(ns, d)])
  213. while stack:
  214. name, space = stack.popleft()
  215. for key, value in items(space):
  216. if isinstance(value, dict):
  217. stack.append((name + key + '_', value))
  218. else:
  219. yield name + key, value
  220. DEFAULTS = dict((key, value.default) for key, value in flatten(NAMESPACES))
  221. def find_deprecated_settings(source):
  222. from celery.utils import warn_deprecated
  223. for name, opt in flatten(NAMESPACES):
  224. if (opt.deprecate_by or opt.remove_by) and getattr(source, name, None):
  225. warn_deprecated(description='The {0!r} setting'.format(name),
  226. deprecation=opt.deprecate_by,
  227. removal=opt.remove_by,
  228. alternative='Use the {0.alt} instead'.format(opt))
  229. return source
  230. @memoize(maxsize=None)
  231. def find(name, namespace='celery'):
  232. # - Try specified namespace first.
  233. namespace = namespace.upper()
  234. try:
  235. return searchresult(
  236. namespace, name.upper(), NAMESPACES[namespace][name.upper()],
  237. )
  238. except KeyError:
  239. # - Try all the other namespaces.
  240. for ns, keys in items(NAMESPACES):
  241. if ns.upper() == name.upper():
  242. return searchresult(None, ns, keys)
  243. elif isinstance(keys, dict):
  244. try:
  245. return searchresult(ns, name.upper(), keys[name.upper()])
  246. except KeyError:
  247. pass
  248. # - See if name is a qualname last.
  249. return searchresult(None, name.upper(), DEFAULTS[name.upper()])