package node import ( "context" "fmt" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/klog/v2" "undecided.project/monok8s/pkg/crds" "undecided.project/monok8s/pkg/kube" ) func ApplyCRDs(ctx context.Context, n *NodeContext) error { if n.Config.Spec.ClusterRole != "control-plane" { return nil } const kubeconfig = "/etc/kubernetes/admin.conf" clients, err := kube.NewClientsFromKubeconfig(kubeconfig) if err != nil { return fmt.Errorf("build kube clients from %s: %w", kubeconfig, err) } crdClient := clients.APIExtensions.ApiextensionsV1().CustomResourceDefinitions() for _, wanted := range crds.Definitions() { _, err := crdClient.Create(ctx, wanted, metav1.CreateOptions{}) if err == nil { klog.InfoS("crd created", "name", wanted.Name) continue } if !apierrors.IsAlreadyExists(err) { return fmt.Errorf("create CRD %s: %w", wanted.Name, err) } current, getErr := crdClient.Get(ctx, wanted.Name, metav1.GetOptions{}) if getErr != nil { return fmt.Errorf("get existing CRD %s: %w", wanted.Name, getErr) } updated := wanted.DeepCopy() updated.ResourceVersion = current.ResourceVersion _, err = crdClient.Update(ctx, updated, metav1.UpdateOptions{}) if err != nil { return fmt.Errorf("update CRD %s: %w", wanted.Name, err) } klog.InfoS("crd updated", "name", wanted.Name) } return nil }