func (u *ImageChangeReconciler) startImageChange(ctx context.Context) (ctrl.Result, error) {
	u.Log.Info("Starting image change for reconciliation iteration", "ContinuingImageChange", u.ContinuingImageChange)
	if err := u.toggleImageChangeInProgress(ctx, corev1.ConditionTrue); err != nil {
		return ctrl.Result{}, err
	}
	if !u.ContinuingImageChange {
		u.VRec.EVRec.Eventf(u.Vdb, corev1.EventTypeNormal, events.ImageChangeStart,
			"Vertica server image change has started.  New image is '%s'", u.Vdb.Spec.Image)
	}
	return ctrl.Result{}, nil
}
startImageChange handles condition status and event recording for start of an image change
package controllers
import (
	"context"
	"fmt"
	"time"
	"github.com/go-logr/logr"
	vapi "github.com/vertica/vertica-kubernetes/api/v1beta1"
	"github.com/vertica/vertica-kubernetes/pkg/cmds"
	"github.com/vertica/vertica-kubernetes/pkg/events"
	"github.com/vertica/vertica-kubernetes/pkg/names"
	"github.com/vertica/vertica-kubernetes/pkg/status"
	corev1 "k8s.io/api/core/v1"
	"k8s.io/apimachinery/pkg/api/errors"
	ctrl "sigs.k8s.io/controller-runtime"
)
type ImageChangeReconciler struct {
	VRec                  *VerticaDBReconciler
	Log                   logr.Logger
	Vdb                   *vapi.VerticaDB  
	PRunner               cmds.PodRunner
	PFacts                *PodFacts
	ContinuingImageChange bool  
	Finder                SubclusterFinder
}
func MakeImageChangeReconciler(vdbrecon *VerticaDBReconciler, log logr.Logger,
	vdb *vapi.VerticaDB, prunner cmds.PodRunner, pfacts *PodFacts) ReconcileActor {
	return &ImageChangeReconciler{VRec: vdbrecon, Log: log, Vdb: vdb, PRunner: prunner, PFacts: pfacts,
		Finder: MakeSubclusterFinder(vdbrecon.Client, vdb),
	}
}
func (u *ImageChangeReconciler) Reconcile(ctx context.Context, req *ctrl.Request) (ctrl.Result, error) {
	if u.Vdb.Spec.InitPolicy == vapi.CommunalInitPolicyScheduleOnly {
		return ctrl.Result{}, nil
	}
	if err := u.PFacts.Collect(ctx, u.Vdb); err != nil {
		return ctrl.Result{}, err
	}
	if ok, err := u.isImageChangeNeeded(ctx); !ok || err != nil {
		return ctrl.Result{}, err
	}
	funcs := []func(context.Context) (ctrl.Result, error){
		u.startImageChange,
		u.stopCluster,
		u.updateImageInStatefulSets,
		u.deletePods,
		u.checkForNewPods,
		u.restartCluster,
		u.finishImageChange,
	}
	for _, fn := range funcs {
		if res, err := fn(ctx); res.Requeue || err != nil {
			return res, err
		}
	}
	return ctrl.Result{}, nil
}