github.com/argoproj/argo-cd/v3@v3.2.1/util/db/db.go (about)

     1  package db
     2  
     3  import (
     4  	"context"
     5  	"math"
     6  	"strings"
     7  
     8  	corev1 "k8s.io/api/core/v1"
     9  	apierrors "k8s.io/apimachinery/pkg/api/errors"
    10  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    11  	"k8s.io/client-go/kubernetes"
    12  
    13  	log "github.com/sirupsen/logrus"
    14  
    15  	"github.com/argoproj/argo-cd/v3/common"
    16  	appv1 "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1"
    17  	"github.com/argoproj/argo-cd/v3/util/env"
    18  	"github.com/argoproj/argo-cd/v3/util/settings"
    19  )
    20  
    21  // SecretMaperValidation determine whether the secret should be transformed(i.e. trailing CRLF characters trimmed)
    22  type SecretMaperValidation struct {
    23  	Dest      *string
    24  	Transform func(string) string
    25  }
    26  
    27  type ArgoDB interface {
    28  	// ListClusters lists configured clusters
    29  	ListClusters(ctx context.Context) (*appv1.ClusterList, error)
    30  	// CreateCluster creates a cluster
    31  	CreateCluster(ctx context.Context, c *appv1.Cluster) (*appv1.Cluster, error)
    32  	// WatchClusters allow watching for cluster informer
    33  	WatchClusters(ctx context.Context,
    34  		handleAddEvent func(cluster *appv1.Cluster),
    35  		handleModEvent func(oldCluster *appv1.Cluster, newCluster *appv1.Cluster),
    36  		handleDeleteEvent func(clusterServer string)) error
    37  	// GetCluster returns a cluster by given server url
    38  	GetCluster(ctx context.Context, server string) (*appv1.Cluster, error)
    39  	// GetClusterServersByName returns a cluster server urls by given cluster name
    40  	GetClusterServersByName(ctx context.Context, name string) ([]string, error)
    41  	// GetProjectClusters return project scoped clusters by given project name
    42  	GetProjectClusters(ctx context.Context, project string) ([]*appv1.Cluster, error)
    43  	// UpdateCluster updates a cluster
    44  	UpdateCluster(ctx context.Context, c *appv1.Cluster) (*appv1.Cluster, error)
    45  	// DeleteCluster deletes a cluster by name
    46  	DeleteCluster(ctx context.Context, server string) error
    47  
    48  	// ListRepositories lists repositories
    49  	ListRepositories(ctx context.Context) ([]*appv1.Repository, error)
    50  	// ListWriteRepositories lists repositories from write credentials
    51  	ListWriteRepositories(ctx context.Context) ([]*appv1.Repository, error)
    52  
    53  	// CreateRepository creates a repository
    54  	CreateRepository(ctx context.Context, r *appv1.Repository) (*appv1.Repository, error)
    55  	// GetRepository returns a repository by URL
    56  	GetRepository(ctx context.Context, url, project string) (*appv1.Repository, error)
    57  	// GetProjectRepositories returns project scoped repositories by given project name
    58  	GetProjectRepositories(project string) ([]*appv1.Repository, error)
    59  	// RepositoryExists returns whether a repository is configured for the given URL
    60  	RepositoryExists(ctx context.Context, repoURL, project string) (bool, error)
    61  	// UpdateRepository updates a repository
    62  	UpdateRepository(ctx context.Context, r *appv1.Repository) (*appv1.Repository, error)
    63  	// DeleteRepository deletes a repository from config
    64  	DeleteRepository(ctx context.Context, name, project string) error
    65  
    66  	// CreateWriteRepository creates a repository with write credentials
    67  	CreateWriteRepository(ctx context.Context, r *appv1.Repository) (*appv1.Repository, error)
    68  	// GetWriteRepository returns a repository by URL with write credentials
    69  	GetWriteRepository(ctx context.Context, url, project string) (*appv1.Repository, error)
    70  	// GetProjectWriteRepositories returns project scoped repositories from write credentials by given project name
    71  	GetProjectWriteRepositories(project string) ([]*appv1.Repository, error)
    72  	// WriteRepositoryExists returns whether a repository is configured for the given URL with write credentials
    73  	WriteRepositoryExists(ctx context.Context, repoURL, project string) (bool, error)
    74  	// UpdateWriteRepository updates a repository with write credentials
    75  	UpdateWriteRepository(ctx context.Context, r *appv1.Repository) (*appv1.Repository, error)
    76  	// DeleteWriteRepository deletes a repository from config with write credentials
    77  	DeleteWriteRepository(ctx context.Context, name, project string) error
    78  
    79  	// ListRepositoryCredentials list all repo credential sets URL patterns
    80  	ListRepositoryCredentials(ctx context.Context) ([]string, error)
    81  	// GetRepositoryCredentials gets repo credentials for given URL
    82  	GetRepositoryCredentials(ctx context.Context, name string) (*appv1.RepoCreds, error)
    83  	// CreateRepositoryCredentials creates a repository credential set
    84  	CreateRepositoryCredentials(ctx context.Context, r *appv1.RepoCreds) (*appv1.RepoCreds, error)
    85  	// UpdateRepositoryCredentials updates a repository credential set
    86  	UpdateRepositoryCredentials(ctx context.Context, r *appv1.RepoCreds) (*appv1.RepoCreds, error)
    87  	// DeleteRepositoryCredentials deletes a repository credential set from config
    88  	DeleteRepositoryCredentials(ctx context.Context, name string) error
    89  
    90  	// ListWriteRepositoryCredentials list all repo write credential sets URL patterns
    91  	ListWriteRepositoryCredentials(ctx context.Context) ([]string, error)
    92  	// GetWriteRepositoryCredentials gets repo write credentials for given URL
    93  	GetWriteRepositoryCredentials(ctx context.Context, name string) (*appv1.RepoCreds, error)
    94  	// CreateWriteRepositoryCredentials creates a repository write credential set
    95  	CreateWriteRepositoryCredentials(ctx context.Context, r *appv1.RepoCreds) (*appv1.RepoCreds, error)
    96  	// UpdateWriteRepositoryCredentials updates a repository write credential set
    97  	UpdateWriteRepositoryCredentials(ctx context.Context, r *appv1.RepoCreds) (*appv1.RepoCreds, error)
    98  	// DeleteWriteRepositoryCredentials deletes a repository write credential set from config
    99  	DeleteWriteRepositoryCredentials(ctx context.Context, name string) error
   100  
   101  	// ListRepoCertificates lists all configured certificates
   102  	ListRepoCertificates(ctx context.Context, selector *CertificateListSelector) (*appv1.RepositoryCertificateList, error)
   103  	// CreateRepoCertificate creates a new certificate entry
   104  	CreateRepoCertificate(ctx context.Context, certificate *appv1.RepositoryCertificateList, upsert bool) (*appv1.RepositoryCertificateList, error)
   105  	// RemoveRepoCertificates removes certificates based upon a selector
   106  	RemoveRepoCertificates(ctx context.Context, selector *CertificateListSelector) (*appv1.RepositoryCertificateList, error)
   107  	// GetAllHelmRepositoryCredentials gets all repo credentials
   108  	GetAllHelmRepositoryCredentials(ctx context.Context) ([]*appv1.RepoCreds, error)
   109  	// GetAllOCIRepositoryCredentials gets all repo credentials
   110  	GetAllOCIRepositoryCredentials(ctx context.Context) ([]*appv1.RepoCreds, error)
   111  
   112  	// ListHelmRepositories lists repositories
   113  	ListHelmRepositories(ctx context.Context) ([]*appv1.Repository, error)
   114  
   115  	// ListOCIRepositories lists repositories
   116  	ListOCIRepositories(ctx context.Context) ([]*appv1.Repository, error)
   117  
   118  	// ListConfiguredGPGPublicKeys returns all GPG public key IDs that are configured
   119  	ListConfiguredGPGPublicKeys(ctx context.Context) (map[string]*appv1.GnuPGPublicKey, error)
   120  	// AddGPGPublicKey adds one or more GPG public keys to the configuration
   121  	AddGPGPublicKey(ctx context.Context, keyData string) (map[string]*appv1.GnuPGPublicKey, []string, error)
   122  	// DeleteGPGPublicKey removes a GPG public key from the configuration
   123  	DeleteGPGPublicKey(ctx context.Context, keyID string) error
   124  
   125  	// GetApplicationControllerReplicas gets the replicas of application controller
   126  	GetApplicationControllerReplicas() int
   127  }
   128  
   129  type db struct {
   130  	ns            string
   131  	kubeclientset kubernetes.Interface
   132  	settingsMgr   *settings.SettingsManager
   133  }
   134  
   135  // NewDB returns a new instance of the argo database
   136  func NewDB(namespace string, settingsMgr *settings.SettingsManager, kubeclientset kubernetes.Interface) ArgoDB {
   137  	return &db{
   138  		settingsMgr:   settingsMgr,
   139  		ns:            namespace,
   140  		kubeclientset: kubeclientset,
   141  	}
   142  }
   143  
   144  func (db *db) getSecret(name string, cache map[string]*corev1.Secret) (*corev1.Secret, error) {
   145  	if _, ok := cache[name]; !ok {
   146  		secret, err := db.settingsMgr.GetSecretByName(name)
   147  		if err != nil {
   148  			return nil, err
   149  		}
   150  		cache[name] = secret
   151  	}
   152  	return cache[name], nil
   153  }
   154  
   155  // StripCRLFCharacter strips the trailing CRLF characters
   156  func StripCRLFCharacter(input string) string {
   157  	return strings.TrimSpace(input)
   158  }
   159  
   160  // GetApplicationControllerReplicas gets the replicas of application controller
   161  func (db *db) GetApplicationControllerReplicas() int {
   162  	// get the replicas from application controller deployment, if the application controller deployment does not exist, check for environment variable
   163  	applicationControllerName := env.StringFromEnv(common.EnvAppControllerName, common.DefaultApplicationControllerName)
   164  	appControllerDeployment, err := db.kubeclientset.AppsV1().Deployments(db.settingsMgr.GetNamespace()).Get(context.Background(), applicationControllerName, metav1.GetOptions{})
   165  	if err != nil {
   166  		appControllerDeployment = nil
   167  		if !apierrors.IsNotFound(err) {
   168  			log.Warnf("error retrieveing Argo CD controller deployment: %s", err)
   169  		}
   170  	}
   171  	if appControllerDeployment != nil && appControllerDeployment.Spec.Replicas != nil {
   172  		return int(*appControllerDeployment.Spec.Replicas)
   173  	}
   174  	return env.ParseNumFromEnv(common.EnvControllerReplicas, 0, 0, math.MaxInt32)
   175  }