@@ -26,6 +26,7 @@ import (
2626 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2727 "k8s.io/apimachinery/pkg/runtime"
2828 "k8s.io/client-go/kubernetes"
29+ "knative.dev/pkg/apis"
2930 ctrl "sigs.k8s.io/controller-runtime"
3031 "sigs.k8s.io/controller-runtime/pkg/client"
3132 "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
@@ -109,6 +110,7 @@ func (e *Explainer) Reconcile(ctx context.Context, isvc *v1beta1.InferenceServic
109110 explainerAnnotations ,
110111 ),
111112 }
113+
112114 container := explainer .GetContainer (isvc .ObjectMeta , isvc .Spec .Explainer .GetExtensions (), e .inferenceServiceConfig , predictorName )
113115 if len (isvc .Spec .Explainer .PodSpec .Containers ) == 0 {
114116 isvc .Spec .Explainer .PodSpec .Containers = []corev1.Container {
@@ -122,45 +124,78 @@ func (e *Explainer) Reconcile(ctx context.Context, isvc *v1beta1.InferenceServic
122124
123125 // Here we allow switch between knative and vanilla deployment
124126 if e .deploymentMode == constants .RawDeployment {
125- r , err := raw .NewRawKubeReconciler (ctx , e .client , e .clientset , e .scheme , objectMeta , metav1.ObjectMeta {},
126- & isvc .Spec .Explainer .ComponentExtensionSpec , & podSpec , nil )
127- if err != nil {
128- return ctrl.Result {}, errors .Wrapf (err , "fails to create NewRawKubeReconciler for explainer" )
129- }
130- // set Deployment Controller
131- for _ , deployment := range r .Deployment .DeploymentList {
132- if err := controllerutil .SetControllerReference (isvc , deployment , e .scheme ); err != nil {
133- return ctrl.Result {}, errors .Wrapf (err , "fails to set deployment owner reference for explainer" )
134- }
135- }
136- // set Service Controller
137- for _ , svc := range r .Service .ServiceList {
138- if err := controllerutil .SetControllerReference (isvc , svc , e .scheme ); err != nil {
139- return ctrl.Result {}, errors .Wrapf (err , "fails to set service owner reference for explainer" )
140- }
127+ if err := e .reconcileExplainerRawDeployment (ctx , isvc , & objectMeta , & podSpec ); err != nil {
128+ return ctrl.Result {}, err
141129 }
142- // set autoscaler Controller
143- if err := r . Scaler . Autoscaler . SetControllerReferences ( isvc , e . scheme ); err != nil {
144- return ctrl.Result {}, errors . Wrapf ( err , "fails to set autoscaler owner references for explainer" )
130+ } else {
131+ if err := e . reconcileExplainerKnativeDeployment ( ctx , isvc , & objectMeta , & podSpec ); err != nil {
132+ return ctrl.Result {}, err
145133 }
134+ }
146135
147- deployment , err := r .Reconcile (ctx )
148- if err != nil {
149- return ctrl.Result {}, errors .Wrapf (err , "fails to reconcile explainer" )
136+ if utils .GetForceStopRuntime (isvc ) {
137+ // Exit early if we have already set the explainer's status to stopped
138+ existingExplainerCondition := isvc .Status .GetCondition (v1beta1 .ExplainerReady )
139+ if existingExplainerCondition != nil && existingExplainerCondition .Status == corev1 .ConditionFalse && existingExplainerCondition .Reason == v1beta1 .StoppedISVCReason {
140+ return ctrl.Result {}, nil
150141 }
151- isvc .Status .PropagateRawStatus (v1beta1 .ExplainerComponent , deployment , r .URL )
152- } else {
153- r := knative .NewKsvcReconciler (e .client , e .scheme , objectMeta , & isvc .Spec .Explainer .ComponentExtensionSpec ,
154- & podSpec , isvc .Status .Components [v1beta1 .ExplainerComponent ], e .inferenceServiceConfig .ServiceLabelDisallowedList )
155142
156- if err := controllerutil .SetControllerReference (isvc , r .Service , e .scheme ); err != nil {
157- return ctrl.Result {}, errors .Wrapf (err , "fails to set owner reference for explainer" )
143+ // Set the ready condition to false
144+ isvc .Status .SetCondition (v1beta1 .ExplainerReady , & apis.Condition {
145+ Type : v1beta1 .ExplainerReady ,
146+ Status : corev1 .ConditionFalse ,
147+ Reason : v1beta1 .StoppedISVCReason ,
148+ })
149+ }
150+ return ctrl.Result {}, nil
151+ }
152+
153+ func (e * Explainer ) reconcileExplainerRawDeployment (ctx context.Context , isvc * v1beta1.InferenceService , objectMeta * metav1.ObjectMeta , podSpec * corev1.PodSpec ) error {
154+ r , err := raw .NewRawKubeReconciler (ctx , e .client , e .clientset , e .scheme , * objectMeta , metav1.ObjectMeta {},
155+ & isvc .Spec .Explainer .ComponentExtensionSpec , podSpec , nil )
156+ if err != nil {
157+ return errors .Wrapf (err , "fails to create NewRawKubeReconciler for explainer" )
158+ }
159+ // set Deployment Controller
160+ for _ , deployment := range r .Deployment .DeploymentList {
161+ if err := controllerutil .SetControllerReference (isvc , deployment , e .scheme ); err != nil {
162+ return errors .Wrapf (err , "fails to set deployment owner reference for explainer" )
158163 }
159- status , err := r .Reconcile (ctx )
160- if err != nil {
161- return ctrl.Result {}, errors .Wrapf (err , "fails to reconcile explainer" )
164+ }
165+ // set Service Controller
166+ for _ , svc := range r .Service .ServiceList {
167+ if err := controllerutil .SetControllerReference (isvc , svc , e .scheme ); err != nil {
168+ return errors .Wrapf (err , "fails to set service owner reference for explainer" )
162169 }
170+ }
171+ // set autoscaler Controller
172+ if err := r .Scaler .Autoscaler .SetControllerReferences (isvc , e .scheme ); err != nil {
173+ return errors .Wrapf (err , "fails to set autoscaler owner references for explainer" )
174+ }
175+
176+ deployment , err := r .Reconcile (ctx )
177+ if err != nil {
178+ return errors .Wrapf (err , "fails to reconcile explainer" )
179+ }
180+ if ! utils .GetForceStopRuntime (isvc ) {
181+ isvc .Status .PropagateRawStatus (v1beta1 .ExplainerComponent , deployment , r .URL )
182+ }
183+ return nil
184+ }
185+
186+ func (e * Explainer ) reconcileExplainerKnativeDeployment (ctx context.Context , isvc * v1beta1.InferenceService , objectMeta * metav1.ObjectMeta , podSpec * corev1.PodSpec ) error {
187+ r := knative .NewKsvcReconciler (e .client , e .scheme , * objectMeta , & isvc .Spec .Explainer .ComponentExtensionSpec ,
188+ podSpec , isvc .Status .Components [v1beta1 .ExplainerComponent ], e .inferenceServiceConfig .ServiceLabelDisallowedList )
189+
190+ if err := controllerutil .SetControllerReference (isvc , r .Service , e .scheme ); err != nil {
191+ return errors .Wrapf (err , "fails to set owner reference for explainer" )
192+ }
193+ status , err := r .Reconcile (ctx )
194+ if err != nil {
195+ return errors .Wrapf (err , "fails to reconcile explainer" )
196+ }
197+ if ! utils .GetForceStopRuntime (isvc ) {
163198 isvc .Status .PropagateStatus (v1beta1 .ExplainerComponent , status )
164199 }
165- return ctrl. Result {}, nil
200+ return nil
166201}
0 commit comments