diff --git a/images/webhooks/src/validators/storageClassUpdate.go b/images/webhooks/src/validators/storageClassUpdate.go index cdf2a88d..e0cbf872 100644 --- a/images/webhooks/src/validators/storageClassUpdate.go +++ b/images/webhooks/src/validators/storageClassUpdate.go @@ -18,6 +18,10 @@ package validators import ( "context" + "fmt" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/rest" + "k8s.io/klog/v2" "webhooks/v1alpha1" "github.com/slok/kubewebhook/v2/pkg/model" @@ -42,6 +46,29 @@ func StorageClassUpdate(ctx context.Context, _ *model.AdmissionReview, obj metav } } + if sc.Spec.IsDefault == true { + config, err := rest.InClusterConfig() + if err != nil { + klog.Fatal(err.Error()) + } + + staticClient, err := kubernetes.NewForConfig(config) + if err != nil { + klog.Fatal(err) + } + + storageClasses, _ := staticClient.StorageV1().StorageClasses().List(context.TODO(), metav1.ListOptions{}) + for _, storageClass := range storageClasses.Items { + for label, value := range storageClass.GetObjectMeta().GetAnnotations() { + if label == "storageclass.kubernetes.io/is-default-class" && value == "true" && storageClass.Name != sc.Name { + klog.Infof("Default StorageClass already set: %s", storageClass.Name) + return &kwhvalidating.ValidatorResult{Valid: false, Message: fmt.Sprintf("Default StorageClass already set: %s", storageClass.Name)}, + nil + } + } + } + } + if thinExists && sc.Spec.LVM.Type == "Thick" { return &kwhvalidating.ValidatorResult{Valid: false, Message: "there must be only thick pools with Thick LVM type"}, nil diff --git a/templates/webhooks/rbac-for-us.yaml b/templates/webhooks/rbac-for-us.yaml index 7668cde0..375e48a4 100644 --- a/templates/webhooks/rbac-for-us.yaml +++ b/templates/webhooks/rbac-for-us.yaml @@ -24,6 +24,7 @@ rules: - storage.k8s.io verbs: - get + - list resources: - storageclasses