diff --git a/examples/exec.py b/examples/exec.py index 0fe7d5b780..7a5671671d 100644 --- a/examples/exec.py +++ b/examples/exec.py @@ -1,4 +1,6 @@ +import tarfile import time +from tempfile import TemporaryFile from kubernetes import config from kubernetes.client import Configuration @@ -74,6 +76,7 @@ commands = [ "echo test1", "echo \"This message goes to stderr\" >&2", + "ls -l /etc", ] while resp.is_open(): resp.update(timeout=1) @@ -95,3 +98,65 @@ user = resp.readline_stdout(timeout=3) print("Server user is: %s" % user) resp.close() + +# Copying file client -> pod +print('copying client -> pod') +exec_command = ['tar', 'xvf', '-', '-C', '/'] +resp = stream(api.connect_get_namespaced_pod_exec, name, 'default', + command=exec_command, + stderr=True, stdin=True, + stdout=True, tty=False, + binary=True, + _preload_content=False) + +source_file = '/bin/sh' + +with TemporaryFile() as tar_buffer: + with tarfile.open(fileobj=tar_buffer, mode='w') as tar: + tar.add(source_file) + + tar_buffer.seek(0) + commands = [] + commands.append(tar_buffer.read()) + + while resp.is_open(): + resp.update(timeout=1) + if resp.peek_stdout(): + print("STDOUT: %s" % resp.read_stdout()) + if resp.peek_stderr(): + print("STDERR: %s" % resp.read_stderr()) + if commands: + c = commands.pop(0) + resp.write_stdin(c) + else: + break + resp.close() + +# Copying file pod -> client +print('copying pod -> client') +exec_command = ['tar', 'cf', '-', '/bin/sh'] + +with TemporaryFile() as tar_buffer: + + resp = stream(api.connect_get_namespaced_pod_exec, name, 'default', + command=exec_command, + stderr=True, stdin=True, + stdout=True, tty=False, + binary=True, + _preload_content=False) + + while resp.is_open(): + resp.update(timeout=1) + if resp.peek_stdout(): + out = resp.read_stdout() + print("bytes received: %s" % len(out)) + tar_buffer.write(out) + if resp.peek_stderr(): + print("STDERR: %s" % resp.read_stderr()) + resp.close() + + tar_buffer.flush() + tar_buffer.seek(0) + + with tarfile.open(fileobj=tar_buffer, mode='r:') as tar: + print('members', tar.getmembers()) diff --git a/kubernetes/base b/kubernetes/base index 11da619c9e..afe9336a7d 160000 --- a/kubernetes/base +++ b/kubernetes/base @@ -1 +1 @@ -Subproject commit 11da619c9ef7b2e26fe162e5feeb72d5bedcc5c9 +Subproject commit afe9336a7dba4f48f08eddf6e6506122d4ae8f4a diff --git a/kubernetes/client/apis/core_v1_api.py b/kubernetes/client/apis/core_v1_api.py index cae4f63134..10f160268b 100644 --- a/kubernetes/client/apis/core_v1_api.py +++ b/kubernetes/client/apis/core_v1_api.py @@ -21,6 +21,7 @@ from six import iteritems from ..api_client import ApiClient +import six class CoreV1Api(object): @@ -926,7 +927,7 @@ def connect_get_namespaced_pod_exec_with_http_info(self, name, namespace, **kwar body=body_params, post_params=form_params, files=local_var_files, - response_type='str', + response_type=six.binary_type, auth_settings=auth_settings, async=params.get('async'), _return_http_data_only=params.get('_return_http_data_only'), diff --git a/tox.ini b/tox.ini index 307b6e87f0..15d3240875 100644 --- a/tox.ini +++ b/tox.ini @@ -23,16 +23,19 @@ commands = commands = python -V {toxinidir}/scripts/kube-init.sh py.test -vvv -s [] + {toxinidir}/scripts/kube-init.sh python examples/exec.py [testenv:py35-functional] commands = python -V {toxinidir}/scripts/kube-init.sh py.test -vvv -s [] + {toxinidir}/scripts/kube-init.sh python examples/exec.py [testenv:py36-functional] commands = python -V {toxinidir}/scripts/kube-init.sh py.test -vvv -s [] + {toxinidir}/scripts/kube-init.sh python examples/exec.py [testenv:coverage] commands =