From 5baad567ab5144d850d67b3b46ae7fb67971063a Mon Sep 17 00:00:00 2001 From: Tobias Trabelsi Date: Tue, 20 Jan 2026 22:39:59 +0100 Subject: [PATCH] feat(): also handle deletes --- .gitea/workflows/main.yaml | 4 ++-- internal/informer.go | 38 +++++++++++++++++++++++++++++++++++++- internal/kube.go | 9 +++------ 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/.gitea/workflows/main.yaml b/.gitea/workflows/main.yaml index 4126fed..4d98b13 100644 --- a/.gitea/workflows/main.yaml +++ b/.gitea/workflows/main.yaml @@ -24,9 +24,9 @@ jobs: with: go-version: '1.25.x' - name: golangci-lint - uses: golangci/golangci-lint-action@v8 + uses: golangci/golangci-lint-action@v9 with: - version: v2.1 + version: latest - name: Test with the Go CLI run: go test ./... -v - name: Run Gosec Security Scanner diff --git a/internal/informer.go b/internal/informer.go index e4beb9f..980ccd6 100644 --- a/internal/informer.go +++ b/internal/informer.go @@ -61,7 +61,7 @@ func StartLeaseInformer(cfg *Config, stopCh <-chan struct{}) error { handleLease(newObj, cfg) }, DeleteFunc: func(obj interface{}) { - // nothing to do on delete for now + handleLeaseDelete(obj, cfg) }, }) @@ -123,3 +123,39 @@ func handleLease(obj interface{}, cfg *Config) { log.WithFields(log.Fields{"Caller": "handleLease", "Node": node, "Lease": lease.Name}).Errorf("Error labeling node: %s", err.Error()) } } + +func handleLeaseDelete(obj interface{}, cfg *Config) { + lease, ok := obj.(*v1.Lease) + if !ok { + log.WithFields(log.Fields{"Caller": "handleLeaseDelete"}).Warn("Could not cast object to Lease") + return + } + + if lease == nil { + return + } + + if lease.Name == "" || len(lease.Name) < 1 { + return + } + + if !strings.HasPrefix(lease.Name, "cilium-l2announce") { + return + } + + node, err := GetNodeNameFromLease(*lease) + if err != nil { + log.WithFields(log.Fields{"Caller": "handleLeaseDelete", "Lease": lease.Name}).Errorf("Error parsing lease: %s", err.Error()) + return + } + + if cfg.DryRun { + log.WithFields(log.Fields{"Caller": "handleLeaseDelete"}).Infof("Dry run: would remove labels %s and %s from node %s (lease %s)", node, cfg.CiliumLabel, "cilium.uploadfilter24.eu/lease", lease.Name) + return + } + + err = RemoveLabelFromNode(node, lease.Name, cfg) + if err != nil { + log.WithFields(log.Fields{"Caller": "handleLeaseDelete", "Node": node, "Lease": lease.Name}).Errorf("Error labeling node: %s", err.Error()) + } +} diff --git a/internal/kube.go b/internal/kube.go index f55ea0a..96f18c1 100644 --- a/internal/kube.go +++ b/internal/kube.go @@ -65,7 +65,7 @@ func ApplyLabelToNode(client kubernetes.Interface, nodeName string, leaseName st return nil } -func RemoveLabelFromNode(nodeName string) error { +func RemoveLabelFromNode(nodeName string, leaseName string, cfg *Config) error { client, err := generateClient() if err != nil { return fmt.Errorf("Could not generate client: %s", err.Error()) @@ -75,22 +75,19 @@ func RemoveLabelFromNode(nodeName string) error { "Caller": "LabelNode", }).Info(fmt.Sprintf("Removing Label from node %s", nodeName)) - labelKey := "metallb-speaker" - node, err := client.CoreV1().Nodes().Get(context.TODO(), nodeName, metav1.GetOptions{}) if err != nil { panic(err.Error()) } - delete(node.Labels, labelKey) + delete(node.Labels, cfg.CiliumLabel) + delete(node.Labels, "cilium.uploadfilter24.eu/lease") _, err = client.CoreV1().Nodes().Update(context.TODO(), node, metav1.UpdateOptions{}) if err != nil { panic(err.Error()) } - fmt.Printf("Label %s removed from node %s\n", labelKey, nodeName) - return nil }