//nolint:dupl package couchctl import ( "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "sigs.k8s.io/controller-runtime/pkg/client" "edge-infra.dev/pkg/edge/constants/api/cluster" "edge-infra.dev/pkg/edge/constants/api/fleet" dsapi "edge-infra.dev/pkg/edge/datasync/apis/v1alpha1" "edge-infra.dev/pkg/edge/datasync/couchdb" "edge-infra.dev/pkg/k8s/testing/kmp" "edge-infra.dev/test/f2" "edge-infra.dev/test/f2/x/ktest" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) func TestCouchReplicationReconciler(t *testing.T) { //nolint:dupl fin := f2.NewFeature("CouchReplicationReconciler"). WithLabel(_fleetType, fleet.Store). WithLabel(_clusterType, cluster.Generic, cluster.DSDS). Setup("CouchDBReplicationSet Created", func(ctx f2.Context, t *testing.T) f2.Context { k := ktest.FromContextT(ctx, t) k.WaitOn(t, k.ObjExists(couchDBServer)) require.NoError(t, client.IgnoreAlreadyExists(k.Client.Create(ctx, couchDBReplicationSet))) return ctx }). Test("CouchDBServer Ready", func(ctx f2.Context, t *testing.T) f2.Context { k := ktest.FromContextT(ctx, t) k.WaitOn(t, k.Check(couchDBServer, kmp.IsReady())) return ctx }). Test("CouchDBReplicationSet Successfully", func(ctx f2.Context, t *testing.T) f2.Context { k := ktest.FromContextT(ctx, t) k.WaitOn(t, k.Check(couchDBReplicationSet, kmp.IsReady())) return ctx }). Test("Couchdb Replication Doc Created", func(ctx f2.Context, t *testing.T) f2.Context { k := ktest.FromContextT(ctx, t) cc, err := couchdbServerClient(ctx, k.Client, couchDBServer) require.NoError(t, err) replDB := couchDBReplicationSet.Spec.Datasets[0].Name doc, err := cc.GetReplicationConfigDoc(ctx, replDB) require.NoError(t, err) source, err := sourceURL(ctx, k.Client, couchDBReplicationSet, replDB) require.NoError(t, err) target, err := targetURL(ctx, k.Client, couchDBServer, replDB, couchCtlConfig.CouchDBPort) require.NoError(t, err) assert.Equal(t, doc.ID, replDB) assert.NotEmpty(t, doc.Rev) assert.Equal(t, doc.Source, source, "server name: %s, repl: %s", couchDBServer.Name, couchDBReplicationSet.Name) assert.Equal(t, doc.Target, target) assert.True(t, doc.CreateTarget) assert.True(t, doc.Continuous) return ctx }). Test("Couchdb Replication DBs Created", func(ctx f2.Context, t *testing.T) f2.Context { k := ktest.FromContextT(ctx, t) cc, err := couchdbServerClient(ctx, k.Client, couchDBServer) require.NoError(t, err) replDB := couchDBReplicationSet.Spec.Datasets[0].Name replSet := &dsapi.ReplicationSet{} err = cc.GetReplicationSetDoc(ctx, replDB, replSet) require.NoError(t, err) for _, dataset := range replSet.Datasets { doc, err := cc.GetReplicationConfigDoc(ctx, dataset.Name) require.NoError(t, err) source, err := sourceURL(ctx, k.Client, couchDBReplicationSet, dataset.Name) require.NoError(t, err) target, err := targetURL(ctx, k.Client, couchDBServer, dataset.Name, couchCtlConfig.CouchDBPort) require.NoError(t, err) assert.Equal(t, doc.ID, dataset.Name) assert.NotEmpty(t, doc.Rev) assert.Equal(t, doc.Source, source, "server name: %s, repl: %s", couchDBServer.Name, couchDBReplicationSet.Name) assert.Equal(t, doc.Target, target, "server name: %s, repl: %s", couchDBServer.Name, couchDBReplicationSet.Name) assert.True(t, doc.CreateTarget) assert.True(t, doc.Continuous) } return ctx }). Feature() f.Test(t, fin) } func newCouchDBReplicationSet(name string, server *dsapi.CouchDBServer) *dsapi.CouchDBReplicationSet { dataset := dsapi.Dataset{ Name: couchCtlConfig.ReplicationDB(), Provider: &dsapi.Provider{ Name: "replication-user", }, Config: dsapi.ReplConfig{ Continuous: true, CreateTarget: true, DocIDs: []string{couchdb.ReplicationDocument}, }, } replicationRef := server.ReplicationCredentials() return &dsapi.CouchDBReplicationSet{ TypeMeta: metav1.TypeMeta{ APIVersion: dsapi.GroupVersion.String(), Kind: "CouchDBReplicationSet", }, ObjectMeta: metav1.ObjectMeta{ Name: name, Namespace: server.Namespace, }, Spec: dsapi.CouchDBReplicationSetSpec{ Source: replicationRef, Target: server.ServerRef(), Datasets: []dsapi.Dataset{dataset}, }, } }