in controllers/model/model_controller.go [125:200]
func (r *ModelReconciler) reconcileModel(ctx reconcileRequestContext) error {
var err error
// Update initial status.
if ctx.Model.Status.Status == "" {
if err = r.updateStatus(ctx, InitializingJobStatus); err != nil {
return err
}
}
if err = r.initializeContext(&ctx); err != nil {
return r.updateStatusAndReturnError(ctx, ErrorStatus, errors.Wrap(err, "Unable to initialize operator"))
}
// Add finalizer if the Model is not marked for deletion.
if !HasDeletionTimestamp(ctx.Model.ObjectMeta) {
if !ContainsString(ctx.Model.ObjectMeta.GetFinalizers(), SageMakerResourceFinalizerName) {
ctx.Model.ObjectMeta.Finalizers = append(ctx.Model.ObjectMeta.Finalizers, SageMakerResourceFinalizerName)
if err := r.Update(ctx, ctx.Model); err != nil {
return errors.Wrap(err, "Failed to add finalizer")
}
ctx.Log.Info("Finalizer has been added")
}
}
// Get SageMaker model description.
if ctx.ModelDescription, err = ctx.SageMakerClient.DescribeModel(ctx, generateModelName(ctx.Model)); err != nil {
return r.updateStatusAndReturnError(ctx, ErrorStatus, errors.Wrap(err, "Unable to get SageMaker Model description"))
}
// Determine action needed for model and model description.
var action ReconcileAction
if action, err = r.determineActionForModel(ctx.Model, ctx.ModelDescription); err != nil {
return r.updateStatusAndReturnError(ctx, ErrorStatus, errors.Wrap(err, "Unable to determine action for SageMaker Model."))
}
ctx.Log.Info("Determined action for model", "action", action)
// If update or delete, delete the existing model.
if action == NeedsDelete || action == NeedsUpdate {
if err = r.reconcileDeletion(ctx, ctx.SageMakerClient, generateModelName(ctx.Model)); err != nil {
return r.updateStatusAndReturnError(ctx, ErrorStatus, errors.Wrap(err, "Unable to delete SageMaker model"))
}
// Delete succeeded, set ModelDescription to nil.
ctx.ModelDescription = nil
}
// If update or create, create the desired model.
if action == NeedsCreate || action == NeedsUpdate {
if ctx.ModelDescription, err = r.reconcileCreation(ctx, ctx.SageMakerClient, ctx.Model.Spec, generateModelName(ctx.Model)); err != nil {
return r.updateStatusAndReturnError(ctx, ErrorStatus, errors.Wrap(err, "Unable to create SageMaker model"))
}
}
// Update the status accordingly.
status := CreatedStatus
if ctx.ModelDescription == nil {
status = DeletedStatus
}
if err = r.updateStatus(ctx, status); err != nil {
return err
}
// Remove finalizer on deletion.
if HasDeletionTimestamp(ctx.Model.ObjectMeta) {
ctx.Model.ObjectMeta.Finalizers = RemoveString(ctx.Model.ObjectMeta.Finalizers, SageMakerResourceFinalizerName)
if err := r.Update(ctx, ctx.Model); err != nil {
return errors.Wrap(err, "Failed to remove finalizer")
}
ctx.Log.Info("Finalizer has been removed")
}
return nil
}