func()

in pkg/webhook/codebase_webhook.go [50:96]


func (r *CodebaseValidationWebhook) ValidateCreate(ctx context.Context, obj runtime.Object) (warnings admission.Warnings, err error) {
	req, err := admission.RequestFromContext(ctx)
	if err != nil {
		return nil, apierrors.NewBadRequest(fmt.Errorf("expected admission.Request in ctx: %w", err).Error())
	}

	r.log.Info("validate create", "name", req.Name)

	createdCodebase, ok := obj.(*v1.Codebase)
	if !ok {
		r.log.Info("the wrong object given, skipping validation")

		return nil, nil
	}

	if err = validateCodBaseName(createdCodebase.Name); err != nil {
		return nil, err
	}

	if err = IsCodebaseValid(createdCodebase); err != nil {
		return nil, fmt.Errorf("codebase %s is invalid: %w", createdCodebase.Name, err)
	}

	gitUrlPathToValidate := util.TrimGitFromURL(createdCodebase.Spec.GitUrlPath)
	if gitUrlPathToValidate == "" {
		return nil, fmt.Errorf("gitUrlPath %s is invalid", createdCodebase.Spec.GitUrlPath)
	}

	codeBases := &v1.CodebaseList{}
	if err := r.client.List(ctx, codeBases, client.InNamespace(req.Namespace), client.Limit(listLimit)); err != nil {
		return nil, fmt.Errorf("failed to list codebases: %w", err)
	}

	for i := range codeBases.Items {
		gitUrlPath := codeBases.Items[i].Spec.GitUrlPath

		if gitUrlPath == gitUrlPathToValidate {
			return nil, fmt.Errorf(
				"codebase %s with GitUrlPath %s already exists",
				codeBases.Items[i].Name,
				gitUrlPath,
			)
		}
	}

	return nil, nil
}