From 1474463e813a10fe467aba4ec087249fa764dc83 Mon Sep 17 00:00:00 2001 From: Mohamed Awnallah Date: Mon, 23 Sep 2024 22:30:23 +0300 Subject: [PATCH] operator/pkg: test apiservice Signed-off-by: Mohamed Awnallah --- .../apiservice/apiservice_test.go | 397 ++++++++++++++++++ 1 file changed, 397 insertions(+) create mode 100644 operator/pkg/karmadaresource/apiservice/apiservice_test.go diff --git a/operator/pkg/karmadaresource/apiservice/apiservice_test.go b/operator/pkg/karmadaresource/apiservice/apiservice_test.go new file mode 100644 index 000000000..7a9273b9f --- /dev/null +++ b/operator/pkg/karmadaresource/apiservice/apiservice_test.go @@ -0,0 +1,397 @@ +/* +Copyright 2024 The Karmada Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package apiservice + +import ( + "encoding/base64" + "fmt" + "testing" + + corev1 "k8s.io/api/core/v1" + fakeclientset "k8s.io/client-go/kubernetes/fake" + coretesting "k8s.io/client-go/testing" + apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1" + fakeAggregator "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/fake" + + "github.com/karmada-io/karmada/operator/pkg/constants" + "github.com/karmada-io/karmada/operator/pkg/util" +) + +func TestEnsureAggregatedAPIService(t *testing.T) { + name, namespace := "karmada-demo", "test" + + // Base64 encoding of the dummy certificate data. + caTestData := "test-ca-data" + caBundle := base64.StdEncoding.EncodeToString([]byte(caTestData)) + + fakeAggregatorClient := fakeAggregator.NewSimpleClientset() + fakeClient := fakeclientset.NewSimpleClientset() + err := EnsureAggregatedAPIService( + fakeAggregatorClient, fakeClient, name, namespace, name, namespace, caBundle, + ) + if err != nil { + t.Fatalf("failed to ensure aggregated api service: %v", err) + } + + // Ensure the expected action (aggregated api service creation) occurred on the fake aggregator clientset. + actions := fakeAggregatorClient.Actions() + if len(actions) != 1 { + t.Fatalf("expected 1 action, but got %d", len(actions)) + } + + // Ensure the expected action (aggregated apiserver service creation) occurred on the fake clientset. + actions = fakeClient.Actions() + if len(actions) != 1 { + t.Fatalf("expected 1 action, but got %d", len(actions)) + } +} + +func TestAggregatedAPIService(t *testing.T) { + name, namespace := "karmada-demo", "test" + + // Base64 encoding of the dummy certificate data. + caTestData := "test-ca-data" + caBundle := base64.StdEncoding.EncodeToString([]byte(caTestData)) + + fakeClient := fakeAggregator.NewSimpleClientset() + err := aggregatedAPIService(fakeClient, name, namespace, caBundle) + if err != nil { + t.Fatalf("failed to create aggregated api service: %v", err) + } + + // Ensure the expected action (service creation) occurred. + actions := fakeClient.Actions() + if len(actions) != 1 { + t.Fatalf("expected 1 action, but got %d", len(actions)) + } + + // Validate the action is a CreateAction and it's for the correct resource (apiregistrationv1.APIService). + createAction, ok := actions[0].(coretesting.CreateAction) + if !ok { + t.Fatalf("expected CreateAction, but got %T", actions[0]) + } + + if createAction.GetResource().Resource != "apiservices" { + t.Fatalf("expected action on 'apiservices', but got '%s'", createAction.GetResource().Resource) + } + + // Validate the created apiregistrationv1.APIService object. + service := createAction.GetObject().(*apiregistrationv1.APIService) + expectedServiceName := util.KarmadaAggregatedAPIServerName(name) + if service.Spec.Service.Name != expectedServiceName { + t.Fatalf("expected service name '%s', but got '%s'", expectedServiceName, service.Name) + } + + if service.Spec.Service.Namespace != namespace { + t.Fatalf("expected service namespace '%s', but got '%s'", namespace, service.Namespace) + } + + if string(service.Spec.CABundle) != caTestData { + t.Fatalf("expected service caBundle %s, but got %s", caTestData, string(service.Spec.CABundle)) + } +} + +func TestAggregatedAPIServerService(t *testing.T) { + name, namespace := "karmada-demo", "test" + + fakeClient := fakeclientset.NewSimpleClientset() + err := aggregatedApiserverService(fakeClient, name, namespace, name, namespace) + if err != nil { + t.Fatalf("failed to create aggregated apiserver service: %v", err) + } + + // Ensure the expected action (service creation) occurred. + actions := fakeClient.Actions() + if len(actions) != 1 { + t.Fatalf("expected 1 action, but got %d", len(actions)) + } + + // Validate the action is a CreateAction and it's for the correct resource (Service). + createAction, ok := actions[0].(coretesting.CreateAction) + if !ok { + t.Fatalf("expected CreateAction, but got %T", actions[0]) + } + + if createAction.GetResource().Resource != "services" { + t.Fatalf("expected action on 'services', but got '%s'", createAction.GetResource().Resource) + } + + // Validate the created service object. + service := createAction.GetObject().(*corev1.Service) + expectedServiceName := util.KarmadaAggregatedAPIServerName(name) + if service.Name != expectedServiceName { + t.Fatalf("expected service name '%s', but got '%s'", expectedServiceName, service.Name) + } + + if service.Namespace != namespace { + t.Fatalf("expected service namespace '%s', but got '%s'", namespace, service.Namespace) + } + + serviceExternalNameExpected := fmt.Sprintf("%s.%s.svc", expectedServiceName, namespace) + if service.Spec.ExternalName != serviceExternalNameExpected { + t.Fatalf("expected service external name '%s', but got '%s'", serviceExternalNameExpected, service.Spec.ExternalName) + } +} + +func TestEnsureMetricsAdapterAPIService(t *testing.T) { + name, namespace := "karmada-demo", "test" + + // Base64 encoding of the dummy certificate data. + caTestData := "test-ca-data" + caBundle := base64.StdEncoding.EncodeToString([]byte(caTestData)) + + fakeAggregatorClient := fakeAggregator.NewSimpleClientset() + fakeClient := fakeclientset.NewSimpleClientset() + err := EnsureMetricsAdapterAPIService( + fakeAggregatorClient, fakeClient, name, namespace, name, namespace, caBundle, + ) + if err != nil { + t.Fatalf("failed to ensure metrics adapter api service: %v", err) + } + + // Ensure the expected action (metrics adapter api service creation) occurred on the fake aggregator clientset. + actions := fakeAggregatorClient.Actions() + if len(actions) != len(constants.KarmadaMetricsAdapterAPIServices) { + t.Fatalf("expected %d action, but got %d", len(constants.KarmadaMetricsAdapterAPIServices), len(actions)) + } + + // Ensure the expected action (metrics adapter service creation) occurred on the fake clientset. + actions = fakeClient.Actions() + if len(actions) != 1 { + t.Fatalf("expected 1 action, but got %d", len(actions)) + } +} + +func TestKarmadaMetricsAdapterAPIService(t *testing.T) { + name, namespace := "karmada-demo", "test" + + // Base64 encoding of the dummy certificate data. + caTestData := "test-ca-data" + caBundle := base64.StdEncoding.EncodeToString([]byte(caTestData)) + + fakeAggregatorClient := fakeAggregator.NewSimpleClientset() + err := karmadaMetricsAdapterAPIService(fakeAggregatorClient, name, namespace, caBundle) + if err != nil { + t.Fatalf("failed to create karmada metrics adapter api service: %v", err) + } + + // Ensure the expected actions (service creation) occurred. + actions := fakeAggregatorClient.Actions() + expectedActionsCount := len(constants.KarmadaMetricsAdapterAPIServices) + if len(actions) != expectedActionsCount { + t.Fatalf("expected %d actions, but got %d", expectedActionsCount, len(actions)) + } + + for i, action := range actions { + // Validate the action is a CreateAction and it's for the correct resource (Service). + createAction, ok := action.(coretesting.CreateAction) + if !ok { + t.Fatalf("expected CreateAction, but got %T", action) + } + + if createAction.GetResource().Resource != "apiservices" { + t.Fatalf("expected action on 'apiservices', but got '%s'", createAction.GetResource().Resource) + } + + // Validate the created apiregistrationv1.APIService object. + service := createAction.GetObject().(*apiregistrationv1.APIService) + karmadaMetricsAdapterGV := constants.KarmadaMetricsAdapterAPIServices[i] + apiServiceNameExpected := fmt.Sprintf("%s.%s", karmadaMetricsAdapterGV.Version, karmadaMetricsAdapterGV.Group) + if service.Name != apiServiceNameExpected { + t.Fatalf("expected APIService name %s, but got %s", apiServiceNameExpected, service.ObjectMeta.Name) + } + + if service.Spec.Service.Namespace != namespace { + t.Fatalf("expected APIService namespace %s, but got %s", namespace, service.Spec.Service.Namespace) + } + + if service.Spec.Group != karmadaMetricsAdapterGV.Group { + t.Fatalf("expected APIService group %s, but got %s", karmadaMetricsAdapterGV.Group, service.Spec.Group) + } + + if service.Spec.Version != karmadaMetricsAdapterGV.Version { + t.Fatalf("expected APIService version %s, but got %s", karmadaMetricsAdapterGV.Version, service.Spec.Version) + } + + serviceNameExpected := util.KarmadaMetricsAdapterName(name) + if service.Spec.Service.Name != serviceNameExpected { + t.Fatalf("expected APIService service name %s, but got %s", serviceNameExpected, service.Spec.Service.Name) + } + + if string(service.Spec.CABundle) != caTestData { + t.Fatalf("expected service CABundle %s, but got %s", caTestData, string(service.Spec.CABundle)) + } + } +} + +func TestKarmadaMetricsAdapterService(t *testing.T) { + name, namespace := "karmada-demo", "test" + + fakeClient := fakeclientset.NewSimpleClientset() + err := karmadaMetricsAdapterService(fakeClient, name, namespace, name, namespace) + if err != nil { + t.Fatalf("failed to create karmada metrics adapter service: %v", err) + } + + // Ensure the expected action (service creation) occurred. + actions := fakeClient.Actions() + if len(actions) != 1 { + t.Fatalf("expected 1 action, but got %d", len(actions)) + } + + // Validate the action is a CreateAction and it's for the correct resource (Service). + createAction, ok := actions[0].(coretesting.CreateAction) + if !ok { + t.Fatalf("expected CreateAction, but got %T", actions[0]) + } + + if createAction.GetResource().Resource != "services" { + t.Fatalf("expected action on 'services', but got '%s'", createAction.GetResource().Resource) + } + + // Validate the created service object. + service := createAction.GetObject().(*corev1.Service) + expectedServiceName := util.KarmadaMetricsAdapterName(name) + if service.Name != expectedServiceName { + t.Fatalf("expected service name '%s', but got '%s'", expectedServiceName, service.Name) + } + + if service.Namespace != namespace { + t.Fatalf("expected service namespace '%s', but got '%s'", namespace, service.Namespace) + } + + serviceExternalNameExpected := fmt.Sprintf("%s.%s.svc", expectedServiceName, namespace) + if service.Spec.ExternalName != serviceExternalNameExpected { + t.Fatalf("expected service external name '%s', but got '%s'", serviceExternalNameExpected, service.Spec.ExternalName) + } +} + +func TestEnsureSearchAPIService(t *testing.T) { + name, namespace := "karmada-demo", "test" + + // Base64 encoding of the dummy certificate data. + caTestData := "test-ca-data" + caBundle := base64.StdEncoding.EncodeToString([]byte(caTestData)) + + fakeAggregatorClient := fakeAggregator.NewSimpleClientset() + fakeClient := fakeclientset.NewSimpleClientset() + err := EnsureSearchAPIService( + fakeAggregatorClient, fakeClient, name, namespace, name, namespace, caBundle, + ) + if err != nil { + t.Fatalf("failed to ensure search api service service: %v", err) + } + + // Ensure the expected action (search api service creation) occurred on the fake aggregator clientset. + actions := fakeAggregatorClient.Actions() + if len(actions) != 1 { + t.Fatalf("expected %d action, but got %d", 1, len(actions)) + } + + // Ensure the expected action (search service creation) occurred on the fake clientset. + actions = fakeClient.Actions() + if len(actions) != 1 { + t.Fatalf("expected 1 action, but got %d", len(actions)) + } +} + +func TestKarmadaSearchAPIService(t *testing.T) { + name, namespace := "karmada-demo", "test" + + // Base64 encoding of the dummy certificate data. + caTestData := "test-ca-data" + caBundle := base64.StdEncoding.EncodeToString([]byte(caTestData)) + + fakeClient := fakeAggregator.NewSimpleClientset() + err := karmadaSearchAPIService(fakeClient, name, namespace, caBundle) + if err != nil { + t.Fatalf("failed to ensure metrics adapter api service: %v", err) + } + + // Ensure the expected action (apiservice creation) occurred. + actions := fakeClient.Actions() + if len(actions) != 1 { + t.Fatalf("expected 1 action, but got %d", len(actions)) + } + + // Validate the action is a CreateAction and it's for the correct resource (apiregistrationv1.APIService). + createAction, ok := actions[0].(coretesting.CreateAction) + if !ok { + t.Fatalf("expected CreateAction, but got %T", actions[0]) + } + + if createAction.GetResource().Resource != "apiservices" { + t.Fatalf("expected action on 'apiservices', but got '%s'", createAction.GetResource().Resource) + } + + // Validate the created service object. + service := createAction.GetObject().(*apiregistrationv1.APIService) + serviceNameExpected := util.KarmadaSearchAPIServerName(name) + if service.Spec.Service.Name != serviceNameExpected { + t.Fatalf("expected APIService name %s, but got %s", serviceNameExpected, service.Spec.Service.Name) + } + + if service.Spec.Service.Namespace != namespace { + t.Fatalf("expected APIService namespace %s, but got %s", namespace, service.Spec.Service.Namespace) + } + + if string(service.Spec.CABundle) != caTestData { + t.Fatalf("expected service CABundle %s, but got %s", caTestData, string(service.Spec.CABundle)) + } +} + +func TestKarmadaSearchService(t *testing.T) { + name, namespace := "karmada-demo", "test" + + fakeClient := fakeclientset.NewSimpleClientset() + err := karmadaSearchService(fakeClient, name, namespace, name, namespace) + if err != nil { + t.Fatalf("failed to create karmada search service: %v", err) + } + + // Ensure the expected action (service creation) occurred. + actions := fakeClient.Actions() + if len(actions) != 1 { + t.Fatalf("expected 1 action, but got %d", len(actions)) + } + + // Validate the action is a CreateAction and it's for the correct resource (Service). + createAction, ok := actions[0].(coretesting.CreateAction) + if !ok { + t.Fatalf("expected CreateAction, but got %T", actions[0]) + } + + if createAction.GetResource().Resource != "services" { + t.Fatalf("expected action on 'services', but got '%s'", createAction.GetResource().Resource) + } + + // Validate the created service object. + service := createAction.GetObject().(*corev1.Service) + serviceNameExpected := util.KarmadaSearchName(name) + if service.Name != serviceNameExpected { + t.Fatalf("expected service name '%s', but got '%s'", serviceNameExpected, service.Name) + } + + if service.Namespace != namespace { + t.Fatalf("expected service namespace %s, but got %s", namespace, service.Namespace) + } + + serviceExternalNameExpected := fmt.Sprintf("%s.%s.svc", util.KarmadaSearchName(name), namespace) + if service.Spec.ExternalName != serviceExternalNameExpected { + t.Fatalf("expected service external name '%s', but got '%s'", serviceExternalNameExpected, service.Spec.ExternalName) + } +}