diff --git a/oslo_service/tests/test_threadgroup.py b/oslo_service/tests/test_threadgroup.py index 7857e06c..a4ab26c0 100644 --- a/oslo_service/tests/test_threadgroup.py +++ b/oslo_service/tests/test_threadgroup.py @@ -49,6 +49,49 @@ class ThreadGroupTestCase(test_base.BaseTestCase): self.assertEqual(('arg',), timer.args) self.assertEqual({'kwarg': 'kwarg'}, timer.kw) + def test_add_dynamic_timer_args(self): + def foo(*args, **kwargs): + pass + + self.tg.add_dynamic_timer_args(foo, ['arg'], {'kwarg': 'kwarg'}, + initial_delay=1, + periodic_interval_max=2) + + self.assertEqual(1, len(self.tg.timers)) + + timer = self.tg.timers[0] + self.assertTrue(timer._running) + self.assertEqual(('arg',), timer.args) + self.assertEqual({'kwarg': 'kwarg'}, timer.kw) + + def test_add_timer(self): + def foo(*args, **kwargs): + pass + + self.tg.add_timer(1, foo, 1, + 'arg', kwarg='kwarg') + + self.assertEqual(1, len(self.tg.timers)) + + timer = self.tg.timers[0] + self.assertTrue(timer._running) + self.assertEqual(('arg',), timer.args) + self.assertEqual({'kwarg': 'kwarg'}, timer.kw) + + def test_add_timer_args(self): + def foo(*args, **kwargs): + pass + + self.tg.add_timer_args(1, foo, ['arg'], {'kwarg': 'kwarg'}, + initial_delay=1) + + self.assertEqual(1, len(self.tg.timers)) + + timer = self.tg.timers[0] + self.assertTrue(timer._running) + self.assertEqual(('arg',), timer.args) + self.assertEqual({'kwarg': 'kwarg'}, timer.kw) + def test_stop_current_thread(self): stop_event = event.Event() diff --git a/oslo_service/threadgroup.py b/oslo_service/threadgroup.py index ee5ad0f2..bcb79d0b 100644 --- a/oslo_service/threadgroup.py +++ b/oslo_service/threadgroup.py @@ -14,6 +14,7 @@ import logging import threading +import warnings import eventlet from eventlet import greenpool @@ -77,6 +78,20 @@ class ThreadGroup(object): def add_dynamic_timer(self, callback, initial_delay=None, periodic_interval_max=None, *args, **kwargs): + if args or kwargs: + warnings.warn("Calling add_dynamic_timer() with arguments to the " + "callback function is deprecated. Use " + "add_dynamic_timer_args() instead.", + DeprecationWarning) + return self.add_dynamic_timer_args( + callback, args, kwargs, + initial_delay=initial_delay, + periodic_interval_max=periodic_interval_max) + + def add_dynamic_timer_args(self, callback, args=None, kwargs=None, + initial_delay=None, periodic_interval_max=None): + args = args or [] + kwargs = kwargs or {} timer = loopingcall.DynamicLoopingCall(callback, *args, **kwargs) timer.start(initial_delay=initial_delay, periodic_interval_max=periodic_interval_max) @@ -85,6 +100,18 @@ class ThreadGroup(object): def add_timer(self, interval, callback, initial_delay=None, *args, **kwargs): + if args or kwargs: + warnings.warn("Calling add_timer() with arguments to the callback " + "function is deprecated. Use add_timer_args() " + "instead.", + DeprecationWarning) + return self.add_timer_args(interval, callback, args, kwargs, + initial_delay=initial_delay) + + def add_timer_args(self, interval, callback, args=None, kwargs=None, + initial_delay=None): + args = args or [] + kwargs = kwargs or {} pulse = loopingcall.FixedIntervalLoopingCall(callback, *args, **kwargs) pulse.start(interval=interval, initial_delay=initial_delay) diff --git a/releasenotes/notes/timer-args-f578c8f9d08b217d.yaml b/releasenotes/notes/timer-args-f578c8f9d08b217d.yaml new file mode 100644 index 00000000..49f7c729 --- /dev/null +++ b/releasenotes/notes/timer-args-f578c8f9d08b217d.yaml @@ -0,0 +1,15 @@ +--- +features: + - | + The ThreadGroup class has new add_timer_args() and add_dynamic_timer_args() + methods to create timers passing the positional and keyword arguments to + the callback as a sequence and a mapping. This API provides more + flexibility for the addition of timer control options in the future. +deprecations: + - | + The API of the ThreadGroup add_timer() and add_dynamic_timer() methods has + been identified as error-prone when passing arguments intended for the + callback function. Passing callback arguments in this way is now + deprecated. Callers should use the new add_timer_args() or + add_dynamic_timer_args() methods (respectively) instead when it is + necessary to pass arguments to the timer callback function.