'Waits for an asynchronous operation to complete.
This calls get_operation_status in a loop and returns when the expected
status is reached. The result of get_operation_status is returned. By
default, an exception is raised on timeout or error status.
request_id:
The request ID for the request you wish to track.
wait_for_status:
Status to wait for. Default is \'Succeeded\'.
timeout:
Total timeout in seconds. Default is 30s.
sleep_interval:
Sleep time in seconds for each iteration. Default is 5s.
progress_callback:
Callback for each iteration.
Default prints \'.\'.
Set it to None for no progress notification.
success_callback:
Callback on success. Default prints newline.
Set it to None for no success notification.
failure_callback:
Callback on failure. Default prints newline+error details then
raises exception.
Set it to None for no failure notification.'

def wait_for_operation_status(self, request_id, wait_for_status='Succeeded', timeout=30, sleep_interval=5, progress_callback=wait_for_operation_status_progress_default_callback, success_callback=wait_for_operation_status_success_default_callback, failure_callback=wait_for_operation_status_failure_default_callback):

    loops = ((timeout // sleep_interval) + 1)
    start_time = time.time()
    for _ in range(int(loops)):
        result = self.get_operation_status(request_id)
        elapsed = (time.time() - start_time)
        if (result.status == wait_for_status):
            if (success_callback is not None):
                success_callback(elapsed)
            return result
        elif result.error:
            if (failure_callback is not None):
                ex = AzureAsyncOperationHttpError(_ERROR_ASYNC_OP_FAILURE, result.status, result)
                failure_callback(elapsed, ex)
            return result
        else:
            if (progress_callback is not None):
                progress_callback(elapsed)
            time.sleep(sleep_interval)
    if (failure_callback is not None):
        ex = AzureAsyncOperationHttpError(_ERROR_ASYNC_OP_TIMEOUT, result.status, result)
        failure_callback(elapsed, ex)
    return result
