Skip to content

Commit fba4113

Browse files
authored
Stop and resume an explainer (kserve#4546)
Signed-off-by: Hannah DeFazio <h2defazio@gmail.com>
1 parent a070e2c commit fba4113

File tree

4 files changed

+897
-60
lines changed

4 files changed

+897
-60
lines changed

pkg/controller/v1beta1/inferenceservice/components/explainer.go

Lines changed: 67 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)