Skip to content

Commit

Permalink
fix: context and git provider factory
Browse files Browse the repository at this point in the history
  • Loading branch information
GoshaDo committed Nov 10, 2024
1 parent df72152 commit a280f99
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 82 deletions.
94 changes: 46 additions & 48 deletions pkg/git_provider/gitlab.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand All @@ -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
Expand All @@ -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
}
Expand Down Expand Up @@ -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)
Expand All @@ -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
}
Expand All @@ -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
Expand All @@ -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 {
Expand All @@ -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
}
Expand All @@ -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)
Expand All @@ -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{
Expand Down Expand Up @@ -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
}
Expand All @@ -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
}
Expand All @@ -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
}
Expand Down
58 changes: 24 additions & 34 deletions pkg/git_provider/gitlab_utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,36 +40,35 @@ 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)

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
}
Expand All @@ -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
}
Expand Down Expand Up @@ -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)
Expand All @@ -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
}
6 changes: 6 additions & 0 deletions pkg/git_provider/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit a280f99

Please sign in to comment.