@@ -339,6 +339,16 @@ def list_namespaced_custom_object_response(*args, **kwargs):
339339 models .TrainerV1alpha1TrainJobList (items = items ),
340340 models .TrainerV1alpha1TrainJobList ,
341341 )
342+ elif args [3 ] == constants .TRAINING_RUNTIME_PLURAL :
343+ # TODO: add test case for namespace scoped runtimes
344+ # items = [
345+ # create_training_runtime(name="runtime-1"),
346+ # create_training_runtime(name="runtime-2"),
347+ # ]
348+ mock_thread .get .return_value = normalize_model (
349+ models .TrainerV1alpha1TrainingRuntimeList (items = []),
350+ models .TrainerV1alpha1TrainingRuntimeList ,
351+ )
342352
343353 return mock_thread
344354
@@ -472,6 +482,37 @@ def create_cluster_training_runtime(
472482 )
473483
474484
485+ def create_training_runtime (
486+ name : str ,
487+ namespace : str = "default" ,
488+ ) -> models .TrainerV1alpha1TrainingRuntime :
489+ """Create a mock namespaced TrainingRuntime object (not cluster-scoped)."""
490+ return models .TrainerV1alpha1TrainingRuntime (
491+ apiVersion = constants .API_VERSION ,
492+ kind = "TrainingRuntime" ,
493+ metadata = models .IoK8sApimachineryPkgApisMetaV1ObjectMeta (
494+ name = name ,
495+ namespace = namespace ,
496+ labels = {constants .RUNTIME_FRAMEWORK_LABEL : name },
497+ ),
498+ spec = models .TrainerV1alpha1TrainingRuntimeSpec (
499+ mlPolicy = models .TrainerV1alpha1MLPolicy (
500+ torch = models .TrainerV1alpha1TorchMLPolicySource (
501+ numProcPerNode = models .IoK8sApimachineryPkgUtilIntstrIntOrString (2 )
502+ ),
503+ numNodes = 2 ,
504+ ),
505+ template = models .TrainerV1alpha1JobSetTemplateSpec (
506+ metadata = models .IoK8sApimachineryPkgApisMetaV1ObjectMeta (
507+ name = name ,
508+ namespace = namespace ,
509+ ),
510+ spec = models .JobsetV1alpha2JobSetSpec (replicatedJobs = [get_replicated_job ()]),
511+ ),
512+ ),
513+ )
514+
515+
475516def get_replicated_job () -> models .JobsetV1alpha2ReplicatedJob :
476517 return models .JobsetV1alpha2ReplicatedJob (
477518 name = "node" ,
0 commit comments