package registration import ( "context" "net/http" "net/http/httptest" "strings" "testing" "github.com/stretchr/testify/assert" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/fake" "edge-infra.dev/pkg/edge/api/totp" edgeErrors "edge-infra.dev/pkg/edge/apis/errors" "edge-infra.dev/pkg/edge/constants/api/cluster" "edge-infra.dev/pkg/edge/info" ) var ( objNameIndexFunc = func(obj client.Object) []string { return []string{obj.GetName()} } ) func TestRegisterCluster(t *testing.T) { assert := assert.New(t) srv := httptest.NewServer(http.HandlerFunc(GraphQLHandler(assert))) reg, err := NewBuilder(). // cluster info Banner(testBanner). Store(testStore). ClusterEdgeID("test-cluster-edge-id"). ClusterType(cluster.DSDS). // bff info APIEndpoint(srv.URL). BSLOrganization(testOrganization). BSLUserPassword(testUser, testPassword). Fleet(fleetType). Build() if err != nil { t.Fatal(err) } scheme, err := GetRegistrationRuntime() assert.NoError(err, "fail to register scheme") cl := fake.NewClientBuilder().WithScheme(scheme).Build() ctx := context.Background() reg.Client = cl if _, err = reg.RegisterCluster(ctx); err != nil { t.Fatal(err) } if err = reg.BootstrapCluster(ctx); err != nil { t.Fatal(err) } } func TestCheckIfClusterInCleanState(t *testing.T) { assert := assert.New(t) srv := httptest.NewServer(http.HandlerFunc(GraphQLHandler(assert))) reg, err := NewBuilder(). // cluster info Banner(testBanner). Store(testStore). ClusterEdgeID("test-cluster-edge-id"). ClusterType(cluster.DSDS). // bff info APIEndpoint(srv.URL). BSLOrganization(testOrganization). BSLUserPassword(testUser, testPassword). Fleet(fleetType). Build() if err != nil { t.Fatal(err) } scheme, err := GetRegistrationRuntime() assert.NoError(err, "fail to register scheme") cl := fake.NewClientBuilder().WithScheme(scheme).WithIndex(&v1.ConfigMap{}, "metadata.name", objNameIndexFunc).WithIndex(&v1.Secret{}, "metadata.name", objNameIndexFunc).Build() ctx := context.Background() reg.Client = cl if _, err = reg.RegisterCluster(ctx); err != nil { t.Fatal(err) } err = cl.Create(ctx, &v1.ConfigMap{ObjectMeta: metav1.ObjectMeta{Name: info.EdgeConfigMapName, Namespace: info.EdgeConfigMapNS}, Data: map[string]string{"test": "test"}}) assert.NoError(err) err = reg.CheckIfClusterInCleanState(ctx) assert.Error(err) assert.Equal(err.Error(), "found config map edge-info in cluster") } func TestRegisterClusterWithTotpToken(t *testing.T) { assert := assert.New(t) totpSecret := "totp-secret" totpToken, err := totp.GenerateTotp(totpSecret) assert.NoError(err) srv := httptest.NewServer(http.HandlerFunc(GraphQLHandler(assert, WithTotpSecret(totpSecret)))) reg, err := NewBuilder(). // cluster info Banner(testBanner). Store(testStore). ClusterEdgeID("test-cluster-edge-id"). ClusterType(cluster.DSDS). // bff info APIEndpoint(srv.URL). BSLOrganization(testOrganization). TotpToken(totpToken.Code). Fleet(fleetType). Build() if err != nil { t.Fatal(err) } scheme, err := GetRegistrationRuntime() assert.NoError(err, "fail to register scheme") cl := fake.NewClientBuilder().WithScheme(scheme).WithIndex(&v1.ConfigMap{}, "metadata.name", objNameIndexFunc).WithIndex(&v1.Secret{}, "metadata.name", objNameIndexFunc).Build() ctx := context.Background() reg.Client = cl if _, err = reg.RegisterCluster(ctx); err != nil { t.Fatal(err) } if err = reg.BootstrapCluster(ctx); err != nil { t.Fatal(err) } } func TestRegisterExistingCluster(t *testing.T) { assert := assert.New(t) srv := httptest.NewServer(http.HandlerFunc(GraphQLHandler(assert, WithExistingCluster(testBanner)))) clusterEdgeID := "test-registration-id" reg, err := NewBuilder(). // cluster info Banner(testBanner). Store(testStore). ClusterEdgeID(clusterEdgeID). ClusterType(cluster.DSDS). // bff info APIEndpoint(srv.URL). BSLOrganization(testOrganization). BSLUserPassword(testUser, testPassword). Fleet(fleetType). Build() if err != nil { t.Fatal(err) } scheme, err := GetRegistrationRuntime() assert.NoError(err, "fail to register scheme") cl := fake.NewClientBuilder().WithScheme(scheme).WithIndex(&v1.ConfigMap{}, "metadata.name", objNameIndexFunc).WithIndex(&v1.Secret{}, "metadata.name", objNameIndexFunc).Build() ctx := context.Background() reg.Client = cl // Attempt to register cluster "again" to verify that a response // is still returned resp, err := reg.RegisterCluster(ctx) assert.True(strings.Contains(err.Error(), edgeErrors.ErrClusterAlreadyExists)) assert.NotNil(resp) assert.Equal(clusterEdgeID, resp.ClusterEdgeID) }