feet: add finalizer

This commit is contained in:
2025-01-11 00:25:57 +03:30
parent 14aba80181
commit ef7b16af68
10 changed files with 101 additions and 29 deletions

View File

@@ -1,14 +1,60 @@
package crd
import (
"context"
"flink-kube-operator/internal/crd/v1alpha1"
"flink-kube-operator/pkg"
"github.com/reactivex/rxgo/v2"
"go.uber.org/zap"
"k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
)
var FinalizerChannel chan (types.UID) = make(chan (types.UID))
func (crd Crd) manageFinalizer(jobEventObservable rxgo.Observable) {
finalizerName := "flink-operator.logicamp.tech/finalizer"
for j := range jobEventObservable.Observe() {
jobEvent := j.V.(*FlinkJobCrdEvent)
//pkg.Logger.Debug("[crd] [manage-finalizer] adding finalizer for", zap.String("name", jobEvent.Job.GetName()))
controllerutil.AddFinalizer(jobEvent.Job, "")
if jobEvent.Job.GetDeletionTimestamp() != nil {
// Resource is being deleted
if controllerutil.ContainsFinalizer(jobEvent.Job, finalizerName) {
// Perform cleanup
pkg.Logger.Debug("[finalizer] stopping managed job", zap.String("name", jobEvent.Job.GetName()))
if err := crd.cleanupResources(jobEvent.Job); err != nil {
pkg.Logger.Error("[crd] [manage-finalizer] cleanup failed", zap.Error(err))
return
}
// Remove finalizer
controllerutil.RemoveFinalizer(jobEvent.Job, finalizerName)
if err := crd.runtimeClient.Update(context.Background(), jobEvent.Job); err != nil {
pkg.Logger.Error("[crd] [manage-finalizer] failed to remove finalizer", zap.Error(err))
return
}
pkg.Logger.Debug("[crd] [manage-finalizer] job removed", zap.String("name", jobEvent.Job.GetName()))
}
return
}
// Add finalizer if not present
if !controllerutil.ContainsFinalizer(jobEvent.Job, finalizerName) {
controllerutil.AddFinalizer(jobEvent.Job, finalizerName)
pkg.Logger.Debug("[finalizer] adding job")
// Update the resource to add the finalizer
if err := crd.runtimeClient.Update(context.Background(), jobEvent.Job); err != nil {
pkg.Logger.Error("[finalizer] failed to add", zap.Error(err))
return
}
}
}
}
func (crd Crd) cleanupResources(job *v1alpha1.FlinkJob) error {
FinalizerChannel <- job.GetUID()
return nil
}

View File

@@ -3,36 +3,48 @@ package crd
import (
"flink-kube-operator/internal/crd/v1alpha1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/client/config"
)
type Crd struct {
client dynamic.NamespaceableResourceInterface
client dynamic.NamespaceableResourceInterface
runtimeClient client.Client
}
func New() *Crd {
// Get Kubernetes config
config, err := clientcmd.BuildConfigFromFlags("", clientcmd.RecommendedHomeFile)
// Get Kubernetes config_
config_, err := clientcmd.BuildConfigFromFlags("", clientcmd.RecommendedHomeFile)
if err != nil {
config, err = rest.InClusterConfig()
config_, err = rest.InClusterConfig()
if err != nil {
panic(err)
}
}
// Create dynamic client
dynamicClient, err := dynamic.NewForConfig(config)
dynamicClient, err := dynamic.NewForConfig(config_)
if err != nil {
panic(err)
}
shema := runtime.NewScheme()
v1alpha1.AddKnownTypes(shema)
// Get FlinkJob resource interface
flinkJobClient := dynamicClient.Resource(v1alpha1.FlinkJobGVR)
runtimeClient, err := client.New(config.GetConfigOrDie(), client.Options{
Scheme: shema,
})
if err != nil {
panic(err)
}
crd := Crd{
client: flinkJobClient,
client: flinkJobClient,
runtimeClient: runtimeClient,
}
// Watch for FlinkJob creation

View File

@@ -14,7 +14,7 @@ import (
func (crd *Crd) Patch(jobUid types.UID, patchData map[string]interface{}) error {
job := GetJob(jobUid)
pkg.Logger.Debug("[patch-job]", zap.Any("jobUid", jobUid))
// pkg.Logger.Debug("[patch-job]", zap.Any("jobUid", jobUid))
patchBytes, err := json.Marshal(patchData)
if err != nil {

View File

@@ -14,6 +14,10 @@ func (crd *Crd) repsert(job *v1alpha1.FlinkJob) {
jobs.Store(job.GetUID(), job)
}
func (crd *Crd) remove(uid types.UID) {
jobs.Delete(uid)
}
func GetJob(uid types.UID) v1alpha1.FlinkJob {
job, _ := jobs.Load(uid)
return *job.DeepCopy()

View File

@@ -20,11 +20,11 @@ var FlinkJobGVR = schema.GroupVersionResource{
}
var (
SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)
SchemeBuilder = runtime.NewSchemeBuilder(AddKnownTypes)
AddToScheme = SchemeBuilder.AddToScheme
)
func addKnownTypes(scheme *runtime.Scheme) error {
func AddKnownTypes(scheme *runtime.Scheme) error {
scheme.AddKnownTypes(SchemeGroupVersion,
&FlinkJob{},
&FlinkJobList{},

View File

@@ -56,6 +56,8 @@ func (crd Crd) watchFlinkJobs() rxgo.Observable {
//pkg.Logger.Info("[crd] [watch] new flink job created")
crd.repsert(job)
case watch.Deleted:
crd.remove(job.UID)
}
}