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  }