From 5b3d2a96b75630801670f90aac6801b345d6600a Mon Sep 17 00:00:00 2001 From: Alex Zongaro Date: Thu, 2 May 2024 14:25:19 +0200 Subject: [PATCH 1/2] fix: update cleanup policy parameters --- cmd/gitlabUpdateCleanUpPolicyCmd.go | 37 +++++++++++++++++++++++++++++ scopes/gitlab/defs.go | 13 +++++----- scopes/gitlab/main.go | 11 +++++++++ 3 files changed, 55 insertions(+), 6 deletions(-) create mode 100644 cmd/gitlabUpdateCleanUpPolicyCmd.go diff --git a/cmd/gitlabUpdateCleanUpPolicyCmd.go b/cmd/gitlabUpdateCleanUpPolicyCmd.go new file mode 100644 index 0000000..257a62a --- /dev/null +++ b/cmd/gitlabUpdateCleanUpPolicyCmd.go @@ -0,0 +1,37 @@ +package cmd + +import ( + "fmt" + "os" + + "github.com/spf13/cobra" +) + +var gitlabUpdateCleanUpPolicyCmd = &cobra.Command{ + Use: "cleanup-policy {project_id}", + Args: cobra.ExactArgs(1), + Short: "Update Cleanup Policy for Gitlab project", + Long: ` + Update Cleanup Policy for a specific Gitlab project.`, + Example: ` + Update Cleanup Policy for the project 1234. + opsi gitlab update cleanup-policy 1234 + `, + Run: func(cmd *cobra.Command, args []string) { + // Take project ID + projectID := args[0] + + // Update cleanup policy + err := gitlab.UpdateCleanUpPolicy(projectID) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + fmt.Println("Updated cleanup policy of the project with ID", projectID) + }, +} + +func init() { + gitlabUpdateCmd.AddCommand(gitlabUpdateCleanUpPolicyCmd) +} diff --git a/scopes/gitlab/defs.go b/scopes/gitlab/defs.go index a66f944..e254f46 100644 --- a/scopes/gitlab/defs.go +++ b/scopes/gitlab/defs.go @@ -24,6 +24,7 @@ type Gitlab interface { BulkSettings(*chan string) error Deprovionioning(string) error UpdateMirroring() error + UpdateCleanUpPolicy(string) error } type GitlabMirrorOptions struct { @@ -42,9 +43,9 @@ type gitlabCreateMirrorRequest struct { } type gitlabMirrorResponse struct { - ID int `json:"id"` - Enabled bool `json:"enabled"` - Url string `json:"url"` + ID int `json:"id"` + Enabled bool `json:"enabled"` + Url string `json:"url"` } type gitlabDefaultUser struct { @@ -244,12 +245,12 @@ var defaultProjectStagingSettings = gitlabSetupBranchRequest{ var defaultCleanUpPolicy = map[string]interface{}{ "container_expiration_policy_attributes": map[string]interface{}{ - "cadence": "1month", + "cadence": "7d", "enabled": true, "keep_n": 1, - "older_than": "14d", + "older_than": "7d", "name_regex": ".*", - "name_regex_keep": ".*-main", + "name_regex_keep": ".*", }, } diff --git a/scopes/gitlab/main.go b/scopes/gitlab/main.go index 085aad2..392f8fe 100644 --- a/scopes/gitlab/main.go +++ b/scopes/gitlab/main.go @@ -330,6 +330,17 @@ func (g *gitlab) setDefaultBranch(projectID int, branch string) error { return err } +func (g *gitlab) UpdateCleanUpPolicy(projectID string) error { + id, err := strconv.Atoi(projectID) + + if err != nil { + return err + } + + err = g.applyCleanUpPolicy(id) + return err +} + // 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) From 840cb95316d5add63feeb84197588d80c1b8a9e7 Mon Sep 17 00:00:00 2001 From: Alex Zongaro Date: Fri, 3 May 2024 17:37:32 +0200 Subject: [PATCH 2/2] 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, } }