github.com/argoproj/argo-cd/v3@v3.2.1/controller/clusterinfoupdater_test.go (about) 1 package controller 2 3 import ( 4 "context" 5 "errors" 6 "fmt" 7 "testing" 8 "time" 9 10 corev1 "k8s.io/api/core/v1" 11 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 12 13 "github.com/argoproj/argo-cd/v3/common" 14 15 "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" 16 appsfake "github.com/argoproj/argo-cd/v3/pkg/client/clientset/versioned/fake" 17 appinformers "github.com/argoproj/argo-cd/v3/pkg/client/informers/externalversions/application/v1alpha1" 18 applisters "github.com/argoproj/argo-cd/v3/pkg/client/listers/application/v1alpha1" 19 cacheutil "github.com/argoproj/argo-cd/v3/util/cache" 20 "github.com/argoproj/argo-cd/v3/util/cache/appstate" 21 "github.com/argoproj/argo-cd/v3/util/db" 22 "github.com/argoproj/argo-cd/v3/util/settings" 23 24 clustercache "github.com/argoproj/gitops-engine/pkg/cache" 25 "github.com/stretchr/testify/assert" 26 "github.com/stretchr/testify/require" 27 "k8s.io/client-go/kubernetes/fake" 28 "k8s.io/client-go/tools/cache" 29 ) 30 31 // Expect cluster cache update is persisted in cluster secret 32 func TestClusterSecretUpdater(t *testing.T) { 33 const fakeNamespace = "fake-ns" 34 const updatedK8sVersion = "1.0" 35 now := time.Now() 36 37 tests := []struct { 38 LastCacheSyncTime *time.Time 39 SyncError error 40 ExpectedStatus v1alpha1.ConnectionStatus 41 }{ 42 {nil, nil, v1alpha1.ConnectionStatusUnknown}, 43 {&now, nil, v1alpha1.ConnectionStatusSuccessful}, 44 {&now, errors.New("sync failed"), v1alpha1.ConnectionStatusFailed}, 45 } 46 47 emptyArgoCDConfigMap := &corev1.ConfigMap{ 48 ObjectMeta: metav1.ObjectMeta{ 49 Name: common.ArgoCDConfigMapName, 50 Namespace: fakeNamespace, 51 Labels: map[string]string{ 52 "app.kubernetes.io/part-of": "argocd", 53 }, 54 }, 55 Data: map[string]string{}, 56 } 57 argoCDSecret := &corev1.Secret{ 58 ObjectMeta: metav1.ObjectMeta{ 59 Name: common.ArgoCDSecretName, 60 Namespace: fakeNamespace, 61 Labels: map[string]string{ 62 "app.kubernetes.io/part-of": "argocd", 63 }, 64 }, 65 Data: map[string][]byte{ 66 "admin.password": nil, 67 "server.secretkey": nil, 68 }, 69 } 70 kubeclientset := fake.NewClientset(emptyArgoCDConfigMap, argoCDSecret) 71 appclientset := appsfake.NewSimpleClientset() 72 appInformer := appinformers.NewApplicationInformer(appclientset, "", time.Minute, cache.Indexers{}) 73 settingsManager := settings.NewSettingsManager(t.Context(), kubeclientset, fakeNamespace) 74 argoDB := db.NewDB(fakeNamespace, settingsManager, kubeclientset) 75 ctx, cancel := context.WithCancel(t.Context()) 76 defer cancel() 77 78 appCache := appstate.NewCache(cacheutil.NewCache(cacheutil.NewInMemoryCache(time.Minute)), time.Minute) 79 cluster, err := argoDB.CreateCluster(ctx, &v1alpha1.Cluster{Server: "http://minikube"}) 80 require.NoError(t, err, "Test prepare test data create cluster failed") 81 82 for _, test := range tests { 83 info := &clustercache.ClusterInfo{ 84 Server: cluster.Server, 85 K8SVersion: updatedK8sVersion, 86 LastCacheSyncTime: test.LastCacheSyncTime, 87 SyncError: test.SyncError, 88 } 89 90 lister := applisters.NewApplicationLister(appInformer.GetIndexer()).Applications(fakeNamespace) 91 updater := NewClusterInfoUpdater(nil, argoDB, lister, appCache, nil, nil, fakeNamespace) 92 93 err = updater.updateClusterInfo(t.Context(), *cluster, info) 94 require.NoError(t, err, "Invoking updateClusterInfo failed.") 95 96 var clusterInfo v1alpha1.ClusterInfo 97 err = appCache.GetClusterInfo(cluster.Server, &clusterInfo) 98 require.NoError(t, err) 99 assert.Equal(t, updatedK8sVersion, clusterInfo.ServerVersion) 100 assert.Equal(t, test.ExpectedStatus, clusterInfo.ConnectionState.Status) 101 } 102 } 103 104 func TestUpdateClusterLabels(t *testing.T) { 105 shouldNotBeInvoked := func(_ context.Context, _ *v1alpha1.Cluster) (*v1alpha1.Cluster, error) { 106 shouldNotHappen := errors.New("if an error happens here, something's wrong") 107 require.NoError(t, shouldNotHappen) 108 return nil, shouldNotHappen 109 } 110 tests := []struct { 111 name string 112 clusterInfo *clustercache.ClusterInfo 113 cluster v1alpha1.Cluster 114 updateCluster func(context.Context, *v1alpha1.Cluster) (*v1alpha1.Cluster, error) 115 wantErr assert.ErrorAssertionFunc 116 }{ 117 { 118 "enableClusterInfoLabels = false", 119 &clustercache.ClusterInfo{ 120 Server: "kubernetes.svc.local", 121 K8SVersion: "1.28", 122 }, 123 v1alpha1.Cluster{ 124 Server: "kubernetes.svc.local", 125 Labels: nil, 126 }, 127 shouldNotBeInvoked, 128 assert.NoError, 129 }, 130 { 131 "clusterInfo = nil", 132 nil, 133 v1alpha1.Cluster{ 134 Server: "kubernetes.svc.local", 135 Labels: map[string]string{"argocd.argoproj.io/auto-label-cluster-info": "true"}, 136 }, 137 shouldNotBeInvoked, 138 assert.NoError, 139 }, 140 { 141 "clusterInfo.k8sversion == cluster k8s label", 142 &clustercache.ClusterInfo{ 143 Server: "kubernetes.svc.local", 144 K8SVersion: "1.28", 145 }, 146 v1alpha1.Cluster{ 147 Server: "kubernetes.svc.local", 148 Labels: map[string]string{"argocd.argoproj.io/kubernetes-version": "1.28", "argocd.argoproj.io/auto-label-cluster-info": "true"}, 149 }, 150 shouldNotBeInvoked, 151 assert.NoError, 152 }, 153 { 154 "clusterInfo.k8sversion != cluster k8s label, no error", 155 &clustercache.ClusterInfo{ 156 Server: "kubernetes.svc.local", 157 K8SVersion: "1.28", 158 }, 159 v1alpha1.Cluster{ 160 Server: "kubernetes.svc.local", 161 Labels: map[string]string{"argocd.argoproj.io/kubernetes-version": "1.27", "argocd.argoproj.io/auto-label-cluster-info": "true"}, 162 }, 163 func(_ context.Context, cluster *v1alpha1.Cluster) (*v1alpha1.Cluster, error) { 164 assert.Equal(t, "1.28", cluster.Labels["argocd.argoproj.io/kubernetes-version"]) 165 return nil, nil 166 }, 167 assert.NoError, 168 }, 169 { 170 "clusterInfo.k8sversion != cluster k8s label, some error", 171 &clustercache.ClusterInfo{ 172 Server: "kubernetes.svc.local", 173 K8SVersion: "1.28", 174 }, 175 v1alpha1.Cluster{ 176 Server: "kubernetes.svc.local", 177 Labels: map[string]string{"argocd.argoproj.io/kubernetes-version": "1.27", "argocd.argoproj.io/auto-label-cluster-info": "true"}, 178 }, 179 func(_ context.Context, cluster *v1alpha1.Cluster) (*v1alpha1.Cluster, error) { 180 assert.Equal(t, "1.28", cluster.Labels["argocd.argoproj.io/kubernetes-version"]) 181 return nil, errors.New("some error happened while saving") 182 }, 183 assert.Error, 184 }, 185 } 186 for _, tt := range tests { 187 t.Run(tt.name, func(t *testing.T) { 188 tt.wantErr(t, updateClusterLabels(t.Context(), tt.clusterInfo, tt.cluster, tt.updateCluster), fmt.Sprintf("updateClusterLabels(%v, %v, %v)", t.Context(), tt.clusterInfo, tt.cluster)) 189 }) 190 } 191 }