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  }