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 }