in modules/python/clients/kubernetes_client.py [0:0]
def run_pod_exec_command(self, pod_name: str, container_name: str, command: str, dest_path: str = None, namespace: str = "default") -> str:
"""
Executes a command in a specified container within a Kubernetes pod and optionally saves the output to a file.
Args:
pod_name (str): The name of the pod where the command will be executed.
container_name (str): The name of the container within the pod where the command will be executed.
command (str): The command to be executed in the container.
dest_path (str, optional): The file path where the command output will be saved. Defaults to None.
namespace (str, optional): The Kubernetes namespace where the pod is located. Defaults to "default".
Returns:
str: The combined standard output of the executed command.
Raises:
Exception: If an error occurs while executing the command in the pod.
"""
commands = ['/bin/sh', '-c', command]
resp = stream(self.api.connect_get_namespaced_pod_exec,
name=pod_name,
namespace=namespace,
command=commands,
container=container_name,
stderr=True, stdin=False,
stdout=True, tty=False,
_preload_content=False)
res = []
file = open(dest_path, 'wb') if dest_path else None # pylint: disable=consider-using-with
try:
while resp.is_open():
resp.update(timeout=1)
if resp.peek_stdout():
stdout = resp.read_stdout()
res.append(stdout)
logger.info(f"STDOUT: {stdout}")
if file:
file.write(stdout.encode('utf-8'))
logger.info(f"Saved response to file: {dest_path}")
if resp.peek_stderr():
error_msg = resp.read_stderr()
raise Exception(f"Error occurred while executing command in pod: {error_msg}")
finally:
resp.close()
if file is not None:
file.close()
return ''.join(res)