kubernetes-client / python

Official Python client library for kubernetes
http://kubernetes.io/
Apache License 2.0
6.55k stars 3.24k forks source link

kubernetes.client.AuthenticationV1TokenRequest() fails #2250

Open jhourque opened 4 days ago

jhourque commented 4 days ago

What happened (please include outputs or screenshots): In documentation, the example given for api create_namespaced_service_account is not working due to: body = kubernetes.client.V1ServiceAccount()

Traceback (most recent call last): File "t.py", line 87, in body = kubernetes.client.AuthenticationV1TokenRequest() # AuthenticationV1TokenRequest | File "/usr/local/lib/python3.7/site-packages/kubernetes/client/models/authentication_v1_token_request.py", line 70, in init self.spec = spec File "/usr/local/lib/python3.7/site-packages/kubernetes/client/models/authentication_v1_token_request.py", line 160, in spec raise ValueError("Invalid value for spec, must not be None") # noqa: E501 ValueError: Invalid value for spec, must not be None

(Nota: code indentation id wrong, but the issue is still there even while fixing it)

What you expected to happen: The call to create_namespaced_service_account should work but the example is stuck before this call

How to reproduce it (as minimally and precisely as possible): Copy paste example given : https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/CoreV1Api.md#create_namespaced_service_account_token (adapt code to be connect to your cluster)

Anything else we need to know?: I made a test with api list_namespace and list_namespaced_service_account they don't require call to AuthenticationV1TokenRequest and they are working well.

I presume that spec parameter should be set but I don't know what to set without a good example.

Environment:

jhourque commented 4 days ago

I found the solution. We need to add body with audience and expiration_seconds: spec = kube.client.V1TokenRequestSpec(audiences=['https://kubernetes.default.svc'], bound_object_ref=None, expiration_seconds=<expiration in seconds>) body = kube.client.AuthenticationV1TokenRequest(spec=spec) response = api_instance.create_namespaced_service_account_token(name=name, namespace=ns, body=body)

It also would be nice to explain that name is the service account name.