From 840cb95316d5add63feeb84197588d80c1b8a9e7 Mon Sep 17 00:00:00 2001 From: Alex Zongaro Date: Fri, 3 May 2024 17:37:32 +0200 Subject: [PATCH] feat: add exclusions for cleanup policy --- cmd/gitlabUpdateCleanUpPolicyCmd.go | 2 -- cmd/root.go | 1 + config/defs.go | 7 ++++--- config/template.yml | 2 ++ scopes/gitlab/defs.go | 11 ++++++++--- scopes/gitlab/main.go | 27 ++++++++++++++++++++++----- 6 files changed, 37 insertions(+), 13 deletions(-) diff --git a/cmd/gitlabUpdateCleanUpPolicyCmd.go b/cmd/gitlabUpdateCleanUpPolicyCmd.go index 257a62a..55a1036 100644 --- a/cmd/gitlabUpdateCleanUpPolicyCmd.go +++ b/cmd/gitlabUpdateCleanUpPolicyCmd.go @@ -27,8 +27,6 @@ var gitlabUpdateCleanUpPolicyCmd = &cobra.Command{ fmt.Println(err) os.Exit(1) } - - fmt.Println("Updated cleanup policy of the project with ID", projectID) }, } diff --git a/cmd/root.go b/cmd/root.go index 1b4f12d..8112fac 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -87,6 +87,7 @@ func initConfig() { mainConfig.Gitlab.ApiURL, mainConfig.Gitlab.Token, mainConfig.Gitlab.Mirror, + mainConfig.Gitlab.Exclusions, ) onepassword = op.NewOnePassword(mainConfig.OnePassword.Address) diff --git a/config/defs.go b/config/defs.go index dead170..60424f7 100644 --- a/config/defs.go +++ b/config/defs.go @@ -9,9 +9,10 @@ type ConfigPostamark struct { } type ConfigGitlab struct { - Token string `mapstructure:"token"` - ApiURL string `mapstructure:"api_url"` - Mirror gitlab.GitlabMirrorOptions `mapstructure:"mirror"` + Token string `mapstructure:"token"` + ApiURL string `mapstructure:"api_url"` + Exclusions gitlab.GitlabExclusionsConfig `mapstructure:"exclusions"` + Mirror gitlab.GitlabMirrorOptions `mapstructure:"mirror"` } type ConfigOnePassword struct { diff --git a/config/template.yml b/config/template.yml index 842c996..0d27f6c 100644 --- a/config/template.yml +++ b/config/template.yml @@ -1,6 +1,8 @@ gitlab: api_url: "https://company.gitlab.com/api/v4" token: "" + exclusions: + cleanup_policies: [] mirror: url: "https://gitlab.com/api/v4" group_id: "" diff --git a/scopes/gitlab/defs.go b/scopes/gitlab/defs.go index e254f46..2044299 100644 --- a/scopes/gitlab/defs.go +++ b/scopes/gitlab/defs.go @@ -9,9 +9,10 @@ const gitlabDefaultGroupMemberOwner string = "default_group_member_owner" const gitlabDefaultGroupMember string = "default_group_member" type gitlab struct { - token string - apiURL string - mirror GitlabMirrorOptions + token string + apiURL string + mirror GitlabMirrorOptions + exclusions GitlabExclusionsConfig } type Gitlab interface { @@ -36,6 +37,10 @@ type GitlabMirrorOptions struct { GroupID int `mapstructure:"group_id"` } +type GitlabExclusionsConfig struct { + CleanupPolicies []int `mapstructure:"cleanup_policies"` +} + type gitlabCreateMirrorRequest struct { Enabled bool `json:"enabled"` URL string `json:"url"` diff --git a/scopes/gitlab/main.go b/scopes/gitlab/main.go index 392f8fe..9e0eb27 100644 --- a/scopes/gitlab/main.go +++ b/scopes/gitlab/main.go @@ -341,9 +341,25 @@ func (g *gitlab) UpdateCleanUpPolicy(projectID string) error { return err } +// Function to check if an array contains an element +func (g *gitlab) contains(array []int, item int) (bool, error) { + for i := 0; i < len(array); i++ { + // check + if array[i] == item { + return true, nil + } + } + return false, nil +} + // Apply a cleanUP policy on gitlab project. func (g *gitlab) applyCleanUpPolicy(projectID int) error { - _, err := g.request("PUT", fmt.Sprintf("/projects/%d", projectID), defaultCleanUpPolicy, nil) + isExcluded, err := g.contains(g.exclusions.CleanupPolicies, projectID) + if !isExcluded { + _, err = g.request("PUT", fmt.Sprintf("/projects/%d", projectID), defaultCleanUpPolicy, nil) + } else { + fmt.Println("Cleanup policy not updated for the project with ID", projectID) + } return err } @@ -903,10 +919,11 @@ func (g *gitlab) Deprovionioning(username string) error { return nil } -func NewGitlab(apiURL string, token string, mirror GitlabMirrorOptions) Gitlab { +func NewGitlab(apiURL string, token string, mirror GitlabMirrorOptions, exclusions GitlabExclusionsConfig) Gitlab { return &gitlab{ - apiURL: apiURL, - token: token, - mirror: mirror, + apiURL: apiURL, + token: token, + mirror: mirror, + exclusions: exclusions, } }