defaults.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. from datetime import timedelta
  2. DEFAULT_PROCESS_LOG_FMT = """
  3. [%(asctime)s: %(levelname)s/%(processName)s] %(message)s
  4. """.strip()
  5. DEFAULT_LOG_FMT = '[%(asctime)s: %(levelname)s] %(message)s'
  6. DEFAULT_TASK_LOG_FMT = " ".join("""
  7. [%(asctime)s: %(levelname)s/%(processName)s]
  8. [%(task_name)s(%(task_id)s)] %(message)s
  9. """.strip().split())
  10. def str_to_bool(s):
  11. s = s.lower()
  12. if s in ("false", "no", "0"):
  13. return False
  14. if s in ("true", "yes", "1"):
  15. return True
  16. raise TypeError("%r can not be converted to type bool" % (s, ))
  17. class Option(object):
  18. typemap = {"string": str,
  19. "int": int,
  20. "float": float,
  21. "bool": str_to_bool,
  22. "dict": dict,
  23. "tuple": tuple}
  24. def __init__(self, default=None, *args, **kwargs):
  25. self.default = default
  26. kwargs.setdefault("type", "string")
  27. self.type = kwargs["type"]
  28. self.args = args
  29. self.kwargs = kwargs
  30. def to_python(self, value):
  31. return self.typemap[self.type](value)
  32. NAMESPACES = {
  33. "BROKER": {
  34. "HOST": Option("localhost"),
  35. "PORT": Option(type="int"),
  36. "USER": Option("guest"),
  37. "PASSWORD": Option("guest"),
  38. "VHOST": Option("/"),
  39. "BACKEND": Option(),
  40. "CONNECTION_TIMEOUT": Option(4, type="int"),
  41. "CONNECTION_RETRY": Option(True, type="bool"),
  42. "CONNECTION_MAX_RETRIES": Option(100, type="int"),
  43. "INSIST": Option(False, type="bool"),
  44. "USE_SSL": Option(False, type="bool"),
  45. },
  46. "CELERY": {
  47. "ACKS_LATE": Option(False, type="bool"),
  48. "ALWAYS_EAGER": Option(False, type="bool"),
  49. "BROADCAST_QUEUE": Option("celeryctl"),
  50. "BROADCAST_EXCHANGE": Option("celeryctl"),
  51. "BROADCAST_EXCHANGE_TYPE": Option("fanout"),
  52. "CACHE_BACKEND": Option(),
  53. "CACHE_BACKEND_OPTIONS": Option({}, type="dict"),
  54. "CREATE_MISSING_QUEUES": Option(True, type="bool"),
  55. "DEFAULT_RATE_LIMIT": Option(type="string"),
  56. "DISABLE_RATE_LIMITS": Option(False, type="bool"),
  57. "DEFAULT_ROUTING_KEY": Option("celery"),
  58. "DEFAULT_QUEUE": Option("celery"),
  59. "DEFAULT_EXCHANGE": Option("celery"),
  60. "DEFAULT_EXCHANGE_TYPE": Option("direct"),
  61. "DEFAULT_DELIVERY_MODE": Option(2, type="string"),
  62. "EAGER_PROPAGATES_EXCEPTIONS": Option(False, type="bool"),
  63. "EVENT_QUEUE": Option("celeryevent"),
  64. "EVENT_EXCHANGE": Option("celeryevent"),
  65. "EVENT_EXCHANGE_TYPE": Option("direct"),
  66. "EVENT_ROUTING_KEY": Option("celeryevent"),
  67. "EVENT_SERIALIZER": Option("json"),
  68. "IMPORTS": Option((), type="tuple"),
  69. "IGNORE_RESULT": Option(False, type="bool"),
  70. "MAX_CACHED_RESULTS": Option(5000, type="int"),
  71. "MESSAGE_COMPRESSION": Option(None, type="string"),
  72. "RESULT_BACKEND": Option("amqp"),
  73. "RESULT_DBURI": Option(),
  74. "RESULT_ENGINE_OPTIONS": Option(None, type="dict"),
  75. "RESULT_EXCHANGE": Option("celeryresults"),
  76. "RESULT_EXCHANGE_TYPE": Option("direct"),
  77. "RESULT_SERIALIZER": Option("pickle"),
  78. "RESULT_PERSISTENT": Option(False, type="bool"),
  79. "SEND_EVENTS": Option(False, type="bool"),
  80. "SEND_TASK_ERROR_EMAILS": Option(False, type="bool"),
  81. "STORE_ERRORS_EVEN_IF_IGNORED": Option(False, type="bool"),
  82. "TASK_RESULT_EXPIRES": Option(timedelta(days=1), type="int"),
  83. "AMQP_TASK_RESULT_EXPIRES": Option(type="int"),
  84. "TASK_ERROR_WHITELIST": Option((), type="tuple"),
  85. "TASK_SERIALIZER": Option("pickle"),
  86. "TRACK_STARTED": Option(False, type="bool"),
  87. "REDIRECT_STDOUTS": Option(True, type="bool"),
  88. "REDIRECT_STDOUTS_LEVEL": Option("WARNING"),
  89. },
  90. "CELERYD": {
  91. "CONCURRENCY": Option(0, type="int"),
  92. "ETA_SCHEDULER": Option("celery.utils.timer2.Timer"),
  93. "ETA_SCHEDULER_PRECISION": Option(1.0, type="float"),
  94. "LISTENER": Option("celery.worker.listener.CarrotListener"),
  95. "LOG_FORMAT": Option(DEFAULT_PROCESS_LOG_FMT),
  96. "LOG_COLOR": Option(type="bool"),
  97. "LOG_LEVEL": Option("WARN"),
  98. "LOG_FILE": Option(),
  99. "MEDIATOR": Option("celery.worker.controllers.Mediator"),
  100. "MAX_TASKS_PER_CHILD": Option(type="int"),
  101. "POOL": Option("celery.concurrency.processes.TaskPool"),
  102. "POOL_PUTLOCKS": Option(True, type="bool"),
  103. "PREFETCH_MULTIPLIER": Option(4, type="int"),
  104. "STATE_DB": Option(),
  105. "TASK_LOG_FORMAT": Option(DEFAULT_TASK_LOG_FMT),
  106. "TASK_SOFT_TIME_LIMIT": Option(type="int"),
  107. "TASK_TIME_LIMIT": Option(type="int"),
  108. },
  109. "CELERYBEAT": {
  110. "SCHEDULE": Option({}, type="dict"),
  111. "SCHEDULER": Option("celery.beat.PersistentScheduler"),
  112. "SCHEDULE_FILENAME": Option("celerybeat-schedule"),
  113. "MAX_LOOP_INTERVAL": Option(5 * 60, type="int"),
  114. "LOG_LEVEL": Option("INFO"),
  115. "LOG_FILE": Option(),
  116. },
  117. "CELERYMON": {
  118. "LOG_LEVEL": Option("INFO"),
  119. "LOG_FILE": Option(),
  120. "LOG_FORMAT": Option(DEFAULT_LOG_FMT),
  121. },
  122. "EMAIL": {
  123. "HOST": Option("localhost"),
  124. "PORT": Option(25, type="int"),
  125. "HOST_USER": Option(None),
  126. "HOST_PASSWORD": Option(None),
  127. },
  128. "SERVER_EMAIL": Option("celery@localhost"),
  129. "ADMINS": Option((), type="tuple"),
  130. }
  131. def _flatten(d, ns=""):
  132. acc = []
  133. for key, value in d.iteritems():
  134. if isinstance(value, dict):
  135. acc.extend(_flatten(value, ns=key + '_'))
  136. else:
  137. acc.append((ns + key, value.default))
  138. return acc
  139. DEFAULTS = dict(_flatten(NAMESPACES))