Skip to content

Commit b59eacb

Browse files
supporting cert-manager and non cert-manager secret configuration
1 parent ad3f313 commit b59eacb

File tree

2 files changed

+47
-3
lines changed

2 files changed

+47
-3
lines changed

src/codeflare_sdk/common/utils/generate_cert.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,8 @@ def generate_tls_cert(cluster_name, namespace, days=30):
162162
secret_name = get_secret_name(cluster_name, namespace, v1)
163163
secret = v1.read_namespaced_secret(secret_name, namespace).data
164164

165-
ca_cert = secret.get("ca.crt")
166-
ca_key = secret.get("tls.key")
165+
ca_cert = secret.get("ca.crt") or secret.get("tls.crt")
166+
ca_key = secret.get("tls.key") or secret.get("ca.key")
167167

168168
if not ca_cert:
169169
raise ValueError(
@@ -172,7 +172,7 @@ def generate_tls_cert(cluster_name, namespace, days=30):
172172
)
173173
if not ca_key:
174174
raise ValueError(
175-
f"CA private key (tls.key) not found in secret {secret_name}. "
175+
f"CA private key (tls.key or ca.key) not found in secret {secret_name}. "
176176
f"Available keys: {list(secret.keys())}"
177177
)
178178

src/codeflare_sdk/common/utils/test_generate_cert.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,50 @@ def test_generate_tls_cert(mocker):
8787
assert tls_cert.verify_directly_issued_by(root_cert) == None
8888

8989

90+
def secret_ca_retreival_with_ca_key(secret_name, namespace):
91+
"""Mock secret retrieval with ca.key instead of tls.key (KubeRay format)"""
92+
ca_private_key_bytes, ca_cert = generate_ca_cert()
93+
data = {"ca.crt": ca_cert, "ca.key": ca_private_key_bytes}
94+
assert secret_name == "ca-secret-cluster2"
95+
assert namespace == "namespace2"
96+
return client.models.V1Secret(data=data)
97+
98+
99+
def test_generate_tls_cert_with_ca_key_fallback(mocker):
100+
"""
101+
Test that generate_tls_cert works when secret contains ca.key instead of tls.key
102+
This tests the fallback logic for KubeRay-created secrets
103+
"""
104+
mocker.patch("kubernetes.config.load_kube_config", return_value="ignore")
105+
mocker.patch(
106+
"codeflare_sdk.common.utils.generate_cert.get_secret_name",
107+
return_value="ca-secret-cluster2",
108+
)
109+
mocker.patch(
110+
"kubernetes.client.CoreV1Api.read_namespaced_secret",
111+
side_effect=secret_ca_retreival_with_ca_key,
112+
)
113+
114+
generate_tls_cert("cluster2", "namespace2")
115+
assert os.path.exists("tls-cluster2-namespace2")
116+
assert os.path.exists(os.path.join("tls-cluster2-namespace2", "ca.crt"))
117+
assert os.path.exists(os.path.join("tls-cluster2-namespace2", "tls.crt"))
118+
assert os.path.exists(os.path.join("tls-cluster2-namespace2", "tls.key"))
119+
120+
# verify the that the signed tls.crt is issued by the ca_cert (root cert)
121+
with open(os.path.join("tls-cluster2-namespace2", "tls.crt"), "r") as f:
122+
tls_cert = load_pem_x509_certificate(f.read().encode("utf-8"))
123+
with open(os.path.join("tls-cluster2-namespace2", "ca.crt"), "r") as f:
124+
root_cert = load_pem_x509_certificate(f.read().encode("utf-8"))
125+
assert tls_cert.verify_directly_issued_by(root_cert) == None
126+
127+
# Cleanup for this test
128+
os.remove("tls-cluster2-namespace2/ca.crt")
129+
os.remove("tls-cluster2-namespace2/tls.crt")
130+
os.remove("tls-cluster2-namespace2/tls.key")
131+
os.rmdir("tls-cluster2-namespace2")
132+
133+
90134
def test_export_env():
91135
"""
92136
test the function codeflare_sdk.common.utils.generate_ca_cert.export_ev generates the correct outputs

0 commit comments

Comments
 (0)