diff --git a/internal/controller/inferenceservice_reconcile_test.go b/internal/controller/inferenceservice_reconcile_test.go index 3e52425..5659fc4 100644 --- a/internal/controller/inferenceservice_reconcile_test.go +++ b/internal/controller/inferenceservice_reconcile_test.go @@ -296,6 +296,24 @@ var _ = Describe("determinePhase", func() { phase, _ := reconciler.determinePhase(context.Background(), isvc, 0, 1, true, nil) Expect(phase).To(Equal("Creating")) }) + + It("should return Stopped when replicas=0 on generic path", func() { + isvc := &inferencev1alpha1.InferenceService{ + ObjectMeta: metav1.ObjectMeta{Name: "test", Namespace: "default"}, + } + phase, info := reconciler.determinePhase(context.Background(), isvc, 0, 0, false, &appsv1.Deployment{}) + Expect(phase).To(Equal(PhaseStopped)) + Expect(info).To(BeNil()) + }) + + It("should return Stopped when replicas=0 on Metal path", func() { + isvc := &inferencev1alpha1.InferenceService{ + ObjectMeta: metav1.ObjectMeta{Name: "test", Namespace: "default"}, + } + phase, info := reconciler.determinePhase(context.Background(), isvc, 0, 0, true, nil) + Expect(phase).To(Equal(PhaseStopped)) + Expect(info).To(BeNil()) + }) }) var _ = Describe("findInferenceServiceForPod", func() { diff --git a/internal/controller/model_controller.go b/internal/controller/model_controller.go index 189731a..8ca30db 100644 --- a/internal/controller/model_controller.go +++ b/internal/controller/model_controller.go @@ -49,6 +49,7 @@ const ( PhaseFailed = "Failed" PhaseCached = "Cached" PhaseCreating = "Creating" + PhaseStopped = "Stopped" // acceleratorMetal is the Model.Spec.Hardware.Accelerator value for the // host metal-agent path. acceleratorMetal = "metal" diff --git a/internal/controller/scheduling.go b/internal/controller/scheduling.go index 4e2ebf5..61690eb 100644 --- a/internal/controller/scheduling.go +++ b/internal/controller/scheduling.go @@ -72,6 +72,9 @@ func (r *InferenceServiceReconciler) determinePhase(ctx context.Context, isvc *i if readyReplicas > 0 { return "Progressing", nil } + if desiredReplicas == 0 && readyReplicas == 0 { + return PhaseStopped, nil + } if !isMetal && deployment != nil { schedulingInfo, err := r.getPodSchedulingInfo(ctx, isvc) if err != nil {