kubernetes-client / kubernetes-client/python

list_event_for_all_namespaces_with_http_info raises ValueError due to None value for event_time if there are events

Open
#1,616 13 comments 1 reaction 0 assignees View on GitHub
help wanted kind/bug lifecycle/frozen
Dominant language
Python
Stars
7.7k
Forks
3.5k
Avg merge
1d 14h
Merged PRs (30d)
18

Description

**What happened (please include outputs or screenshots)**:
If you try to fetch events when there aren't any, the above mentioned method returns just fine. But if there are events, then an exception is raised in the internal setter for the 'event_time' property as the value being read in from K8s is None:

```python
if self.local_vars_configuration.client_side_validation and event_time is None: # noqa: E501
raise ValueError("Invalid value for `event_time`, must not be `None`") # noqa: E501
```

or, as it happens:

```
File ".../python3.8/site-packages/kubernetes/client/api_client.py", line 303, in __deserialize
return self.__deserialize_model(data, klass)
File ".../lib/python3.8/site-packages/kubernetes/client/api_client.py", line 641, in __deserialize_model
instance = klass(**kwargs)
File ".../lib/python3.8/site-packages/kubernetes/client/models/events_v1_event.py", line 112, in __init__
self.event_time = event_time
File ".../lib/python3.8/site-packages/kubernetes/client/models/events_v1_event.py", line 291, in event_time
raise ValueError("Invalid value for `event_time`, must not be `None`") # noqa: E501
ValueError: Invalid value for `event_time`, must not be `None`
```

It may be the case that turning off client_side_validation will fix this, however there seem to be problems in this regard as well. In issue #1353 there was a mention of a breaking change (in release 1.12?) that involved setting up default config where client_side_validation can supposedly be turned off, but setting default configs don't seem to have any effect. Here's the code inside of the `__init__()` of EventsV1Api (local_vars_configuration is a parameter):

```python
if local_vars_configuration is None:
local_vars_configuration = Configuration()
self.local_vars_configuration = local_vars_configuration
```

So if you don't pass in a value of local_vars_configuration, you get a brand-new Configuration object in which client_side_validation is True. One would have thought that the assignment to local_vars_configuration should have been:

```python
local_vars_configuration = Configuration.get_default_copy()
```

which would have kind of lined up with the notes for release 12.0.1. More curiously, if you have a look into the `__init__()` for Configuration itself, you find this comment before setting client_side_validation:

```python
# Disable client side validation
self.client_side_validation = True
```

So the comment implies that there shouldn't be any client side validation by default, but the code does the opposite.

This is kind of feeling like a regression.

**What you expected to happen**:
I was expecting that default behaviour wouldn't raise an exception for fetching regular event data from K8s (or in my case, k3s). My tests don't cover every resource type that could be fetched, so there may be other similar fields lurking within the library.

**How to reproduce it (as minimally and precisely as possible)**:

```python
from kubernetes.client import EventsV1Api
from kubernetes.client import CoreV1Api
from kubernetes import config

def tryit():
config.load_kube_config(config_file="/etc/rancher/k3s/k3s.yaml") # the config for k3s
# you need to first carry out some action that will result in an Event being reported, so we'll make a simple Pod
p = {'apiVersion': 'v1',
'kind': 'Pod',
'metadata': {'labels': {'app': 'myapp'}, 'name': 'myapp-pod'},
'spec': {'containers': [{'command': ['sh',
'-c',
'echo Hello Kubernetes! && sleep 3600'],
'image': 'busybox',
'name': 'myapp-container'}]}}
api = CoreV1Api()
t0 = api.create_namespaced_pod_with_http_info(namespace='default', body=p)
ev = EventsV1Api()
t1 = ev.list_event_for_all_namespaces_with_http_info(async_req=False) # this craters

if __name__ == "__main__":
tryit()
```

**Anything else we need to know?**:

In my dev environment I use k3s, which may be the source for the empty event_time (versions below). Nonetheless, there's clearly something wrong in how default Configurations are being handled.

As this is impacting objects that are being built inside of the K8s Python client itself, it isn't clear that there's a feasible workaround that could involve the user supplying the config object since it appears the default config isn't used and there's no way to pass in a config into list_event_for_all_namespaces_with_http_info().

**Environment**:
- Kubernetes version (`kubectl version`): Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.8", GitCommit:"9f2892aab98fe339f3bd70e3c470144299398ace", GitTreeState:"clean", BuildDate:"2020-08-13T16:12:48Z", GoVersion:"go1.13.15", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.5+k3s1", GitCommit:"355fff3017b06cde44dbd879408a3a6826fa7125", GitTreeState:"clean", BuildDate:"2021-03-31T06:21:52Z", GoVersion:"go1.15.10", Compiler:"gc", Platform:"linux/amd64"}
- OS (e.g., MacOS 10.13.6): Ubuntu 20.04.3 LTS
- Python version (`python --version`): 3.810
- Python client version (`pip list | grep kubernetes`): 19.15.0

Contributor guide

Open the contributing guide

Research direction

Start with EventsV1Api.list_event_for_all_namespaces_with_http_info(), the Configuration defaults, and events_v1_event.py's event_time setter; trace deserialization through api_client.py. Compare the default configuration path with the reported Kubernetes event payload, then verify that fetching events no longer raises ValueError and that configuration behavior is consistent.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
api
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.