From c1521b0de423b36a56ac1a770a95d081c71dc58f Mon Sep 17 00:00:00 2001 From: Yauheni Kaliuta Date: Thu, 9 Nov 2023 17:06:54 +0200 Subject: [PATCH] DSC, DSCI: webhook: implement one instance enforcing The webhook handles only Create requests (configured in config/webhook/manifests.yaml). Implements the logic which is done now on reconcile time [1] (same for DSCI). It checks for 0, not 1, since when the webhook is running the object has not been created yet. Means if it's 1 then it handles request to create a second one. It could be probably possible to use generics but does not make a lot of sense for such a simple case. Closes: #693 [1] https://github.com/opendatahub-io/opendatahub-operator/blob/incubation/controllers/datasciencecluster/datasciencecluster_controller.go#L98 Signed-off-by: Yauheni Kaliuta --- controllers/webhook/webhook.go | 38 +++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) 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) }