diff --git a/src/ui/openapi.json b/src/ui/openapi.json index 2795d95e0..fb8471e62 100644 --- a/src/ui/openapi.json +++ b/src/ui/openapi.json @@ -8759,7 +8759,8 @@ "BackendSchedulerType": { "type": "string", "enum": [ - "kai" + "kai", + "none" ], "title": "BackendSchedulerType", "description": "Defines the type of scheduler used by the backend " diff --git a/src/ui/src/lib/api/generated.ts b/src/ui/src/lib/api/generated.ts index 70b21d6fe..74416d9fd 100644 --- a/src/ui/src/lib/api/generated.ts +++ b/src/ui/src/lib/api/generated.ts @@ -105,6 +105,7 @@ export type BackendSchedulerType = typeof BackendSchedulerType[keyof typeof Back export const BackendSchedulerType = { kai: 'kai', + none: 'none', } as const; /** diff --git a/src/ui/src/mocks/generated-mocks.ts b/src/ui/src/mocks/generated-mocks.ts index c97cd6a24..cf396a0d5 100644 --- a/src/ui/src/mocks/generated-mocks.ts +++ b/src/ui/src/mocks/generated-mocks.ts @@ -88,6 +88,7 @@ export type BackendSchedulerType = (typeof BackendSchedulerType)[keyof typeof Ba export const BackendSchedulerType = { kai: "kai", + none: "none", } as const; /** diff --git a/src/utils/connectors/postgres.py b/src/utils/connectors/postgres.py index 9700b6009..c22a032a5 100644 --- a/src/utils/connectors/postgres.py +++ b/src/utils/connectors/postgres.py @@ -2478,6 +2478,11 @@ def list_from_db(cls, backends: List[str] | None = None, class BackendSchedulerType(enum.Enum): """ Defines the type of scheduler used by the backend """ KAI = 'kai' + # No gang-scheduler integration — pods are scheduled by `scheduler_name` + # (typically the K8s default scheduler). Skips PodGroup CR creation, which + # removes the kai-scheduler dependency for workflows that don't need + # gang scheduling. See NVIDIA/OSMO#936. + NONE = 'none' class BackendSchedulerSettings(pydantic.BaseModel): diff --git a/src/utils/job/kb_objects.py b/src/utils/job/kb_objects.py index c5bb5d41f..bf6776948 100644 --- a/src/utils/job/kb_objects.py +++ b/src/utils/job/kb_objects.py @@ -608,8 +608,12 @@ def get_k8s_object_factory(backend: connectors.Backend) -> K8sObjectFactory: scheduler_type = scheduler_settings.scheduler_type if scheduler_type == connectors.BackendSchedulerType.KAI: return KaiK8sObjectFactory(backend) - else: - raise osmo_errors.OSMOServerError(f'Unsupported scheduler type: {scheduler_type}') + if scheduler_type == connectors.BackendSchedulerType.NONE: + # Base K8sObjectFactory does exactly what 'none' needs: no PodGroup CR, + # `scheduler_name` written to pod.spec.schedulerName, no scheduler + # CRDs (queues/topologies), no priority/topology features. See #936. + return K8sObjectFactory(scheduler_settings.scheduler_name) + raise osmo_errors.OSMOServerError(f'Unsupported scheduler type: {scheduler_type}') class FileMount(pydantic.BaseModel):