From cdefeb70c5c95c94ea6b7e9380b30e22071a5328 Mon Sep 17 00:00:00 2001 From: Dima Tisnek Date: Wed, 21 May 2025 09:56:36 +0900 Subject: [PATCH 1/3] fix: creating offer when connecting to existing model, fixes #1264 --- juju/client/proxy/kubernetes/proxy.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/juju/client/proxy/kubernetes/proxy.py b/juju/client/proxy/kubernetes/proxy.py index 3d4153b13..b40f5f7f8 100644 --- a/juju/client/proxy/kubernetes/proxy.py +++ b/juju/client/proxy/kubernetes/proxy.py @@ -1,6 +1,7 @@ # Copyright 2023 Canonical Ltd. # Licensed under the Apache V2, see LICENCE file for details. import logging +import os import tempfile from kubernetes import client @@ -29,21 +30,18 @@ def __init__( self.namespace = namespace self.remote_port = remote_port self.service = service + self.temp_ca_file = None + self.port_forwarder = None try: self.remote_port = int(remote_port) except ValueError: raise ValueError(f"Invalid port number: {remote_port}") - self.port_forwarder = None - if ca_cert: - self.temp_ca_file = tempfile.NamedTemporaryFile() # noqa: SIM115 - self.temp_ca_file.write(bytes(ca_cert, "utf-8")) - self.temp_ca_file.flush() - config.ssl_ca_cert = self.temp_ca_file.name - else: - self.temp_ca_file = None + with tempfile.NamedTemporaryFile(delete=True) as f: + f.write(bytes(ca_cert, "utf-8")) + self.temp_ca_file = config.ssl_ca_cert = f.name self.api_client = client.ApiClient(config) @@ -67,13 +65,16 @@ def connect(self): def __del__(self): self.close() + try: + if self.temp_ca_file: + os.unlink(self.temp_ca_file) + except FileNotFoundError: + log.debug(f"file {self.temp_ca_file} not found") def close(self): try: if self.port_forwarder: self.port_forwarder.close() - if self.temp_ca_file: - self.temp_ca_file.close() except AttributeError: pass From a2bbb869549d0b37d6166e5bf40d7589edf5b3b2 Mon Sep 17 00:00:00 2001 From: Dima Tisnek Date: Wed, 21 May 2025 11:06:29 +0900 Subject: [PATCH 2/3] fix: fix the fix, obv! --- juju/client/proxy/kubernetes/proxy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/juju/client/proxy/kubernetes/proxy.py b/juju/client/proxy/kubernetes/proxy.py index b40f5f7f8..001230a57 100644 --- a/juju/client/proxy/kubernetes/proxy.py +++ b/juju/client/proxy/kubernetes/proxy.py @@ -39,7 +39,7 @@ def __init__( raise ValueError(f"Invalid port number: {remote_port}") if ca_cert: - with tempfile.NamedTemporaryFile(delete=True) as f: + with tempfile.NamedTemporaryFile(delete=False) as f: f.write(bytes(ca_cert, "utf-8")) self.temp_ca_file = config.ssl_ca_cert = f.name From 33e6d94d976d23b31b795619c06b9c7771cc0602 Mon Sep 17 00:00:00 2001 From: Dima Tisnek Date: Wed, 21 May 2025 16:49:24 +0900 Subject: [PATCH 3/3] fix: address review comments --- juju/client/proxy/kubernetes/proxy.py | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/juju/client/proxy/kubernetes/proxy.py b/juju/client/proxy/kubernetes/proxy.py index 001230a57..be98c3218 100644 --- a/juju/client/proxy/kubernetes/proxy.py +++ b/juju/client/proxy/kubernetes/proxy.py @@ -30,7 +30,7 @@ def __init__( self.namespace = namespace self.remote_port = remote_port self.service = service - self.temp_ca_file = None + self.temp_ca_path = None self.port_forwarder = None try: @@ -41,7 +41,8 @@ def __init__( if ca_cert: with tempfile.NamedTemporaryFile(delete=False) as f: f.write(bytes(ca_cert, "utf-8")) - self.temp_ca_file = config.ssl_ca_cert = f.name + self.temp_ca_path = f.name + config.ssl_ca_cert = f.name self.api_client = client.ApiClient(config) @@ -65,18 +66,13 @@ def connect(self): def __del__(self): self.close() - try: - if self.temp_ca_file: - os.unlink(self.temp_ca_file) - except FileNotFoundError: - log.debug(f"file {self.temp_ca_file} not found") + if self.temp_ca_path: + os.unlink(self.temp_ca_path) def close(self): - try: - if self.port_forwarder: - self.port_forwarder.close() - except AttributeError: - pass + if self.port_forwarder: + self.port_forwarder.close() + self.port_forwarder = None def socket(self): if self.port_forwarder is not None: