func()

in controllers/codebase/service/chain/put_webhook.go [38:123]


func (s *PutWebHook) ServeRequest(ctx context.Context, codebase *codebaseApi.Codebase) error {
	log := ctrl.LoggerFrom(ctx)

	if codebase.Spec.CiTool != util.CITekton {
		log.Info("Skip putting webhook for non-Tekton CI tool")
		return nil
	}

	log.Info("Start putting webhook")

	gitServer := &codebaseApi.GitServer{}
	if err := s.client.Get(ctx, client.ObjectKey{Name: codebase.Spec.GitServer, Namespace: codebase.Namespace}, gitServer); err != nil {
		return s.processCodebaseError(
			codebase,
			fmt.Errorf("failed to get git server %s: %w", codebase.Spec.GitServer, err),
		)
	}

	if gitServer.Spec.GitProvider != codebaseApi.GitProviderGitlab &&
		gitServer.Spec.GitProvider != codebaseApi.GitProviderGithub &&
		gitServer.Spec.GitProvider != codebaseApi.GitProviderBitbucket {
		log.Info(fmt.Sprintf("Unsupported Git provider %s. Skip putting webhook", gitServer.Spec.GitProvider))
		return nil
	}

	secret, err := s.getGitServerSecret(ctx, gitServer.Spec.NameSshKeySecret, gitServer.Namespace)
	if err != nil {
		return s.processCodebaseError(codebase, err)
	}

	gitProvider, err := gitprovider.NewProvider(gitServer, s.restyClient, string(secret.Data[util.GitServerSecretTokenField]))
	if err != nil {
		return s.processCodebaseError(codebase, fmt.Errorf("failed to create git provider: %w", err))
	}

	projectID := codebase.Spec.GetProjectID()
	gitHost := gitprovider.GetGitProviderAPIURL(gitServer)

	if codebase.Status.GetWebHookRef() != "" {
		_, err = gitProvider.GetWebHook(
			ctx,
			gitHost,
			string(secret.Data[util.GitServerSecretTokenField]),
			projectID,
			codebase.Status.GetWebHookRef(),
		)

		if err == nil {
			log.Info("Webhook already exists. Skip putting webhook")

			return nil
		}

		if !errors.Is(err, gitprovider.ErrWebHookNotFound) {
			return s.processCodebaseError(codebase, fmt.Errorf("failed to get webhook: %w", err))
		}
	}

	webHookURL, err := s.getWebHookUrl(ctx, gitServer)
	if err != nil {
		return s.processCodebaseError(codebase, err)
	}

	webHook, err := gitProvider.CreateWebHookIfNotExists(
		ctx,
		gitHost,
		string(secret.Data[util.GitServerSecretTokenField]),
		projectID,
		string(secret.Data[util.GitServerSecretWebhookSecretField]),
		webHookURL,
		gitServer.Spec.SkipWebhookSSLVerification,
	)
	if err != nil {
		return s.processCodebaseError(codebase, fmt.Errorf("failed to create web hook: %w", err))
	}

	codebase.Status.WebHookRef = webHook.ID

	if err = setIntermediateSuccessFields(ctx, s.client, codebase, codebaseApi.PutWebHook); err != nil {
		return fmt.Errorf("failed to update codebase %s status: %w", codebase.Name, err)
	}

	log.Info("Webhook has been created successfully")

	return nil
}