[Kimchi-devel] [PATCH 3/5] AsyncTask: Improve continuous status feedback

Zhou Zheng Sheng zhshzhou at linux.vnet.ibm.com
Thu Oct 30 05:43:02 UTC 2014


on 2014/10/30 00:14, Aline Manera wrote:
> 
> On 10/28/2014 04:48 AM, Zhou Zheng Sheng wrote:
>> One of the advantage of AsyncTask is that the background task can call
>> "_status_cb()" multiple times to report the interim progress. However
>> this is not properly implemented in "_status_cb()". The correct handling
>> should be as follow.
>>
>> cb(message, True)
>>    Means task finished succesfully.
>>
>> cb(message, False)
>>    Means task failed.
>>
>> cb(message)
>> cb(message, None)
>>    Means task is ongoing and the invocation is to provide progress
>> feedback.
>>
>> The current implementation fails to distinguish "cb(message, False)" and
>> "cb(message)". This patch fixes the problem and adds a new test case.
>>
>> This patch also improves the "_wait_task()" methods in tests, adding a
>> regular status report to allow developer know it's waiting for some task
>> but not stuck on something. There is also two methods in tests that
>> start a
>> AsyncTask but do not wait it till finish, this will interfere with other
>> tests, so the patch adds the missing "_wait_task()" invocation for them.
>>
>> Signed-off-by: Zhou Zheng Sheng <zhshzhou at linux.vnet.ibm.com>
>> ---
>>   src/kimchi/asynctask.py |  4 ++--
>>   tests/test_mockmodel.py | 14 ++++++++++++++
>>   tests/test_model.py     | 31 ++++++++++++++++++++++++++-----
>>   tests/test_rest.py      |  7 +++++++
>>   4 files changed, 49 insertions(+), 7 deletions(-)
>>
>> diff --git a/src/kimchi/asynctask.py b/src/kimchi/asynctask.py
>> index 99e7a64..f8e55c0 100644
>> --- a/src/kimchi/asynctask.py
>> +++ b/src/kimchi/asynctask.py
>> @@ -49,9 +49,9 @@ class AsyncTask(object):
>>               self._save_helper()
>>               return
>>
>> -        if success:
>> +        if success == True:
>>               self.status = 'finished'
>> -        else:
>> +        elif success ==False:
>>               self.status = 'failed'
>>           self.message = message
>>           self._save_helper()
>> diff --git a/tests/test_mockmodel.py b/tests/test_mockmodel.py
>> index 8de7ce9..3158c48 100644
>> --- a/tests/test_mockmodel.py
>> +++ b/tests/test_mockmodel.py
>> @@ -27,6 +27,7 @@ import unittest
>>   import kimchi.mockmodel
>>   from utils import get_free_port, patch_auth, request, run_server
>>   from kimchi.control.base import Collection, Resource
>> +from kimchi.utils import kimchi_log
>>
>>
>>   test_server = None
>> @@ -174,3 +175,16 @@ class MockModelTests(unittest.TestCase):
>>           task = model.host_swupdate()
>>           task_params = [u'id', u'message', u'status', u'target_uri']
>>           self.assertEquals(sorted(task_params), sorted(task.keys()))
>> +        self._wait_task(model, task['id'])
> 
>> +
>> +    def _wait_task(self, model, taskid, timeout=5):
>> +        for i in range(0, timeout):
>> +            task_info = model.task_lookup(taskid)
>> +            if task_info['status'] == "running":
>> +                kimchi_log.info("Waiting task %s, message: %s",
>> +                                task_info['id'], task_info['message'])
>> +                time.sleep(1)
>> +            else:
>> +                return
>> +        kimchi_log.error("Timeout while process long-run task, "
>> +                         "try to increase timeout value.")
> 
> We could move it to tests/utils.py to avoid duplicating code when a Task
> needs to be watched.
> 

Thank you Aline. I just sent a new version according to your comments.




More information about the Kimchi-devel mailing list