Repository navigation
exec command is parsing output if output looks like json #1032
Description
What happened (please include outputs or screenshots):
Working on creating a scale test where the test orchestrator will exec in each pod and run a curl command to verify the pod is in the expected state. The output of the curl is JSON.
The problem seems to be that the stream client will parse the json as a python dictionary if the output is only json, but return it to the caller as a stringified dictionary. Expecting json, json.loads is failing.
To verify I ran
In [5]: cmd=["echo", '{"example":"json", "with":null, "and":true}']
In [6]: kstream.stream(api_instance.connect_get_namespaced_pod_exec,
...: name=pod,
...: namespace=ns,
...: container=container,
...: command=cmd,
...: stderr=True,
...: stdin=False,
...: tty=False,
...: stdout=True)
Out[6]: "{'example': 'json', 'with': None, 'and': True}"
In [7]: cmd=["echo", 'but not actually json {"example":"json", "with":null, "and":true}']
In [8]: kstream.stream(api_instance.connect_get_namespaced_pod_exec,
...: name=pod,
...: namespace=ns,
...: container=container,
...: command=cmd,
...: stderr=True,
...: stdin=False,
...: tty=False,
...: stdout=True)
Out[8]: 'but not actually json {"example":"json", "with":null, "and":true}\n'
What you expected to happen:
I really did not expect the response to be different depending on the output of the command being run.
How to reproduce it (as minimally and precisely as possible):
Anything else we need to know?:
We are able to get around the issue by adding _preload_content=False to the stream function call and handling waiting for the response and reading stdout/stderr ourselves.
I wasn't sure where the rogue json parsing is happening, maybe in WSResponse class?
Environment:
- Kubernetes version (
kubectl version):
Client Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.6", GitCommit:"7015f71e75f670eb9e7ebd4b5749639d42e20079", GitTreeState:"clean", BuildDate:"2019-11-19T15:41:24Z", GoVersion:"go1.12.13", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"14+", GitVersion:"v1.14.8-eks-b8860f", GitCommit:"b8860f6c40640897e52c143f1b9f011a503d6e46", GitTreeState:"clean", BuildDate:"2019-11-25T00:55:38Z", GoVersion:"go1.12.10", Compiler:"gc", Platform:"linux/amd64"}
- OS (e.g., MacOS 10.13.6):
Ubuntu 19.10 - Python version (
python --version)
python 3.7.5
- Python client version (
pip list | grep kubernetes)
kubernetes==10.0.1
Activity
roycaihw commentedon Dec 17, 2019
cc @jiahuif
roycaihw commentedon Dec 17, 2019
The json parsing is done by
python/kubernetes/client/api_client.py
Line 242 in ccd3ce4
Essentially what it does is
and the result becomes a string representation of the dict
"{'example': 'json', 'with': None, 'and': True}"This looks like a bug in the upstream code generator. The generated client should not try parsing the response when the payload isn't JSON and the response is of
stringtype.@tkinz27 could you file an issue in https://github.com/OpenAPITools/openapi-generator?
fejta-bot commentedon Mar 16, 2020
Issues go stale after 90d of inactivity.
Mark the issue as fresh with
/remove-lifecycle stale.Stale issues rot after an additional 30d of inactivity and eventually close.
If this issue is safe to close now please do so with
/close.Send feedback to sig-testing, kubernetes/test-infra and/or fejta.
/lifecycle stale
mitar commentedon Mar 16, 2020
/remove-lifecycle stale
fejta-bot commentedon Jun 14, 2020
Issues go stale after 90d of inactivity.
Mark the issue as fresh with
/remove-lifecycle stale.Stale issues rot after an additional 30d of inactivity and eventually close.
If this issue is safe to close now please do so with
/close.Send feedback to sig-testing, kubernetes/test-infra and/or fejta.
/lifecycle stale
mitar commentedon Jun 14, 2020
/remove-lifecycle stale
fejta-bot commentedon Sep 13, 2020
Issues go stale after 90d of inactivity.
Mark the issue as fresh with
/remove-lifecycle stale.Stale issues rot after an additional 30d of inactivity and eventually close.
If this issue is safe to close now please do so with
/close.Send feedback to sig-testing, kubernetes/test-infra and/or fejta.
/lifecycle stale
mitar commentedon Sep 13, 2020
/remove-lifecycle stale
15 remaining items
mitar commentedon Oct 18, 2021
/remove-lifecycle rotten
k8s-triage-robot commentedon Jan 16, 2022
The Kubernetes project currently lacks enough contributors to adequately respond to all issues and PRs.
This bot triages issues and PRs according to the following rules:
lifecycle/staleis appliedlifecycle/stalewas applied,lifecycle/rottenis appliedlifecycle/rottenwas applied, the issue is closedYou can:
/remove-lifecycle stale/lifecycle rotten/closePlease send feedback to sig-contributor-experience at kubernetes/community.
/lifecycle stale
mitar commentedon Jan 16, 2022
/remove-lifecycle stale
k8s-triage-robot commentedon Apr 17, 2022
The Kubernetes project currently lacks enough contributors to adequately respond to all issues and PRs.
This bot triages issues and PRs according to the following rules:
lifecycle/staleis appliedlifecycle/stalewas applied,lifecycle/rottenis appliedlifecycle/rottenwas applied, the issue is closedYou can:
/remove-lifecycle stale/lifecycle rotten/closePlease send feedback to sig-contributor-experience at kubernetes/community.
/lifecycle stale
Fix streaming results from k8s API
et304383 commentedon Jul 10, 2024
No fix or work-around 4 and a half years later?
Fix streaming results from k8s API