func()

in controllers/hostingautoscalingpolicy/hostingautoscalingpolicy_controller.go [141:217]


func (r *Reconciler) reconcileHostingAutoscalingPolicy(ctx reconcileRequestContext) error {
	var err error

	// Set first-touch status
	if ctx.HostingAutoscalingPolicy.Status.HostingAutoscalingPolicyStatus == "" {
		if err = r.updateStatus(ctx, ReconcilingAutoscalingJobStatus); err != nil {
			return err
		}
	}

	if err = r.initializeContext(&ctx); err != nil {
		return r.updateStatusAndReturnError(ctx, errors.Wrap(err, "Unable to initialize operator"))
	}

	// Add finalizer if it's not marked for deletion.
	if !controllers.HasDeletionTimestamp(ctx.HostingAutoscalingPolicy.ObjectMeta) {
		if !controllers.ContainsString(ctx.HostingAutoscalingPolicy.ObjectMeta.GetFinalizers(), controllers.SageMakerResourceFinalizerName) {
			ctx.HostingAutoscalingPolicy.ObjectMeta.Finalizers = append(ctx.HostingAutoscalingPolicy.ObjectMeta.Finalizers, controllers.SageMakerResourceFinalizerName)
			if err := r.Update(ctx, ctx.HostingAutoscalingPolicy); err != nil {
				return errors.Wrap(err, "Failed to add finalizer")
			}
			ctx.Log.Info("Finalizer added")
		}
	}

	// Update Descriptions in ctx
	if ctx.ScalableTargetDescriptionList, ctx.ScalingPolicyDescriptionList, err = r.describeAutoscalingPolicy(ctx); err != nil && !clientwrapper.IsDescribeHAP404Error(err) {
		return r.updateStatusAndReturnError(ctx, errors.Wrap(err, "Unable to describe HostingAutoscalingPolicy."))
	}

	var action controllers.ReconcileAction
	if action, err = r.determineActionForAutoscaling(ctx); err != nil {
		return r.updateStatusAndReturnError(ctx, errors.Wrap(err, "Unable to determine action for HostingAutoscalingPolicy."))
	}
	ctx.Log.Info("Determined action for AutoscalingJob", "action", action)

	// If update or delete, delete the existing Policy.
	if action == controllers.NeedsDelete || action == controllers.NeedsUpdate {
		if err = r.deleteAutoscalingPolicy(ctx); err != nil {
			return r.updateStatusAndReturnError(ctx, errors.Wrap(err, "Unable to delete HostingAutoscalingPolicy"))
		}

		// Delete succeeded, set Description, ResourceIDList to nil.
		ctx.ScalingPolicyDescriptionList = nil
		ctx.ScalableTargetDescriptionList = nil
		ctx.HostingAutoscalingPolicy.Status.ResourceIDList = []string{}
	}

	// If update or create, create the desired HAP.
	if action == controllers.NeedsCreate || action == controllers.NeedsUpdate {
		if ctx.ScalableTargetDescriptionList, ctx.ScalingPolicyDescriptionList, err = r.applyAutoscalingPolicy(ctx); err != nil {
			return r.updateStatusAndReturnError(ctx, errors.Wrap(err, "Unable to apply HostingAutoscalingPolicy"))
		}

		// If create succeeded, save the resourceIDs before next spec update.
		r.saveCurrentResourceIDsToStatus(&ctx)
	}

	// Update the status accordingly.
	// Review: Deleted Status may be unnecessary
	status := CreatedAutoscalingJobStatus
	if ctx.ScalingPolicyDescriptionList == nil {
		status = DeletedAutoscalingJobStatus
	}
	if err = r.updateStatus(ctx, status); err != nil {
		return err
	}

	// Remove the Finalizer on delete
	if controllers.HasDeletionTimestamp(ctx.HostingAutoscalingPolicy.ObjectMeta) {
		if err = r.removeFinalizer(ctx); err != nil {
			return err
		}
	}

	return nil
}