diff --git a/controllers/webhook/webhook.go b/controllers/webhook/webhook.go index d190fb9cece..4cbd44397b4 100644 --- a/controllers/webhook/webhook.go +++ b/controllers/webhook/webhook.go @@ -59,5 +59,41 @@ func (w *OpenDataHubWebhook) InjectClient(c client.Client) error { } func (w *OpenDataHubWebhook) Handle(ctx context.Context, req admission.Request) admission.Response { - return admission.ValidationResponse(true, "") + var listLen int + var err error + + if req.Operation != admissionv1.Create { + msg := fmt.Sprintf("ODH skipping %v request", req.Operation) + log.Info(msg) + return admission.Allowed(msg) + } + + switch req.Kind.Kind { + case "DataScienceCluster": + instances := &dsc.DataScienceClusterList{} + err = w.client.List(ctx, instances) + listLen = len(instances.Items) + + case "DSCInitialization": + instances := &dsci.DSCInitializationList{} + err = w.client.List(ctx, instances) + listLen = len(instances.Items) + + default: + log.Info("Got wrong kind %s", req.Kind.Kind) + return admission.Errored(http.StatusBadRequest, nil) + } + + if err != nil { + return admission.Errored(http.StatusBadRequest, err) + } + + // if listLen == 1 now creation of #2 is being handled + if listLen > 0 { + msg := fmt.Sprintf("Only one instance of %s object is allowed", req.Kind.Kind) + return admission.Denied(msg) + } + + msg := fmt.Sprintf("%s allowed", req.Kind.Kind) + return admission.Allowed(msg) }