pkg/objectmodifier/codebase_modifier.go (60 lines of code) (raw):

package objectmodifier import ( "context" "fmt" "strings" "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" ) // codebaseModifierFunc is a function that modifies codebase. type codebaseModifierFunc func(codebase *codebaseApi.Codebase) bool // CodebaseModifier is a struct that contains a list of codebase modifiers. type CodebaseModifier struct { k8sClient client.Writer modifiers []codebaseModifierFunc } // NewCodebaseModifier returns a new instance of CodebaseModifier. func NewCodebaseModifier(k8sClient client.Writer) *CodebaseModifier { modifiers := []codebaseModifierFunc{ trimCodebaseGitSuffix, addCodebaseGitSuffix, } return &CodebaseModifier{k8sClient: k8sClient, modifiers: modifiers} } // Apply applies all the codebase modifiers to the codebase. func (m *CodebaseModifier) Apply(ctx context.Context, codebase *codebaseApi.Codebase) (bool, error) { patch := client.MergeFrom(codebase.DeepCopy()) needToPatch := false for _, modifier := range m.modifiers { if modifier(codebase) { needToPatch = true } } if needToPatch { if err := m.k8sClient.Patch(ctx, codebase, patch); err != nil { return false, fmt.Errorf("failed to patch codebase: %w", err) } return true, nil } return false, nil } // trimCodebaseGitSuffix removes all the trailing ".git" suffixes at the end of the git url path, if there are any. // If it removes anything, it returns true. func trimCodebaseGitSuffix(codebase *codebaseApi.Codebase) bool { if !strings.HasSuffix(codebase.Spec.GitUrlPath, util.CrSuffixGit) { return false } codebase.Spec.GitUrlPath = util.TrimGitFromURL(codebase.Spec.GitUrlPath) return true } // addCodebaseGitSuffix adds trailing ".git" suffix to the end of the git repository url path, if it doesn't exist. // Returns true if suffix is added. func addCodebaseGitSuffix(codebase *codebaseApi.Codebase) bool { if codebase.Spec.Strategy != util.CloneStrategy { return false } if codebase.Spec.Repository.Url == "" { return false } if strings.HasSuffix(codebase.Spec.Repository.Url, util.CrSuffixGit) { if strings.Count(codebase.Spec.Repository.Url, util.CrSuffixGit) == 1 { return false } codebase.Spec.Repository.Url = util.TrimGitFromURL(codebase.Spec.Repository.Url) } codebase.Spec.Repository.Url = util.AddGitToURL(codebase.Spec.Repository.Url) return true }