Files
k8s-cilium-node-label/internal/kube.go
Tobias Trabelsi 1da2e795c2
Some checks failed
Lint and Test Charts / lint-test (push) Has been cancelled
Build and Test / Test (push) Failing after 21s
Build and Test / Build_Image_arm64 (push) Successful in 2m4s
Build and Test / Build_Image_amd64 (push) Has been cancelled
fix(): informer should now reach to changes and not process everything every 2 seconds. also corrected path in probes
2026-01-20 21:55:32 +01:00

105 lines
2.7 KiB
Go

package internal
import (
"context"
"fmt"
log "github.com/sirupsen/logrus"
v1 "k8s.io/api/coordination/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
)
func generateClient() (kubernetes.Interface, error) {
log.WithFields(log.Fields{
"Caller": "generateClient",
}).Info("Generating k8s client")
config, err := rest.InClusterConfig()
if err != nil {
return nil, fmt.Errorf("Could not generate in cluster config: %s", err.Error())
}
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
return nil, fmt.Errorf("Could not generate clientset: %s", err.Error())
}
return clientset, nil
}
func LabelNode(nodeName string, leaseName string, cfg *Config) error {
client, err := generateClient()
if err != nil {
return fmt.Errorf("Could not generate client: %s", err.Error())
}
return ApplyLabelToNode(client, nodeName, leaseName, cfg)
}
func ApplyLabelToNode(client kubernetes.Interface, nodeName string, leaseName string, cfg *Config) error {
log.WithFields(log.Fields{
"Caller": "ApplyLabelToNode",
}).Info(fmt.Sprintf("Trying to label node %s", nodeName))
node, err := client.CoreV1().Nodes().Get(context.TODO(), nodeName, metav1.GetOptions{})
if err != nil {
return fmt.Errorf("Could not find Kubernetes node: %s", err.Error())
}
if node.Labels == nil {
node.Labels = make(map[string]string)
}
node.Labels[cfg.CiliumLabel] = "true"
node.Labels["cilium.uploadfilter24.eu/lease"] = leaseName
_, err = client.CoreV1().Nodes().Update(context.TODO(), node, metav1.UpdateOptions{})
if err != nil {
return fmt.Errorf("Could not update node label: %s", err.Error())
}
log.WithFields(log.Fields{
"Caller": "ApplyLabelToNode",
}).Info(fmt.Sprintf("Node %s labeled with %s=%s\n", nodeName, cfg.CiliumLabel, "true"))
return nil
}
func RemoveLabelFromNode(nodeName string) error {
client, err := generateClient()
if err != nil {
return fmt.Errorf("Could not generate client: %s", err.Error())
}
log.WithFields(log.Fields{
"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)
_, 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
}
func GetNodeNameFromLease(lease v1.Lease) (string, error) {
if lease.Spec.HolderIdentity == nil {
return "", fmt.Errorf("Lease %s has no HolderIdentity", lease.Name)
}
holderIdentity := *lease.Spec.HolderIdentity
return holderIdentity, nil
}