defaults.py 10 KB

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