package controller import ( zitadelv1alpha1 "gitea.corredorconect.com/software-engineering/zitadel-k8s-operator/api/v1alpha1" "gitea.corredorconect.com/software-engineering/zitadel-k8s-operator/pkg/controller/system" "context" "fmt" systemClient "github.com/zitadel/zitadel-go/v3/pkg/client/system" pb "github.com/zitadel/zitadel-go/v3/pkg/client/zitadel/system" "sigs.k8s.io/controller-runtime/pkg/client" ctrlClient "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" ) const ( instanceFinalizerName = "instance.zitadel.github.com/instance" ) type wrappedInstanceFinalizer struct { client.Client instance *zitadelv1alpha1.Instance } func newWrappedInstanceFinalizer(client client.Client, instance *zitadelv1alpha1.Instance) system.WrappedSystemFinalizer { return &wrappedInstanceFinalizer{ Client: client, instance: instance, } } func (wf *wrappedInstanceFinalizer) AddFinalizer(ctx context.Context) error { if wf.ContainsFinalizer() { return nil } return wf.patch(ctx, wf.instance, func(instance *zitadelv1alpha1.Instance) { controllerutil.AddFinalizer(instance, instanceFinalizerName) }) } func (wf *wrappedInstanceFinalizer) RemoveFinalizer(ctx context.Context) error { if !wf.ContainsFinalizer() { return nil } return wf.patch(ctx, wf.instance, func(instance *zitadelv1alpha1.Instance) { controllerutil.RemoveFinalizer(wf.instance, instanceFinalizerName) }) } func (wr *wrappedInstanceFinalizer) ContainsFinalizer() bool { return controllerutil.ContainsFinalizer(wr.instance, instanceFinalizerName) } func (wf *wrappedInstanceFinalizer) Reconcile(ctx context.Context, ztdClient *systemClient.Client) error { if wf.instance.Status.InstanceId != nil { _, err := ztdClient.RemoveInstance(ctx, &pb.RemoveInstanceRequest{InstanceId: *wf.instance.Status.InstanceId}) if err != nil { return fmt.Errorf("error removing Instance: %v", err) } } return nil } func (wr *wrappedInstanceFinalizer) patch(ctx context.Context, instance *zitadelv1alpha1.Instance, patchFn func(*zitadelv1alpha1.Instance)) error { patch := ctrlClient.MergeFrom(instance.DeepCopy()) patchFn(instance) if err := wr.Client.Patch(ctx, instance, patch); err != nil { return fmt.Errorf("error patching Instance finalizer: %v", err) } return nil }