github.com/argoproj/argo-cd/v2@v2.10.9/applicationset/services/repo_service.go (about) 1 package services 2 3 import ( 4 "context" 5 "fmt" 6 7 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1" 8 "github.com/argoproj/argo-cd/v2/reposerver/apiclient" 9 "github.com/argoproj/argo-cd/v2/util/db" 10 "github.com/argoproj/argo-cd/v2/util/git" 11 "github.com/argoproj/argo-cd/v2/util/io" 12 ) 13 14 //go:generate go run github.com/vektra/mockery/v2@v2.25.1 --name=RepositoryDB 15 16 // RepositoryDB Is a lean facade for ArgoDB, 17 // Using a lean interface makes it easier to test the functionality of the git generator 18 type RepositoryDB interface { 19 GetRepository(ctx context.Context, url string) (*v1alpha1.Repository, error) 20 } 21 22 type argoCDService struct { 23 repositoriesDB RepositoryDB 24 storecreds git.CredsStore 25 submoduleEnabled bool 26 repoServerClientSet apiclient.Clientset 27 newFileGlobbingEnabled bool 28 } 29 30 //go:generate go run github.com/vektra/mockery/v2@v2.25.1 --name=Repos 31 32 type Repos interface { 33 34 // GetFiles returns content of files (not directories) within the target repo 35 GetFiles(ctx context.Context, repoURL string, revision string, pattern string, noRevisionCache bool) (map[string][]byte, error) 36 37 // GetDirectories returns a list of directories (not files) within the target repo 38 GetDirectories(ctx context.Context, repoURL string, revision string, noRevisionCache bool) ([]string, error) 39 } 40 41 func NewArgoCDService(db db.ArgoDB, submoduleEnabled bool, repoClientset apiclient.Clientset, newFileGlobbingEnabled bool) (Repos, error) { 42 return &argoCDService{ 43 repositoriesDB: db.(RepositoryDB), 44 submoduleEnabled: submoduleEnabled, 45 repoServerClientSet: repoClientset, 46 newFileGlobbingEnabled: newFileGlobbingEnabled, 47 }, nil 48 } 49 50 func (a *argoCDService) GetFiles(ctx context.Context, repoURL string, revision string, pattern string, noRevisionCache bool) (map[string][]byte, error) { 51 repo, err := a.repositoriesDB.GetRepository(ctx, repoURL) 52 if err != nil { 53 return nil, fmt.Errorf("error in GetRepository: %w", err) 54 } 55 56 fileRequest := &apiclient.GitFilesRequest{ 57 Repo: repo, 58 SubmoduleEnabled: a.submoduleEnabled, 59 Revision: revision, 60 Path: pattern, 61 NewGitFileGlobbingEnabled: a.newFileGlobbingEnabled, 62 NoRevisionCache: noRevisionCache, 63 } 64 closer, client, err := a.repoServerClientSet.NewRepoServerClient() 65 if err != nil { 66 return nil, fmt.Errorf("error initialising new repo server client: %w", err) 67 } 68 defer io.Close(closer) 69 70 fileResponse, err := client.GetGitFiles(ctx, fileRequest) 71 if err != nil { 72 return nil, fmt.Errorf("error retrieving Git files: %w", err) 73 } 74 return fileResponse.GetMap(), nil 75 } 76 77 func (a *argoCDService) GetDirectories(ctx context.Context, repoURL string, revision string, noRevisionCache bool) ([]string, error) { 78 repo, err := a.repositoriesDB.GetRepository(ctx, repoURL) 79 if err != nil { 80 return nil, fmt.Errorf("error in GetRepository: %w", err) 81 } 82 83 dirRequest := &apiclient.GitDirectoriesRequest{ 84 Repo: repo, 85 SubmoduleEnabled: a.submoduleEnabled, 86 Revision: revision, 87 NoRevisionCache: noRevisionCache, 88 } 89 90 closer, client, err := a.repoServerClientSet.NewRepoServerClient() 91 if err != nil { 92 return nil, fmt.Errorf("error initialising new repo server client: %w", err) 93 } 94 defer io.Close(closer) 95 96 dirResponse, err := client.GetGitDirectories(ctx, dirRequest) 97 if err != nil { 98 return nil, fmt.Errorf("error retrieving Git Directories: %w", err) 99 } 100 return dirResponse.GetPaths(), nil 101 102 }