Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Kubernetes Async API Calls with Callbacks Support #2231

Open
dirrao opened this issue May 16, 2024 · 7 comments
Open

Kubernetes Async API Calls with Callbacks Support #2231

dirrao opened this issue May 16, 2024 · 7 comments
Labels
kind/feature Categorizes issue or PR as related to a new feature.

Comments

@dirrao
Copy link
Contributor

dirrao commented May 16, 2024

Kubernetes API calls do support async operations. As of now, we don't a have to provide the callbacks for async calls. It would be good idea to provide success and failure callbacks to avoid polling for the result.

Example: create_namespaced_pod(namespace, body, async_req=True, async_callback, async_error_callback)

@dirrao dirrao added the kind/feature Categorizes issue or PR as related to a new feature. label May 16, 2024
@dirrao
Copy link
Contributor Author

dirrao commented May 16, 2024

I would like to submit the PR if we align on this.

@roycaihw
Copy link
Member

Upstream Kubernetes API doesn't support such callback mechanism AFAICT. Could you check with the upstream on this feature request?

@dirrao
Copy link
Contributor Author

dirrao commented May 20, 2024

@roycaihw
Async calls are submitted through python thread pool. Python thread pool does support callbacks.

Check api_client.py for the same

        if not async_req:
            return self.__call_api(resource_path, method,
                                   path_params, query_params, header_params,
                                   body, post_params, files,
                                   response_type, auth_settings,
                                   _return_http_data_only, collection_formats,
                                   _preload_content, _request_timeout, _host)

        return self.pool.apply_async(self.__call_api, (resource_path,
                                                       method, path_params,
                                                       query_params,
                                                       header_params, body,
                                                       post_params, files,
                                                       response_type,
                                                       auth_settings,
                                                       _return_http_data_only,
                                                       collection_formats,
                                                       _preload_content,
                                                       _request_timeout,
                                                       _host))

@roycaihw
Copy link
Member

CC @tomplus Could you take a look?

@tomplus
Copy link
Member

tomplus commented May 23, 2024

apply_async returns AsyncResult so as you've written it doesn't support callbacks. These functions are auto-generated by OpenAPI Generator so it's not easy to introduce such change.

I can suggest using sync api calls but from a dedicated thread pool where you can add callbacks as you need. What do you think?

@dirrao
Copy link
Contributor Author

dirrao commented May 23, 2024

@tomplus
We were avoiding the synchronous requests due to performance reasons. It would be great if we make the requests asyncronous with callbacks support.

@tomplus
Copy link
Member

tomplus commented May 23, 2024

Correct me if I'm wrong but you want to have something like this:

create_namespaced_pod("pod-1", "ns-1", cb_success, cb_error)
create_namespaced_pod("pod-2", "ns-2", cb_success, cb_error)

so instead of using async_req i suggest you implement it in this way (draft):

def cb_helper(func_name, cb_success, cb_error, *args, **kwargs):
    try:
       result = func_name(*args, **kwargs)
    except Exception as ex:
       cb_error(ex)
    cb_success(result)

pool = with ThreadPool()
pool.apply_async(cb_helper, create_namespaced_pod, "pod-1", "ns-1", cb_success, cb_error)
pool.apply_async(cb_helper, create_namespaced_pod, "pod-2", "ns-2", cb_success, cb_error)    
....
....

so it uses synchronous requests but from threads so main thread is not blocked...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
kind/feature Categorizes issue or PR as related to a new feature.
Projects
None yet
Development

No branches or pull requests

3 participants