diff --git a/cmd/manager/main.go b/cmd/manager/main.go index b775c7f95e..053ca67e01 100644 --- a/cmd/manager/main.go +++ b/cmd/manager/main.go @@ -148,7 +148,7 @@ func main() { os.Exit(1) } - if err := mcs.Register(discovery.NewDiscoveryClientForConfigOrDie(config)); err != nil { + if err := mcs.Register(discovery.NewDiscoveryClientForConfigOrDie(config), setupLog); err != nil { setupLog.Error(err, "failed to register multicluster service") os.Exit(1) } diff --git a/pkg/mcs/register.go b/pkg/mcs/register.go index 402ae7886b..6a947436dd 100644 --- a/pkg/mcs/register.go +++ b/pkg/mcs/register.go @@ -1,7 +1,7 @@ package mcs import ( - "github.com/pkg/errors" + "github.com/go-logr/logr" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" @@ -33,10 +33,14 @@ func addKnownTypes(scheme *runtime.Scheme) error { return nil } -func Register(dc *discovery.DiscoveryClient) error { +func Register(dc *discovery.DiscoveryClient, log logr.Logger) error { resources, err := dc.ServerPreferredResources() if err != nil { - return errors.Wrap(err, "get api groups and resources") + // MCS is optional functionality - if discovery fails for any reason, + // mark it as unavailable and continue without crashing the operator + available = false + log.Info("Multi-cluster services (MCS) are not available: failed to discover API resources", "error", err) + return nil } outer: @@ -53,6 +57,7 @@ outer: if MCSSchemeGroupVersion.Group == "" { available = false + log.Info("Multi-cluster services (MCS) are not available: ServiceExport resource not found in cluster") return nil } diff --git a/pkg/mcs/register_test.go b/pkg/mcs/register_test.go new file mode 100644 index 0000000000..3628d84f40 --- /dev/null +++ b/pkg/mcs/register_test.go @@ -0,0 +1,60 @@ +package mcs + +import ( + "testing" +) + +func TestIsAvailable(t *testing.T) { + // Test IsAvailable function + available = true + if !IsAvailable() { + t.Error("Expected IsAvailable to return true when available is true") + } + + available = false + if IsAvailable() { + t.Error("Expected IsAvailable to return false when available is false") + } +} + +func TestMCSSchemeGroupVersion(t *testing.T) { + // Test that MCSSchemeGroupVersion is initialized correctly + if MCSSchemeGroupVersion.Group != "" { + t.Errorf("Expected MCSSchemeGroupVersion.Group to be empty initially, got: %s", MCSSchemeGroupVersion.Group) + } + if MCSSchemeGroupVersion.Version != "" { + t.Errorf("Expected MCSSchemeGroupVersion.Version to be empty initially, got: %s", MCSSchemeGroupVersion.Version) + } +} + +func TestServiceExport(t *testing.T) { + // Test ServiceExport creation + namespace := "test-namespace" + name := "test-service" + labels := map[string]string{ + "app": "test", + } + + se := ServiceExport(namespace, name, labels) + + if se.Name != name { + t.Errorf("Expected ServiceExport name to be %s, got: %s", name, se.Name) + } + + if se.Namespace != namespace { + t.Errorf("Expected ServiceExport namespace to be %s, got: %s", namespace, se.Namespace) + } + + if se.Labels["app"] != "test" { + t.Errorf("Expected ServiceExport label 'app' to be 'test', got: %s", se.Labels["app"]) + } +} + +func TestServiceExportList(t *testing.T) { + // Test ServiceExportList creation + seList := ServiceExportList() + + if seList.Kind != "ServiceExportList" { + t.Errorf("Expected ServiceExportList Kind to be 'ServiceExportList', got: %s", seList.Kind) + } +}