Skip to content

Commit 0958b86

Browse files
committed
clusterauth: rewrite getOrCreate testing
Test all 3 cases: - token secret already exists -> we should not create another - token secret does not exists - error on secret creation. Since getOrCreateServiceAccountSecretToken does not actually look at the content of the token itself, we remove the part of the test related to this. Signed-off-by: Max Gautier <mg@max.gautier.name>
1 parent 3e14128 commit 0958b86

2 files changed

Lines changed: 53 additions & 34 deletions

File tree

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,6 @@ require (
9898
k8s.io/api v0.31.0
9999
k8s.io/apiextensions-apiserver v0.31.2
100100
k8s.io/apimachinery v0.31.0
101-
k8s.io/apiserver v0.31.0
102101
k8s.io/client-go v0.31.0
103102
k8s.io/code-generator v0.31.0
104103
k8s.io/klog/v2 v2.130.1
@@ -158,6 +157,7 @@ require (
158157
google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect
159158
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
160159
gopkg.in/retry.v1 v1.0.3 // indirect
160+
k8s.io/apiserver v0.31.0 // indirect
161161
k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70 // indirect
162162
k8s.io/klog v1.0.0 // indirect
163163
nhooyr.io/websocket v1.8.7 // indirect

util/clusterauth/clusterauth_test.go

Lines changed: 52 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package clusterauth
22

33
import (
44
"context"
5+
"errors"
56
"os"
67
"testing"
78
"time"
@@ -13,12 +14,11 @@ import (
1314
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1415
"k8s.io/apimachinery/pkg/runtime"
1516
"k8s.io/apimachinery/pkg/runtime/schema"
16-
"k8s.io/apiserver/pkg/storage/names"
1717
"k8s.io/client-go/kubernetes/fake"
1818
kubetesting "k8s.io/client-go/testing"
1919
"sigs.k8s.io/yaml"
2020

21-
"github.com/argoproj/argo-cd/v2/util/errors"
21+
argoerr "github.com/argoproj/argo-cd/v2/util/errors"
2222
)
2323

2424
const (
@@ -37,19 +37,19 @@ var testClaims = ServiceAccountClaims{
3737

3838
func newServiceAccount() *corev1.ServiceAccount {
3939
saBytes, err := os.ReadFile("./testdata/argocd-manager-sa.yaml")
40-
errors.CheckError(err)
40+
argoerr.CheckError(err)
4141
var sa corev1.ServiceAccount
4242
err = yaml.Unmarshal(saBytes, &sa)
43-
errors.CheckError(err)
43+
argoerr.CheckError(err)
4444
return &sa
4545
}
4646

4747
func newServiceAccountSecret() *corev1.Secret {
4848
secretBytes, err := os.ReadFile("./testdata/argocd-manager-sa-token.yaml")
49-
errors.CheckError(err)
49+
argoerr.CheckError(err)
5050
var secret corev1.Secret
5151
err = yaml.Unmarshal(secretBytes, &secret)
52-
errors.CheckError(err)
52+
argoerr.CheckError(err)
5353
return &secret
5454
}
5555

@@ -292,42 +292,61 @@ func Test_getOrCreateServiceAccountTokenSecret_NoSecretForSA(t *testing.T) {
292292
Name: "kube-system",
293293
},
294294
}
295-
saWithoutSecret := &corev1.ServiceAccount{
295+
sa := &corev1.ServiceAccount{
296296
ObjectMeta: metav1.ObjectMeta{
297297
Name: ArgoCDManagerServiceAccount,
298298
Namespace: ns.Name,
299299
},
300300
}
301-
cs := fake.NewClientset(ns, saWithoutSecret)
302-
cs.PrependReactor("create", "secrets",
303-
func(a kubetesting.Action) (handled bool, ret runtime.Object, err error) {
304-
s, ok := a.(kubetesting.CreateAction).GetObject().(*corev1.Secret)
305-
if !ok {
306-
return
307-
}
308-
309-
if s.Name == "" && s.GenerateName != "" {
310-
s.SetName(names.SimpleNameGenerator.GenerateName(s.GenerateName))
311-
}
312-
313-
s.Data = make(map[string][]byte)
314-
s.Data["token"] = []byte("fake-token")
315-
316-
return
317-
})
301+
manualSecret := &corev1.Secret{
302+
ObjectMeta: metav1.ObjectMeta{
303+
Name: ArgoCDManagerServiceAccount + SATokenSecretSuffix,
304+
Namespace: ns.Name,
305+
Annotations: map[string]string{
306+
corev1.ServiceAccountNameKey: sa.Name,
307+
},
308+
},
309+
Type: corev1.SecretTypeServiceAccountToken,
310+
}
318311

319-
got, err := getOrCreateServiceAccountTokenSecret(cs, ArgoCDManagerServiceAccount, ns.Name)
320-
require.NoError(t, err)
321-
assert.Equal(t, ArgoCDManagerServiceAccount+SATokenSecretSuffix, got)
312+
assertOnlyOneTokenExists := func(t *testing.T, cs *fake.Clientset) {
313+
got, err := getOrCreateServiceAccountTokenSecret(cs, ArgoCDManagerServiceAccount, ns.Name)
314+
require.NoError(t, err)
315+
assert.Equal(t, ArgoCDManagerServiceAccount+SATokenSecretSuffix, got)
322316

323-
obj, err := cs.Tracker().Get(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"},
324-
ns.Name, ArgoCDManagerServiceAccount)
325-
if err != nil {
326-
t.Errorf("ServiceAccount %s not found but was expected to be found: %s", ArgoCDManagerServiceAccount, err.Error())
317+
list, err := cs.Tracker().List(schema.GroupVersionResource{Version: "v1", Resource: "secrets"},
318+
schema.GroupVersionKind{Version: "v1", Kind: "Secret"}, ns.Name, metav1.ListOptions{})
319+
require.NoError(t, err)
320+
secretList, ok := list.(*corev1.SecretList)
321+
require.True(t, ok)
322+
assert.Len(t, secretList.Items, 1)
323+
obj, err := cs.Tracker().Get(schema.GroupVersionResource{Version: "v1", Resource: "serviceaccounts"},
324+
ns.Name, ArgoCDManagerServiceAccount)
325+
if err != nil {
326+
t.Errorf("ServiceAccount %s not found but was expected to be found: %s", ArgoCDManagerServiceAccount, err.Error())
327+
}
328+
329+
assert.Empty(t, obj.(*corev1.ServiceAccount).Secrets, 0)
327330
}
331+
t.Run("Token secret exists", func(t *testing.T) {
332+
cs := fake.NewClientset(ns, sa, manualSecret)
333+
assertOnlyOneTokenExists(t, cs)
334+
})
328335

329-
sa := obj.(*corev1.ServiceAccount)
330-
assert.Empty(t, sa.Secrets, 0)
336+
t.Run("Token secret does not exist", func(t *testing.T) {
337+
cs := fake.NewClientset(ns, sa)
338+
assertOnlyOneTokenExists(t, cs)
339+
})
340+
341+
t.Run("Error on secret creation", func(t *testing.T) {
342+
cs := fake.NewClientset(ns, sa)
343+
cs.PrependReactor("create", "secrets", func(kubetesting.Action) (handled bool, ret runtime.Object, err error) {
344+
return true, &corev1.Secret{}, errors.New("testing error case")
345+
})
346+
got, err := getOrCreateServiceAccountTokenSecret(cs, ArgoCDManagerServiceAccount, ns.Name)
347+
require.Error(t, err)
348+
assert.Empty(t, got)
349+
})
331350
}
332351

333352
func Test_getOrCreateServiceAccountTokenSecret_SAHasSecret(t *testing.T) {

0 commit comments

Comments
 (0)