From deec79ad8d6bfc2a61363081a84cd2516277b20d Mon Sep 17 00:00:00 2001 From: "xin.li" Date: Sun, 4 Feb 2024 16:28:38 +0800 Subject: [PATCH] kubeadm: increase ut coverage for apiclient/idempotency Signed-off-by: xin.li --- .../app/util/apiclient/idempotency_test.go | 215 ++++++++++++++++++ 1 file changed, 215 insertions(+) diff --git a/cmd/kubeadm/app/util/apiclient/idempotency_test.go b/cmd/kubeadm/app/util/apiclient/idempotency_test.go index 9a9e3f18f641..fcabe22b1fc0 100644 --- a/cmd/kubeadm/app/util/apiclient/idempotency_test.go +++ b/cmd/kubeadm/app/util/apiclient/idempotency_test.go @@ -18,15 +18,18 @@ package apiclient import ( "context" + "reflect" "testing" "github.com/pkg/errors" v1 "k8s.io/api/core/v1" + rbac "k8s.io/api/rbac/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" + clientset "k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes/fake" core "k8s.io/client-go/testing" ) @@ -237,3 +240,215 @@ func TestMutateConfigMapWithConflict(t *testing.T) { t.Fatalf("ConfigMap mutation with conflict was invalid, has: %q", cm.Data["key"]) } } + +func TestGetConfigMapWithShortRetry(t *testing.T) { + type args struct { + client clientset.Interface + namespace string + name string + } + tests := []struct { + name string + args args + want *v1.ConfigMap + wantErr bool + }{ + { + name: "ConfigMap exists", + args: args{ + client: newMockClientForTest(t, "default", "foo", "ConfigMap"), + namespace: "default", + name: "foo", + }, + want: &v1.ConfigMap{ + TypeMeta: metav1.TypeMeta{ + Kind: configMapName, + APIVersion: "v1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Namespace: "default", + }, + }, + wantErr: false, + }, + { + name: "ConfigMap does not exist", + args: args{ + client: fake.NewSimpleClientset(), + namespace: "default", + name: "foo", + }, + want: nil, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := GetConfigMapWithShortRetry(tt.args.client, tt.args.namespace, tt.args.name) + if (err != nil) != tt.wantErr { + t.Errorf("GetConfigMapWithShortRetry() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("GetConfigMapWithShortRetry() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestCreateOrUpdateClusterRole(t *testing.T) { + testClusterRole := &rbac.ClusterRole{ + TypeMeta: metav1.TypeMeta{ + Kind: "ClusterRole", + APIVersion: "v1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + }, + } + + type args struct { + client clientset.Interface + clusterRole *rbac.ClusterRole + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "ClusterRole does not exist", + args: args{ + client: fake.NewSimpleClientset(), + clusterRole: testClusterRole, + }, + wantErr: false, + }, + { + name: "ClusterRole exists", + args: args{ + client: newMockClientForTest(t, "", "foo", "ClusterRole"), + clusterRole: testClusterRole, + }, + wantErr: false, + }, + { + name: "ClusterRole is invalid", + args: args{ + client: fake.NewSimpleClientset(), + clusterRole: nil, + }, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := CreateOrUpdateClusterRole(tt.args.client, tt.args.clusterRole); (err != nil) != tt.wantErr { + t.Errorf("CreateOrUpdateClusterRole() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func TestCreateOrUpdateClusterRoleBinding(t *testing.T) { + testClusterRoleBinding := &rbac.ClusterRoleBinding{ + TypeMeta: metav1.TypeMeta{ + Kind: "ClusterRoleBinding", + APIVersion: "v1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + }, + } + + type args struct { + client clientset.Interface + clusterRoleBinding *rbac.ClusterRoleBinding + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "ClusterRoleBinding does not exist", + args: args{ + client: fake.NewSimpleClientset(), + clusterRoleBinding: testClusterRoleBinding, + }, + wantErr: false, + }, + { + name: "ClusterRoleBinding exists", + args: args{ + client: newMockClientForTest(t, "", "foo", "ClusterRoleBinding"), + clusterRoleBinding: testClusterRoleBinding, + }, + wantErr: false, + }, + { + name: "ClusterRoleBinding is invalid", + args: args{ + client: fake.NewSimpleClientset(), + clusterRoleBinding: nil, + }, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := CreateOrUpdateClusterRoleBinding(tt.args.client, tt.args.clusterRoleBinding); (err != nil) != tt.wantErr { + t.Errorf("CreateOrUpdateClusterRoleBinding() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func newMockClientForTest(t *testing.T, namepsace string, name string, kind string) *fake.Clientset { + client := fake.NewSimpleClientset() + + switch kind { + case "ConfigMap": + _, err := client.CoreV1().ConfigMaps(namepsace).Create(context.Background(), &v1.ConfigMap{ + TypeMeta: metav1.TypeMeta{ + Kind: configMapName, + APIVersion: "v1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: namepsace, + }, + }, metav1.CreateOptions{}) + if err != nil { + t.Fatalf("error creating ConfigMap: %v", err) + } + case "ClusterRole": + _, err := client.RbacV1().ClusterRoles().Create(context.Background(), &rbac.ClusterRole{ + TypeMeta: metav1.TypeMeta{ + Kind: "ClusterRole", + APIVersion: "v1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + }, metav1.CreateOptions{}) + if err != nil { + t.Fatalf("error creating ClusterRole: %v", err) + } + case "ClusterRoleBinding": + _, err := client.RbacV1().ClusterRoleBindings().Create(context.Background(), &rbac.ClusterRoleBinding{ + TypeMeta: metav1.TypeMeta{ + Kind: "ClusterRoleBinding", + APIVersion: "v1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + }, metav1.CreateOptions{}) + if err != nil { + t.Fatalf("error creating ClusterRoleBinding: %v", err) + } + } + return client +}