diff --git a/pkg/git_provider/gitlab.go b/pkg/git_provider/gitlab.go index f67b259..763428c 100644 --- a/pkg/git_provider/gitlab.go +++ b/pkg/git_provider/gitlab.go @@ -20,9 +20,14 @@ type GitlabClientImpl struct { } func NewGitlabClient(cfg *conf.GlobalConfig) (Client, error) { + var options []gitlab.ClientOptionFunc ctx := context.Background() - client, err := gitlab.NewClient(cfg.GitProviderConfig.Token, gitlab.WithBaseURL(cfg.GitProviderConfig.Url)) + if cfg.GitProviderConfig.Url != "" { + options = append(options, gitlab.WithBaseURL(cfg.GitProviderConfig.Url)) + } + + client, err := gitlab.NewClient(cfg.GitProviderConfig.Token, options...) if err != nil { return nil, err } @@ -41,28 +46,23 @@ func NewGitlabClient(cfg *conf.GlobalConfig) (Client, error) { return nil, fmt.Errorf("failed to get organization data %s", resp.Status) } - cfg = EnsureGitlabURL(cfg) + cfg.GitProviderConfig.OrgID = int64(group.ID) + log.Printf("Org ID is: %d\n", cfg.OrgID) - c := &GitlabClientImpl{ + return &GitlabClientImpl{ client: client, cfg: cfg, - } - - c.cfg.GitProviderConfig.OrgID = int64(group.ID) - log.Printf("Org ID is: %d\n", cfg.OrgID) - - return c, err + }, err } func (c *GitlabClientImpl) ListFiles(ctx *context.Context, repo string, branch string, path string) ([]string, error) { var files []string opt := &gitlab.ListTreeOptions{ - Ref: &branch, - Path: &path,} - - projectName := fmt.Sprintf("%s/%s", c.cfg.GitProviderConfig.OrgName ,repo) - dirFiles, resp, err := c.client.Repositories.ListTree(projectName, opt) + Ref: &branch, + Path: &path} + projectName := fmt.Sprintf("%s/%s", c.cfg.GitProviderConfig.OrgName, repo) + dirFiles, resp, err := c.client.Repositories.ListTree(projectName, opt, gitlab.WithContext(*ctx)) if err != nil { return nil, err @@ -79,8 +79,7 @@ func (c *GitlabClientImpl) ListFiles(ctx *context.Context, repo string, branch s func (c *GitlabClientImpl) GetFile(ctx *context.Context, repo string, branch string, path string) (*CommitFile, error) { var commitFile CommitFile - opt := &gitlab.GetFileOptions{Ref: &branch,} - fileContent, resp, err := c.client.RepositoryFiles.GetFile(repo, path,opt) + fileContent, resp, err := c.client.RepositoryFiles.GetFile(repo, path, &gitlab.GetFileOptions{Ref: &branch}, gitlab.WithContext(*ctx)) if err != nil { return &commitFile, err } @@ -116,16 +115,16 @@ func (c *GitlabClientImpl) SetWebhook(ctx *context.Context, repo *string) (*Hook var gitlabHook gitlab.Hook if repo == nil { - respHook, ok := IsGroupWebhookEnabled(c) + respHook, ok := IsGroupWebhookEnabled(ctx, c) if !ok { groupHookOptions := gitlab.AddGroupHookOptions{ - URL: gitlab.Ptr(c.cfg.GitProviderConfig.WebhookURL), - Token: gitlab.Ptr(c.cfg.GitProviderConfig.WebhookSecret), + URL: gitlab.Ptr(c.cfg.GitProviderConfig.WebhookURL), + Token: gitlab.Ptr(c.cfg.GitProviderConfig.WebhookSecret), MergeRequestsEvents: gitlab.Ptr(true), - PushEvents: gitlab.Ptr(true), - ReleasesEvents: gitlab.Ptr(true), - TagPushEvents: gitlab.Ptr(true), + PushEvents: gitlab.Ptr(true), + ReleasesEvents: gitlab.Ptr(true), + TagPushEvents: gitlab.Ptr(true), } gitlabHook, resp, err := c.client.Groups.AddGroupHook(c.cfg.GitProviderConfig.OrgName, &groupHookOptions) @@ -138,14 +137,14 @@ func (c *GitlabClientImpl) SetWebhook(ctx *context.Context, repo *string) (*Hook log.Printf("added webhook for %s name: %s\n", c.cfg.GitProviderConfig.OrgName, gitlabHook.URL) } else { editedGroupHookOpt := gitlab.EditGroupHookOptions{ - URL: gitlab.Ptr(c.cfg.GitProviderConfig.WebhookURL), - Token: gitlab.Ptr(c.cfg.GitProviderConfig.WebhookSecret), + URL: gitlab.Ptr(c.cfg.GitProviderConfig.WebhookURL), + Token: gitlab.Ptr(c.cfg.GitProviderConfig.WebhookSecret), MergeRequestsEvents: gitlab.Ptr(true), - PushEvents: gitlab.Ptr(true), - ReleasesEvents: gitlab.Ptr(true), - TagPushEvents: gitlab.Ptr(true), + PushEvents: gitlab.Ptr(true), + ReleasesEvents: gitlab.Ptr(true), + TagPushEvents: gitlab.Ptr(true), } - gitlabHook, resp, err := c.client.Groups.EditGroupHook(c.cfg.GitProviderConfig.OrgName,respHook.ID,&editedGroupHookOpt,) + gitlabHook, resp, err := c.client.Groups.EditGroupHook(c.cfg.GitProviderConfig.OrgName, respHook.ID, &editedGroupHookOpt) if err != nil { return nil, err } @@ -159,17 +158,17 @@ func (c *GitlabClientImpl) SetWebhook(ctx *context.Context, repo *string) (*Hook log.Printf("edited webhook for %s: %s\n", c.cfg.GitProviderConfig.OrgName, gitlabHook.URL) } } else { - respHook, ok := IsProjectWebhookEnabled(c, *repo) + respHook, ok := IsProjectWebhookEnabled(ctx, c, *repo) if !ok { addProjectHookOpts := gitlab.AddProjectHookOptions{ - URL: gitlab.Ptr(c.cfg.GitProviderConfig.WebhookURL), - Token: gitlab.Ptr(c.cfg.GitProviderConfig.WebhookSecret), + URL: gitlab.Ptr(c.cfg.GitProviderConfig.WebhookURL), + Token: gitlab.Ptr(c.cfg.GitProviderConfig.WebhookSecret), MergeRequestsEvents: gitlab.Ptr(true), - PushEvents: gitlab.Ptr(true), - ReleasesEvents: gitlab.Ptr(true), - TagPushEvents: gitlab.Ptr(true), + PushEvents: gitlab.Ptr(true), + ReleasesEvents: gitlab.Ptr(true), + TagPushEvents: gitlab.Ptr(true), } - + gitlabHook, resp, err := c.client.Projects.AddProjectHook(*repo, &addProjectHookOpts) if err != nil { return nil, err @@ -180,12 +179,12 @@ func (c *GitlabClientImpl) SetWebhook(ctx *context.Context, repo *string) (*Hook log.Printf("created webhook for %s: %s\n", *repo, gitlabHook.URL) } else { editProjectHookOpts := gitlab.EditProjectHookOptions{ - URL: gitlab.Ptr(c.cfg.GitProviderConfig.WebhookURL), - Token: gitlab.Ptr(c.cfg.GitProviderConfig.WebhookSecret), + URL: gitlab.Ptr(c.cfg.GitProviderConfig.WebhookURL), + Token: gitlab.Ptr(c.cfg.GitProviderConfig.WebhookSecret), MergeRequestsEvents: gitlab.Ptr(true), - PushEvents: gitlab.Ptr(true), - ReleasesEvents: gitlab.Ptr(true), - TagPushEvents: gitlab.Ptr(true), + PushEvents: gitlab.Ptr(true), + ReleasesEvents: gitlab.Ptr(true), + TagPushEvents: gitlab.Ptr(true), } gitlabHook, resp, err := c.client.Projects.EditProjectHook(*repo, respHook.ID, &editProjectHookOpts) if err != nil { @@ -206,7 +205,7 @@ func (c *GitlabClientImpl) SetWebhook(ctx *context.Context, repo *string) (*Hook func (c *GitlabClientImpl) UnsetWebhook(ctx *context.Context, hook *HookWithStatus) error { if hook.RepoName == nil { - resp, err := c.client.Groups.DeleteGroupHook( c.cfg.GitProviderConfig.OrgName, int(hook.HookID)) + resp, err := c.client.Groups.DeleteGroupHook(c.cfg.GitProviderConfig.OrgName, int(hook.HookID), gitlab.WithContext(*ctx)) if err != nil { return err } @@ -216,7 +215,7 @@ func (c *GitlabClientImpl) UnsetWebhook(ctx *context.Context, hook *HookWithStat } log.Printf("removed group webhook, hookID :%d\n", hook.HookID) } else { - resp, err := c.client.Projects.DeleteProjectHook(*hook.RepoName, int(hook.HookID)) + resp, err := c.client.Projects.DeleteProjectHook(*hook.RepoName, int(hook.HookID), gitlab.WithContext(*ctx)) if err != nil { return fmt.Errorf("failed to delete project level webhhok for %s, API call returned %d. %s", *hook.RepoName, resp.StatusCode, err) @@ -242,7 +241,6 @@ func (c *GitlabClientImpl) HandlePayload(ctx *context.Context, request *http.Req return nil, err } - switch e := event.(type) { case gitlab.PushEvent: webhookPayload = &WebhookPayload{ @@ -295,13 +293,13 @@ func (c *GitlabClientImpl) SetStatus(ctx *context.Context, repo *string, commit repoStatus := &gitlab.SetCommitStatusOptions{ State: gitlab.BuildStateValue(*status), // pending, success, error, or failure. - Ref: commit, + Ref: commit, TargetURL: linkURL, Description: gitlab.Ptr(fmt.Sprintf("Workflow %s %s", *status, *message)), Context: gitlab.Ptr("Piper/ArgoWorkflows"), } - - _, resp, err := c.client.Commits.SetCommitStatus(*repo, *commit, repoStatus) + + _, resp, err := c.client.Commits.SetCommitStatus(*repo, *commit, repoStatus, gitlab.WithContext(*ctx)) if err != nil { return err } @@ -319,7 +317,7 @@ func (c *GitlabClientImpl) PingHook(ctx *context.Context, hook *HookWithStatus) return fmt.Errorf("trying o ping repo scope webhook while configured for org level webhook. repo: %s", *hook.RepoName) } if hook.RepoName == nil { - _,resp, err := c.client.Groups.GetGroupHook(c.cfg.OrgName,int(hook.HookID), nil) + _, resp, err := c.client.Groups.GetGroupHook(c.cfg.OrgName, int(hook.HookID), nil, gitlab.WithContext(*ctx)) if err != nil { return err } @@ -328,7 +326,7 @@ func (c *GitlabClientImpl) PingHook(ctx *context.Context, hook *HookWithStatus) return fmt.Errorf("unable to find organization webhook for hookID: %d", hook.HookID) } } else { - _ , resp, err := c.client.Projects.GetProjectHook(*hook.RepoName, int(hook.HookID), nil) + _, resp, err := c.client.Projects.GetProjectHook(*hook.RepoName, int(hook.HookID), nil, gitlab.WithContext(*ctx)) if err != nil { return err } diff --git a/pkg/git_provider/gitlab_utils.go b/pkg/git_provider/gitlab_utils.go index 7b9e433..d1e847e 100644 --- a/pkg/git_provider/gitlab_utils.go +++ b/pkg/git_provider/gitlab_utils.go @@ -40,26 +40,25 @@ func ValidateGitlabPermissions(ctx context.Context, client *gitlab.Client, cfg * } func getGitlabScopes(ctx context.Context, client *gitlab.Client) ([]string, error) { - - user, resp,err := client.Users.CurrentUser() - fmt.Println(user.ID) - if err != nil{ + + user, resp, err := client.Users.CurrentUser(gitlab.WithContext(ctx)) + if err != nil { return nil, err - } - if resp.StatusCode == 400 { + } + if resp.StatusCode == 400 { return nil, err - } - a := gitlab.ListPersonalAccessTokensOptions{ - UserID: &user.ID, } - accessTokens, resp,err := client.PersonalAccessTokens.ListPersonalAccessTokens(&a) - fmt.Println(accessTokens) - if err != nil{ + a := gitlab.ListPersonalAccessTokensOptions{ + UserID: &user.ID, + } + accessTokens, resp, err := client.PersonalAccessTokens.ListPersonalAccessTokens(&a) + fmt.Println(accessTokens) + if err != nil { return nil, err - } - if resp.StatusCode == 400 { + } + if resp.StatusCode == 400 { return nil, err - } + } scopes := accessTokens[0].Scopes fmt.Println("Gitlab Token Scopes are:", scopes) @@ -67,9 +66,9 @@ func getGitlabScopes(ctx context.Context, client *gitlab.Client) ([]string, erro return scopes, nil } -func IsGroupWebhookEnabled(c *GitlabClientImpl) (*gitlab.GroupHook, bool) { +func IsGroupWebhookEnabled(ctx *context.Context, c *GitlabClientImpl) (*gitlab.GroupHook, bool) { emptyHook := gitlab.GroupHook{} - hooks, resp, err := c.client.Groups.ListGroupHooks(c.cfg.GitProviderConfig.OrgName, nil) + hooks, resp, err := c.client.Groups.ListGroupHooks(c.cfg.GitProviderConfig.OrgName, nil, gitlab.WithContext(*ctx)) if err != nil { return &emptyHook, false } @@ -87,10 +86,10 @@ func IsGroupWebhookEnabled(c *GitlabClientImpl) (*gitlab.GroupHook, bool) { return &emptyHook, false } -func IsProjectWebhookEnabled(c *GitlabClientImpl, project string) (*gitlab.ProjectHook, bool) { +func IsProjectWebhookEnabled(ctx *context.Context, c *GitlabClientImpl, project string) (*gitlab.ProjectHook, bool) { emptyHook := gitlab.ProjectHook{} - projectFullName := fmt.Sprintf("%s/%s", c.cfg.GitProviderConfig.OrgName ,project) - hooks, resp, err := c.client.Projects.ListProjectHooks(projectFullName, nil) + projectFullName := fmt.Sprintf("%s/%s", c.cfg.GitProviderConfig.OrgName, project) + hooks, resp, err := c.client.Projects.ListProjectHooks(projectFullName, nil, gitlab.WithContext(*ctx)) if err != nil { return &emptyHook, false } @@ -118,7 +117,7 @@ func ExtractLabelsId(labels []*gitlab.EventLabel) []string { return returnLabelsList } -func ValidatePayload(r *http.Request, secret []byte) ([]byte, error){ +func ValidatePayload(r *http.Request, secret []byte) ([]byte, error) { payload, err := io.ReadAll(r.Body) if err != nil { return nil, fmt.Errorf("error reading request body: %v", err) @@ -137,28 +136,19 @@ func ValidatePayload(r *http.Request, secret []byte) ([]byte, error){ } expectedMAC := hex.EncodeToString(h.Sum(nil)) - isEquall := hmac.Equal([]byte(gitlabSignature), []byte(expectedMAC)) - if !isEquall { + isEqual := hmac.Equal([]byte(gitlabSignature), []byte(expectedMAC)) + if !isEqual { return nil, fmt.Errorf("secret not correct") } return payload, nil } - -func FixRepoNames(c *GitlabClientImpl) error{ +func FixRepoNames(c *GitlabClientImpl) error { var formattedRepos []string for _, repo := range strings.Split(c.cfg.GitProviderConfig.RepoList, ",") { - userRepo := fmt.Sprintf("%s/%s", c.cfg.GitProviderConfig.OrgName ,repo) + userRepo := fmt.Sprintf("%s/%s", c.cfg.GitProviderConfig.OrgName, repo) formattedRepos = append(formattedRepos, userRepo) } c.cfg.GitProviderConfig.RepoList = strings.Join(formattedRepos, ",") return nil } - -func EnsureGitlabURL(c *conf.GlobalConfig) *conf.GlobalConfig{ - saasGitlabUrl := "https://gitlab.com" - if c.Url == "" { - c.Url = saasGitlabUrl - } - return c -} \ No newline at end of file diff --git a/pkg/git_provider/main.go b/pkg/git_provider/main.go index 9ebc5fa..6143b9a 100644 --- a/pkg/git_provider/main.go +++ b/pkg/git_provider/main.go @@ -20,6 +20,12 @@ func NewGitProviderClient(cfg *conf.GlobalConfig) (Client, error) { return nil, err } return gitClient, nil + case "gitlab": + gitClient, err := NewGitlabClient(cfg) + if err != nil { + return nil, err + } + return gitClient, nil } return nil, fmt.Errorf("didn't find matching git provider %s", cfg.GitProviderConfig.Provider)