controllers/codebase/service/chain/put_gitwebrepourl.go (59 lines of code) (raw):

package chain import ( "context" "fmt" "strings" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" codebaseApi "github.com/epam/edp-codebase-operator/v2/api/v1" "github.com/epam/edp-codebase-operator/v2/pkg/util" ) const gerritQuickLinkName = "gerrit" // PutGitWebRepoUrl is a chain element that puts GitWebUrlPath for codebase status subresource. type PutGitWebRepoUrl struct { client client.Client } // NewPutGitWebRepoUrl creates a new PutGitWebRepoUrl chain element. func NewPutGitWebRepoUrl(k8sClient client.Client) *PutGitWebRepoUrl { return &PutGitWebRepoUrl{client: k8sClient} } // ServeRequest put Git Repo URL Path. func (s *PutGitWebRepoUrl) ServeRequest(ctx context.Context, codebase *codebaseApi.Codebase) error { log := ctrl.LoggerFrom(ctx) log.Info("Start putting urlRepoPath to codebase status") 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), ) } gitWebURL, err := s.getGitWebURL(ctx, gitServer, codebase) if err != nil { return s.processCodebaseError(codebase, err) } codebase.Status.GitWebUrl = gitWebURL if err = setIntermediateSuccessFields(ctx, s.client, codebase, codebaseApi.PutGitWebRepoUrl); err != nil { return fmt.Errorf("failed to update codebase %s status: %w", codebase.Name, err) } log.Info("Finish putting urlRepoPath to codebase status") return nil } // getGitWebURL returns Git Web URL. // For GitHub and GitLab we return link to the repository in format: https://<git_host>/<git_org>/<git_repo> // For Gerrit we return link to the repository in format: https://<gerrit_host>/gitweb?p=<codebase>.git func (s *PutGitWebRepoUrl) getGitWebURL(ctx context.Context, gitServer *codebaseApi.GitServer, codebase *codebaseApi.Codebase) (string, error) { switch gitServer.Spec.GitProvider { case codebaseApi.GitProviderGitlab, codebaseApi.GitProviderGithub, codebaseApi.GitProviderBitbucket: urlLink := util.GetHostWithProtocol(gitServer.Spec.GitHost) urlLink = strings.TrimSuffix(urlLink, "/") // For GitHub and GitLab we return link to the repository in format: https://<git_host>/<git_org>/<git_repo> return fmt.Sprintf("%s/%s", urlLink, codebase.Spec.GetProjectID()), nil case codebaseApi.GitProviderGerrit: link := &codebaseApi.QuickLink{} if err := s.client.Get(ctx, client.ObjectKey{Name: gerritQuickLinkName, Namespace: gitServer.Namespace}, link); err != nil { return "", fmt.Errorf("failed to get QuickLink %s: %w", gerritQuickLinkName, err) } // QuickLink has https:// prefix in the URL. // For Gerrit, we return link to the repository in format: https://<gerrit_host>/gitweb?p=<codebase>.git gerritProjectUrl := strings.TrimSuffix(link.Spec.Url, "/") return fmt.Sprintf("%s/gitweb?p=%s.git", gerritProjectUrl, codebase.Spec.GetProjectID()), nil default: return "", fmt.Errorf("unsupported Git provider %s", gitServer.Spec.GitProvider) } } func (*PutGitWebRepoUrl) processCodebaseError(codebase *codebaseApi.Codebase, err error) error { setFailedFields(codebase, codebaseApi.PutGitWebRepoUrl, err.Error()) return err }