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  }