Browse Source

Add a command line option for setting the result backend URL (#4549)

* A new option has been added for setting the result backend URL

* Use Settings.get() instead of .first()

* Fix E501

* Fix a wrong magic string
y0ngdi 7 years ago
parent
commit
f3ef0df5a6
3 changed files with 25 additions and 0 deletions
  1. 7 0
      celery/app/utils.py
  2. 4 0
      celery/bin/base.py
  3. 14 0
      t/unit/bin/test_base.py

+ 7 - 0
celery/app/utils.py

@@ -102,6 +102,13 @@ class Settings(ConfigurationView):
             self.first('broker_url', 'broker_host')
         )
 
+    @property
+    def result_backend(self):
+        return (
+            os.environ.get('CELERY_RESULT_BACKEND') or
+            self.get('CELERY_RESULT_BACKEND')
+        )
+
     @property
     def task_default_exchange(self):
         return self.first(

+ 4 - 0
celery/bin/base.py

@@ -298,6 +298,7 @@ class Command(object):
         group = parser.add_argument_group('Global Options')
         group.add_argument('-A', '--app', default=None)
         group.add_argument('-b', '--broker', default=None)
+        group.add_argument('--result-backend', default=None)
         group.add_argument('--loader', default=None)
         group.add_argument('--config', default=None)
         group.add_argument('--workdir', default=None)
@@ -467,6 +468,9 @@ class Command(object):
         broker = preload_options.get('broker', None)
         if broker:
             os.environ['CELERY_BROKER_URL'] = broker
+        result_backend = preload_options.get('result_backend', None)
+        if result_backend:
+            os.environ['CELERY_RESULT_BACKEND'] = result_backend
         config = preload_options.get('config')
         if config:
             os.environ['CELERY_CONFIG_MODULE'] = config

+ 14 - 0
t/unit/bin/test_base.py

@@ -166,6 +166,18 @@ class test_Command:
             else:
                 os.environ.pop('CELERY_BROKER_URL', None)
 
+    def test_with_custom_result_backend(self, app):
+        prev = os.environ.pop('CELERY_RESULT_BACKEND', None)
+        try:
+            cmd = MockCommand(app=app)
+            cmd.setup_app_from_commandline(['--result-backend=xyzza://'])
+            assert os.environ.get('CELERY_RESULT_BACKEND') == 'xyzza://'
+        finally:
+            if prev:
+                os.environ['CELERY_RESULT_BACKEND'] = prev
+            else:
+                os.environ.pop('CELERY_RESULT_BACKEND', None)
+
     def test_with_custom_app(self, app):
         cmd = MockCommand(app=app)
         appstr = '.'.join([__name__, 'APP'])
@@ -276,8 +288,10 @@ class test_Command:
         cmd.namespace = 'worker'
         rest = cmd.setup_app_from_commandline(argv=[
             '--loglevel=INFO', '--',
+            'result.backend=redis://backend.example.com',
             'broker.url=amqp://broker.example.com',
             '.prefetch_multiplier=100'])
+        assert cmd.app.conf.result_backend == 'redis://backend.example.com'
         assert cmd.app.conf.broker_url == 'amqp://broker.example.com'
         assert cmd.app.conf.worker_prefetch_multiplier == 100
         assert rest == ['--loglevel=INFO']