github.com/argoproj/argo-cd/v3@v3.2.1/util/notification/argocd/service.go (about) 1 package service 2 3 import ( 4 "context" 5 6 "github.com/argoproj/argo-cd/v3/util/notification/expression/shared" 7 8 log "github.com/sirupsen/logrus" 9 "k8s.io/client-go/kubernetes" 10 11 "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" 12 "github.com/argoproj/argo-cd/v3/reposerver/apiclient" 13 "github.com/argoproj/argo-cd/v3/util/db" 14 "github.com/argoproj/argo-cd/v3/util/settings" 15 ) 16 17 type Service interface { 18 GetCommitMetadata(ctx context.Context, repoURL string, commitSHA string, project string) (*shared.CommitMetadata, error) 19 GetAppDetails(ctx context.Context, app *v1alpha1.Application) (*shared.AppDetail, error) 20 } 21 22 func NewArgoCDService(clientset kubernetes.Interface, namespace string, repoClientset apiclient.Clientset) (*argoCDService, error) { 23 ctx, cancel := context.WithCancel(context.Background()) 24 settingsMgr := settings.NewSettingsManager(ctx, clientset, namespace) 25 closer, repoClient, err := repoClientset.NewRepoServerClient() 26 if err != nil { 27 cancel() 28 return nil, err 29 } 30 31 dispose := func() { 32 cancel() 33 if err := closer.Close(); err != nil { 34 log.Warnf("Failed to close repo server connection: %v", err) 35 } 36 } 37 return &argoCDService{settingsMgr: settingsMgr, namespace: namespace, repoServerClient: repoClient, dispose: dispose}, nil 38 } 39 40 type argoCDService struct { 41 clientset kubernetes.Interface 42 namespace string 43 settingsMgr *settings.SettingsManager 44 repoServerClient apiclient.RepoServerServiceClient 45 dispose func() 46 } 47 48 func (svc *argoCDService) GetCommitMetadata(ctx context.Context, repoURL string, commitSHA string, project string) (*shared.CommitMetadata, error) { 49 argocdDB := db.NewDB(svc.namespace, svc.settingsMgr, svc.clientset) 50 repo, err := argocdDB.GetRepository(ctx, repoURL, project) 51 if err != nil { 52 return nil, err 53 } 54 metadata, err := svc.repoServerClient.GetRevisionMetadata(ctx, &apiclient.RepoServerRevisionMetadataRequest{ 55 Repo: repo, 56 Revision: commitSHA, 57 }) 58 if err != nil { 59 return nil, err 60 } 61 return &shared.CommitMetadata{ 62 Message: metadata.Message, 63 Author: metadata.Author, 64 Date: metadata.Date.Time, 65 Tags: metadata.Tags, 66 }, nil 67 } 68 69 func (svc *argoCDService) GetAppDetails(ctx context.Context, app *v1alpha1.Application) (*shared.AppDetail, error) { 70 appSource := app.Spec.GetSourcePtrByIndex(0) 71 72 argocdDB := db.NewDB(svc.namespace, svc.settingsMgr, svc.clientset) 73 repo, err := argocdDB.GetRepository(ctx, appSource.RepoURL, app.Spec.Project) 74 if err != nil { 75 return nil, err 76 } 77 helmRepos, err := argocdDB.ListHelmRepositories(ctx) 78 if err != nil { 79 return nil, err 80 } 81 kustomizeOptions, err := svc.settingsMgr.GetKustomizeSettings() 82 if err != nil { 83 return nil, err 84 } 85 helmOptions, err := svc.settingsMgr.GetHelmSettings() 86 if err != nil { 87 return nil, err 88 } 89 appDetail, err := svc.repoServerClient.GetAppDetails(ctx, &apiclient.RepoServerAppDetailsQuery{ 90 AppName: app.Name, 91 Repo: repo, 92 Source: appSource, 93 Repos: helmRepos, 94 KustomizeOptions: kustomizeOptions, 95 HelmOptions: helmOptions, 96 }) 97 if err != nil { 98 return nil, err 99 } 100 var has *shared.CustomHelmAppSpec 101 if appDetail.Helm != nil { 102 has = &shared.CustomHelmAppSpec{ 103 HelmAppSpec: apiclient.HelmAppSpec{ 104 Name: appDetail.Helm.Name, 105 ValueFiles: appDetail.Helm.ValueFiles, 106 Parameters: appDetail.Helm.Parameters, 107 Values: appDetail.Helm.Values, 108 FileParameters: appDetail.Helm.FileParameters, 109 }, 110 HelmParameterOverrides: appSource.Helm.Parameters, 111 } 112 } 113 return &shared.AppDetail{ 114 Type: appDetail.Type, 115 Helm: has, 116 Kustomize: appDetail.Kustomize, 117 Directory: appDetail.Directory, 118 }, nil 119 } 120 121 func (svc *argoCDService) Close() { 122 svc.dispose() 123 }