github.com/argoproj/argo-cd/v3@v3.2.1/util/db/repository_test.go (about) 1 package db 2 3 import ( 4 "testing" 5 6 "github.com/stretchr/testify/assert" 7 "github.com/stretchr/testify/require" 8 corev1 "k8s.io/api/core/v1" 9 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 10 11 "github.com/argoproj/argo-cd/v3/common" 12 appsv1 "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" 13 "github.com/argoproj/argo-cd/v3/util/settings" 14 ) 15 16 var repoArgoCD = &corev1.Secret{ 17 ObjectMeta: metav1.ObjectMeta{ 18 Namespace: testNamespace, 19 Name: "some-repo-secret", 20 Annotations: map[string]string{ 21 common.AnnotationKeyManagedBy: common.AnnotationValueManagedByArgoCD, 22 }, 23 Labels: map[string]string{ 24 common.LabelKeySecretType: common.LabelValueSecretTypeRepository, 25 }, 26 }, 27 Data: map[string][]byte{ 28 "name": []byte("SomeRepo"), 29 "url": []byte("git@github.com:argoproj/argo-cd.git"), 30 "username": []byte("someUsername"), 31 "password": []byte("somePassword"), 32 "type": []byte("git"), 33 }, 34 } 35 36 var repoArgoProj = &corev1.Secret{ 37 ObjectMeta: metav1.ObjectMeta{ 38 Namespace: testNamespace, 39 Name: "some-other-repo-secret", 40 Annotations: map[string]string{ 41 common.AnnotationKeyManagedBy: common.AnnotationValueManagedByArgoCD, 42 }, 43 Labels: map[string]string{ 44 common.LabelKeySecretType: common.LabelValueSecretTypeRepository, 45 }, 46 }, 47 Data: map[string][]byte{ 48 "name": []byte("OtherRepo"), 49 "url": []byte("git@github.com:argoproj/argoproj.git"), 50 "username": []byte("someUsername"), 51 "password": []byte("somePassword"), 52 "type": []byte("git"), 53 }, 54 } 55 56 var repoArgoCDWrite = &corev1.Secret{ 57 ObjectMeta: metav1.ObjectMeta{ 58 Namespace: testNamespace, 59 Name: "some-repo-secret", 60 Annotations: map[string]string{ 61 common.AnnotationKeyManagedBy: common.AnnotationValueManagedByArgoCD, 62 }, 63 Labels: map[string]string{ 64 common.LabelKeySecretType: common.LabelValueSecretTypeRepositoryWrite, 65 }, 66 }, 67 Data: map[string][]byte{ 68 "name": []byte("SomeRepo"), 69 "url": []byte("git@github.com:argoproj/argo-cd.git"), 70 "username": []byte("someUsername"), 71 "password": []byte("somePassword"), 72 "type": []byte("git"), 73 }, 74 } 75 76 var repoArgoProjWrite = &corev1.Secret{ 77 ObjectMeta: metav1.ObjectMeta{ 78 Namespace: testNamespace, 79 Name: "some-other-repo-secret", 80 Annotations: map[string]string{ 81 common.AnnotationKeyManagedBy: common.AnnotationValueManagedByArgoCD, 82 }, 83 Labels: map[string]string{ 84 common.LabelKeySecretType: common.LabelValueSecretTypeRepositoryWrite, 85 }, 86 }, 87 Data: map[string][]byte{ 88 "name": []byte("OtherRepo"), 89 "url": []byte("git@github.com:argoproj/argoproj.git"), 90 "username": []byte("someUsername"), 91 "password": []byte("somePassword"), 92 "type": []byte("git"), 93 }, 94 } 95 96 func TestDb_CreateRepository(t *testing.T) { 97 clientset := getClientset() 98 settingsManager := settings.NewSettingsManager(t.Context(), clientset, testNamespace) 99 testee := &db{ 100 ns: testNamespace, 101 kubeclientset: clientset, 102 settingsMgr: settingsManager, 103 } 104 105 input := &appsv1.Repository{ 106 Name: "TestRepo", 107 Repo: "git@github.com:argoproj/argo-cd.git", 108 Username: "someUsername", 109 Password: "somePassword", 110 } 111 112 // The repository was indeed created successfully 113 output, err := testee.CreateRepository(t.Context(), input) 114 require.NoError(t, err) 115 assert.Same(t, input, output) 116 117 secret, err := clientset.CoreV1().Secrets(testNamespace).Get( 118 t.Context(), 119 RepoURLToSecretName(repoSecretPrefix, input.Repo, ""), 120 metav1.GetOptions{}, 121 ) 122 assert.NotNil(t, secret) 123 require.NoError(t, err) 124 } 125 126 func TestDb_GetRepository(t *testing.T) { 127 clientset := getClientset(repoArgoCD, repoArgoProj) 128 settingsManager := settings.NewSettingsManager(t.Context(), clientset, testNamespace) 129 testee := &db{ 130 ns: testNamespace, 131 kubeclientset: clientset, 132 settingsMgr: settingsManager, 133 } 134 135 repository, err := testee.GetRepository(t.Context(), "git@github.com:argoproj/argoproj.git", "") 136 require.NoError(t, err) 137 require.NotNil(t, repository) 138 assert.Equal(t, "OtherRepo", repository.Name) 139 140 repository, err = testee.GetRepository(t.Context(), "git@github.com:argoproj/argo-cd.git", "") 141 require.NoError(t, err) 142 require.NotNil(t, repository) 143 assert.Equal(t, "SomeRepo", repository.Name) 144 145 repository, err = testee.GetRepository(t.Context(), "git@github.com:argoproj/not-existing.git", "") 146 require.NoError(t, err) 147 assert.NotNil(t, repository) 148 assert.Equal(t, "git@github.com:argoproj/not-existing.git", repository.Repo) 149 } 150 151 func TestDb_GetWriteRepository(t *testing.T) { 152 clientset := getClientset(repoArgoCDWrite, repoArgoProjWrite) 153 settingsManager := settings.NewSettingsManager(t.Context(), clientset, testNamespace) 154 testee := &db{ 155 ns: testNamespace, 156 kubeclientset: clientset, 157 settingsMgr: settingsManager, 158 } 159 160 repository, err := testee.GetWriteRepository(t.Context(), "git@github.com:argoproj/argoproj.git", "") 161 require.NoError(t, err) 162 require.NotNil(t, repository) 163 assert.Equal(t, "OtherRepo", repository.Name) 164 165 repository, err = testee.GetWriteRepository(t.Context(), "git@github.com:argoproj/argo-cd.git", "") 166 require.NoError(t, err) 167 require.NotNil(t, repository) 168 assert.Equal(t, "SomeRepo", repository.Name) 169 } 170 171 func TestDb_GetWriteRepository_SecretNotFound_DefaultRepo(t *testing.T) { 172 clientset := getClientset(repoArgoCD) 173 settingsManager := settings.NewSettingsManager(t.Context(), clientset, testNamespace) 174 testee := &db{ 175 ns: testNamespace, 176 kubeclientset: clientset, 177 settingsMgr: settingsManager, 178 } 179 180 repository, err := testee.GetWriteRepository(t.Context(), "git@github.com:argoproj/argo-cd.git", "") 181 require.NoError(t, err) 182 require.NotNil(t, repository) 183 assert.Empty(t, repository.Name) 184 } 185 186 func TestDb_ListRepositories(t *testing.T) { 187 clientset := getClientset(repoArgoCD, repoArgoProj) 188 settingsManager := settings.NewSettingsManager(t.Context(), clientset, testNamespace) 189 testee := &db{ 190 ns: testNamespace, 191 kubeclientset: clientset, 192 settingsMgr: settingsManager, 193 } 194 195 repositories, err := testee.ListRepositories(t.Context()) 196 require.NoError(t, err) 197 assert.Len(t, repositories, 2) 198 } 199 200 func TestDb_UpdateRepository(t *testing.T) { 201 secretRepository := &appsv1.Repository{ 202 Name: "SomeRepo", 203 Repo: "git@github.com:argoproj/argo-cd.git", 204 Username: "someUsername", 205 Password: "somePassword", 206 Type: "git", 207 } 208 209 clientset := getClientset(repoArgoCD) 210 settingsManager := settings.NewSettingsManager(t.Context(), clientset, testNamespace) 211 testee := &db{ 212 ns: testNamespace, 213 kubeclientset: clientset, 214 settingsMgr: settingsManager, 215 } 216 217 secretRepository.Username = "UpdatedUsername" 218 repository, err := testee.UpdateRepository(t.Context(), secretRepository) 219 require.NoError(t, err) 220 assert.NotNil(t, repository) 221 assert.Same(t, secretRepository, repository) 222 223 secret, err := clientset.CoreV1().Secrets(testNamespace).Get( 224 t.Context(), 225 "some-repo-secret", 226 metav1.GetOptions{}, 227 ) 228 require.NoError(t, err) 229 assert.NotNil(t, secret) 230 assert.Equal(t, "UpdatedUsername", string(secret.Data["username"])) 231 } 232 233 func TestDb_DeleteRepository(t *testing.T) { 234 clientset := getClientset(repoArgoCD, repoArgoProj) 235 settingsManager := settings.NewSettingsManager(t.Context(), clientset, testNamespace) 236 testee := &db{ 237 ns: testNamespace, 238 kubeclientset: clientset, 239 settingsMgr: settingsManager, 240 } 241 242 err := testee.DeleteRepository(t.Context(), "git@github.com:argoproj/argoproj.git", "") 243 require.NoError(t, err) 244 245 err = testee.DeleteRepository(t.Context(), "git@github.com:argoproj/argo-cd.git", "") 246 require.NoError(t, err) 247 248 _, err = clientset.CoreV1().Secrets(testNamespace).Get(t.Context(), "some-repo-secret", metav1.GetOptions{}) 249 require.Error(t, err) 250 } 251 252 func TestDb_GetRepositoryCredentials(t *testing.T) { 253 gitHubRepoCredsSecret := &corev1.Secret{ 254 ObjectMeta: metav1.ObjectMeta{ 255 Namespace: testNamespace, 256 Name: "some-repocreds-secret", 257 Labels: map[string]string{ 258 common.LabelKeySecretType: common.LabelValueSecretTypeRepoCreds, 259 }, 260 }, 261 Data: map[string][]byte{ 262 "type": []byte("git"), 263 "url": []byte("git@github.com:argoproj"), 264 "username": []byte("someUsername"), 265 "password": []byte("somePassword"), 266 }, 267 } 268 gitLabRepoCredsSecret := &corev1.Secret{ 269 ObjectMeta: metav1.ObjectMeta{ 270 Namespace: testNamespace, 271 Name: "some-other-repocreds-secret", 272 Labels: map[string]string{ 273 common.LabelKeySecretType: common.LabelValueSecretTypeRepoCreds, 274 }, 275 }, 276 Data: map[string][]byte{ 277 "type": []byte("git"), 278 "url": []byte("git@gitlab.com"), 279 "username": []byte("someUsername"), 280 "password": []byte("somePassword"), 281 }, 282 } 283 284 clientset := getClientset(gitHubRepoCredsSecret, gitLabRepoCredsSecret) 285 testee := NewDB(testNamespace, settings.NewSettingsManager(t.Context(), clientset, testNamespace), clientset) 286 287 repoCreds, err := testee.GetRepositoryCredentials(t.Context(), "git@github.com:argoproj/argoproj.git") 288 require.NoError(t, err) 289 require.NotNil(t, repoCreds) 290 assert.Equal(t, "git@github.com:argoproj", repoCreds.URL) 291 292 repoCreds, err = testee.GetRepositoryCredentials(t.Context(), "git@gitlab.com:someorg/foobar.git") 293 require.NoError(t, err) 294 require.NotNil(t, repoCreds) 295 assert.Equal(t, "git@gitlab.com", repoCreds.URL) 296 297 repoCreds, err = testee.GetRepositoryCredentials(t.Context(), "git@github.com:example/not-existing.git") 298 require.NoError(t, err) 299 assert.Nil(t, repoCreds) 300 } 301 302 func TestRepoURLToSecretName(t *testing.T) { 303 tables := []struct { 304 repoURL string 305 secretName string 306 project string 307 }{{ 308 repoURL: "git://git@github.com:argoproj/ARGO-cd.git", 309 secretName: "repo-83273445", 310 project: "", 311 }, { 312 repoURL: "git://git@github.com:argoproj/ARGO-cd.git", 313 secretName: "repo-2733415816", 314 project: "foobar", 315 }, { 316 repoURL: "https://github.com/argoproj/ARGO-cd", 317 secretName: "repo-1890113693", 318 project: "", 319 }, { 320 repoURL: "https://github.com/argoproj/ARGO-cd", 321 secretName: "repo-4161185408", 322 project: "foobar", 323 }, { 324 repoURL: "https://github.com/argoproj/argo-cd", 325 secretName: "repo-42374749", 326 project: "", 327 }, { 328 repoURL: "https://github.com/argoproj/argo-cd", 329 secretName: "repo-1894545728", 330 project: "foobar", 331 }, { 332 repoURL: "https://github.com/argoproj/argo-cd.git", 333 secretName: "repo-821842295", 334 project: "", 335 }, { 336 repoURL: "https://github.com/argoproj/argo-cd.git", 337 secretName: "repo-1474166686", 338 project: "foobar", 339 }, { 340 repoURL: "https://github.com/argoproj/argo_cd.git", 341 secretName: "repo-1049844989", 342 project: "", 343 }, { 344 repoURL: "https://github.com/argoproj/argo_cd.git", 345 secretName: "repo-3916272608", 346 project: "foobar", 347 }, { 348 repoURL: "ssh://git@github.com/argoproj/argo-cd.git", 349 secretName: "repo-3569564120", 350 project: "", 351 }, { 352 repoURL: "ssh://git@github.com/argoproj/argo-cd.git", 353 secretName: "repo-754834421", 354 project: "foobar", 355 }} 356 357 for _, v := range tables { 358 sn := RepoURLToSecretName(repoSecretPrefix, v.repoURL, v.project) 359 assert.Equal(t, sn, v.secretName, "Expected secret name %q for repo %q; instead, got %q", v.secretName, v.repoURL, sn) 360 } 361 } 362 363 func Test_CredsURLToSecretName(t *testing.T) { 364 tables := map[string]string{ 365 "git://git@github.com:argoproj": "creds-2483499391", 366 "git://git@github.com:argoproj/": "creds-1465032944", 367 "git@github.com:argoproj": "creds-2666065091", 368 "git@github.com:argoproj/": "creds-346879876", 369 } 370 371 for k, v := range tables { 372 sn := RepoURLToSecretName(credSecretPrefix, k, "") 373 assert.Equal(t, sn, v, "Expected secret name %q for repo %q; instead, got %q", v, k, sn) 374 } 375 } 376 377 func Test_GetProjectRepositories(t *testing.T) { 378 repoSecretWithProject := &corev1.Secret{ 379 ObjectMeta: metav1.ObjectMeta{ 380 Namespace: testNamespace, 381 Name: "some-repo-secret", 382 Labels: map[string]string{ 383 common.LabelKeySecretType: common.LabelValueSecretTypeRepository, 384 }, 385 }, 386 Data: map[string][]byte{ 387 "type": []byte("git"), 388 "url": []byte("git@github.com:argoproj/argo-cd"), 389 "project": []byte("some-project"), 390 }, 391 } 392 393 repoSecretWithoutProject := &corev1.Secret{ 394 ObjectMeta: metav1.ObjectMeta{ 395 Namespace: testNamespace, 396 Name: "some-other-repo-secret", 397 Labels: map[string]string{ 398 common.LabelKeySecretType: common.LabelValueSecretTypeRepository, 399 }, 400 }, 401 Data: map[string][]byte{ 402 "type": []byte("git"), 403 "url": []byte("git@github.com:argoproj/argo-cd"), 404 }, 405 } 406 407 clientset := getClientset(repoSecretWithProject, repoSecretWithoutProject) 408 argoDB := NewDB(testNamespace, settings.NewSettingsManager(t.Context(), clientset, testNamespace), clientset) 409 410 repos, err := argoDB.GetProjectRepositories("some-project") 411 require.NoError(t, err) 412 assert.Len(t, repos, 1) 413 assert.Equal(t, "git@github.com:argoproj/argo-cd", repos[0].Repo) 414 }