@@ -39,7 +39,7 @@ def _normalize_runtime_env(
3939
4040def extract_all_local_files (job : RayJob ) -> Optional [Dict [str , str ]]:
4141 """
42- Prepare local files for ConfigMap upload.
42+ Prepare local files for Secret upload.
4343
4444 - If runtime_env has local working_dir: zip entire directory into single file
4545 - If single entrypoint file (no working_dir): extract that file
@@ -76,7 +76,7 @@ def extract_all_local_files(job: RayJob) -> Optional[Dict[str, str]]:
7676 logger .info (f"Zipping local working_dir: { working_dir } " )
7777 zip_data = _zip_directory (working_dir )
7878 if zip_data :
79- # Encode zip as base64 for ConfigMap storage
79+ # Encode zip as base64 for Secret storage
8080 zip_base64 = base64 .b64encode (zip_data ).decode ("utf-8" )
8181 return {"working_dir.zip" : zip_base64 }
8282
@@ -128,7 +128,7 @@ def _extract_single_entrypoint_file(job: RayJob) -> Optional[Dict[str, str]]:
128128 Extract single Python file from entrypoint if no working_dir specified.
129129
130130 Returns a dict with metadata about the file path structure so we can
131- preserve it when mounting via ConfigMap .
131+ preserve it when mounting via Secret .
132132
133133 Args:
134134 job: RayJob instance
@@ -150,8 +150,8 @@ def _extract_single_entrypoint_file(job: RayJob) -> Optional[Dict[str, str]]:
150150 with open (file_path , "r" ) as f :
151151 content = f .read ()
152152
153- # Use basename as key (ConfigMap keys can't have slashes)
154- # But store the full path for later use in ConfigMap item.path
153+ # Use basename as key (Secret keys can't have slashes)
154+ # But store the full path for later use in Secret item.path
155155 filename = os .path .basename (file_path )
156156 relative_path = file_path .lstrip ("./" )
157157
@@ -283,23 +283,23 @@ def parse_requirements_file(requirements_path: str) -> Optional[List[str]]:
283283 return None
284284
285285
286- def create_configmap_from_spec (
287- job : RayJob , configmap_spec : Dict [str , Any ], rayjob_result : Dict [str , Any ] = None
286+ def create_secret_from_spec (
287+ job : RayJob , secret_spec : Dict [str , Any ], rayjob_result : Dict [str , Any ] = None
288288) -> str :
289289 """
290- Create ConfigMap from specification via Kubernetes API.
290+ Create Secret from specification via Kubernetes API.
291291
292292 Args:
293- configmap_spec: ConfigMap specification dictionary
293+ secret_spec: Secret specification dictionary
294294 rayjob_result: The result from RayJob creation containing UID
295295
296296 Returns:
297- str: Name of the created ConfigMap
297+ str: Name of the created Secret
298298 """
299299
300- configmap_name = configmap_spec ["metadata" ]["name" ]
300+ secret_name = secret_spec ["metadata" ]["name" ]
301301
302- metadata = client .V1ObjectMeta (** configmap_spec ["metadata" ])
302+ metadata = client .V1ObjectMeta (** secret_spec ["metadata" ])
303303
304304 # Add owner reference if we have the RayJob result
305305 if (
@@ -308,7 +308,7 @@ def create_configmap_from_spec(
308308 and rayjob_result .get ("metadata" , {}).get ("uid" )
309309 ):
310310 logger .info (
311- f"Adding owner reference to ConfigMap '{ configmap_name } ' with RayJob UID: { rayjob_result ['metadata' ]['uid' ]} "
311+ f"Adding owner reference to Secret '{ secret_name } ' with RayJob UID: { rayjob_result ['metadata' ]['uid' ]} "
312312 )
313313 metadata .owner_references = [
314314 client .V1OwnerReference (
@@ -322,52 +322,55 @@ def create_configmap_from_spec(
322322 ]
323323 else :
324324 logger .warning (
325- f"No valid RayJob result with UID found, ConfigMap '{ configmap_name } ' will not have owner reference. Result: { rayjob_result } "
325+ f"No valid RayJob result with UID found, Secret '{ secret_name } ' will not have owner reference. Result: { rayjob_result } "
326326 )
327327
328- # Convert dict spec to V1ConfigMap
329- configmap = client .V1ConfigMap (
328+ # Convert dict spec to V1Secret
329+ # Use stringData instead of data to avoid double base64 encoding
330+ # Our zip files are already base64-encoded, so stringData will handle the final encoding
331+ secret = client .V1Secret (
330332 metadata = metadata ,
331- data = configmap_spec ["data" ],
333+ type = secret_spec .get ("type" , "Opaque" ),
334+ string_data = secret_spec ["data" ],
332335 )
333336
334- # Create ConfigMap via Kubernetes API
337+ # Create Secret via Kubernetes API
335338 k8s_api = client .CoreV1Api (get_api_client ())
336339 try :
337- k8s_api .create_namespaced_config_map (namespace = job .namespace , body = configmap )
340+ k8s_api .create_namespaced_secret (namespace = job .namespace , body = secret )
338341 logger .info (
339- f"Created ConfigMap '{ configmap_name } ' with { len (configmap_spec ['data' ])} files"
342+ f"Created Secret '{ secret_name } ' with { len (secret_spec ['data' ])} files"
340343 )
341344 except client .ApiException as e :
342345 if e .status == 409 : # Already exists
343- logger .info (f"ConfigMap '{ configmap_name } ' already exists, updating..." )
344- k8s_api .replace_namespaced_config_map (
345- name = configmap_name , namespace = job .namespace , body = configmap
346+ logger .info (f"Secret '{ secret_name } ' already exists, updating..." )
347+ k8s_api .replace_namespaced_secret (
348+ name = secret_name , namespace = job .namespace , body = secret
346349 )
347350 else :
348- raise RuntimeError (f"Failed to create ConfigMap '{ configmap_name } ': { e } " )
351+ raise RuntimeError (f"Failed to create Secret '{ secret_name } ': { e } " )
349352
350- return configmap_name
353+ return secret_name
351354
352355
353- def create_file_configmap (
356+ def create_file_secret (
354357 job : RayJob , files : Dict [str , str ], rayjob_result : Dict [str , Any ]
355358):
356359 """
357- Create ConfigMap with owner reference for local files.
360+ Create Secret with owner reference for local files.
358361 """
359- # Use a basic config builder for ConfigMap creation
362+ # Use a basic config builder for Secret creation
360363 config_builder = ManagedClusterConfig ()
361364
362- # Filter out metadata keys (like __entrypoint_path__) from ConfigMap data
363- configmap_files = {k : v for k , v in files .items () if not k .startswith ("__" )}
365+ # Filter out metadata keys (like __entrypoint_path__) from Secret data
366+ secret_files = {k : v for k , v in files .items () if not k .startswith ("__" )}
364367
365- # Validate and build ConfigMap spec
366- config_builder .validate_configmap_size ( configmap_files )
367- configmap_spec = config_builder .build_file_configmap_spec (
368- job_name = job .name , namespace = job .namespace , files = configmap_files
368+ # Validate and build Secret spec
369+ config_builder .validate_secret_size ( secret_files )
370+ secret_spec = config_builder .build_file_secret_spec (
371+ job_name = job .name , namespace = job .namespace , files = secret_files
369372 )
370373
371- # Create ConfigMap with owner reference
374+ # Create Secret with owner reference
372375 # TODO Error handling
373- create_configmap_from_spec (job , configmap_spec , rayjob_result )
376+ create_secret_from_spec (job , secret_spec , rayjob_result )
0 commit comments