58 lines
1.4 KiB
Go
58 lines
1.4 KiB
Go
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
|
|
}
|