1
2 package couchctl
3
4 import (
5 "testing"
6
7 "github.com/stretchr/testify/assert"
8 "github.com/stretchr/testify/require"
9 "sigs.k8s.io/controller-runtime/pkg/client"
10
11 "edge-infra.dev/pkg/edge/constants/api/cluster"
12 "edge-infra.dev/pkg/edge/constants/api/fleet"
13 dsapi "edge-infra.dev/pkg/edge/datasync/apis/v1alpha1"
14 "edge-infra.dev/pkg/edge/datasync/couchdb"
15 "edge-infra.dev/pkg/k8s/testing/kmp"
16 "edge-infra.dev/test/f2"
17 "edge-infra.dev/test/f2/x/ktest"
18
19 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
20 )
21
22 func TestCouchReplicationReconciler(t *testing.T) {
23 fin := f2.NewFeature("CouchReplicationReconciler").
24 WithLabel(_fleetType, fleet.Store).
25 WithLabel(_clusterType, cluster.Generic, cluster.DSDS).
26 Setup("CouchDBReplicationSet Created", func(ctx f2.Context, t *testing.T) f2.Context {
27 k := ktest.FromContextT(ctx, t)
28
29 k.WaitOn(t, k.ObjExists(couchDBServer))
30
31 require.NoError(t, client.IgnoreAlreadyExists(k.Client.Create(ctx, couchDBReplicationSet)))
32 return ctx
33 }).
34 Test("CouchDBServer Ready", func(ctx f2.Context, t *testing.T) f2.Context {
35 k := ktest.FromContextT(ctx, t)
36 k.WaitOn(t, k.Check(couchDBServer, kmp.IsReady()))
37 return ctx
38 }).
39 Test("CouchDBReplicationSet Successfully", func(ctx f2.Context, t *testing.T) f2.Context {
40 k := ktest.FromContextT(ctx, t)
41 k.WaitOn(t, k.Check(couchDBReplicationSet, kmp.IsReady()))
42 return ctx
43 }).
44 Test("Couchdb Replication Doc Created", func(ctx f2.Context, t *testing.T) f2.Context {
45 k := ktest.FromContextT(ctx, t)
46
47 cc, err := couchdbServerClient(ctx, k.Client, couchDBServer)
48 require.NoError(t, err)
49
50 replDB := couchDBReplicationSet.Spec.Datasets[0].Name
51 doc, err := cc.GetReplicationConfigDoc(ctx, replDB)
52 require.NoError(t, err)
53
54 source, err := sourceURL(ctx, k.Client, couchDBReplicationSet, replDB)
55 require.NoError(t, err)
56
57 target, err := targetURL(ctx, k.Client, couchDBServer, replDB, couchCtlConfig.CouchDBPort)
58 require.NoError(t, err)
59
60 assert.Equal(t, doc.ID, replDB)
61 assert.NotEmpty(t, doc.Rev)
62 assert.Equal(t, doc.Source, source, "server name: %s, repl: %s", couchDBServer.Name, couchDBReplicationSet.Name)
63 assert.Equal(t, doc.Target, target)
64 assert.True(t, doc.CreateTarget)
65 assert.True(t, doc.Continuous)
66 return ctx
67 }).
68 Test("Couchdb Replication DBs Created", func(ctx f2.Context, t *testing.T) f2.Context {
69 k := ktest.FromContextT(ctx, t)
70
71 cc, err := couchdbServerClient(ctx, k.Client, couchDBServer)
72 require.NoError(t, err)
73
74 replDB := couchDBReplicationSet.Spec.Datasets[0].Name
75
76 replSet := &dsapi.ReplicationSet{}
77 err = cc.GetReplicationSetDoc(ctx, replDB, replSet)
78 require.NoError(t, err)
79
80 for _, dataset := range replSet.Datasets {
81 doc, err := cc.GetReplicationConfigDoc(ctx, dataset.Name)
82 require.NoError(t, err)
83
84 source, err := sourceURL(ctx, k.Client, couchDBReplicationSet, dataset.Name)
85 require.NoError(t, err)
86
87 target, err := targetURL(ctx, k.Client, couchDBServer, dataset.Name, couchCtlConfig.CouchDBPort)
88 require.NoError(t, err)
89
90 assert.Equal(t, doc.ID, dataset.Name)
91 assert.NotEmpty(t, doc.Rev)
92 assert.Equal(t, doc.Source, source, "server name: %s, repl: %s", couchDBServer.Name, couchDBReplicationSet.Name)
93 assert.Equal(t, doc.Target, target, "server name: %s, repl: %s", couchDBServer.Name, couchDBReplicationSet.Name)
94 assert.True(t, doc.CreateTarget)
95 assert.True(t, doc.Continuous)
96 }
97 return ctx
98 }).
99 Feature()
100
101 f.Test(t, fin)
102 }
103
104 func newCouchDBReplicationSet(name string, server *dsapi.CouchDBServer) *dsapi.CouchDBReplicationSet {
105 dataset := dsapi.Dataset{
106 Name: couchCtlConfig.ReplicationDB(),
107 Provider: &dsapi.Provider{
108 Name: "replication-user",
109 },
110 Config: dsapi.ReplConfig{
111 Continuous: true,
112 CreateTarget: true,
113 DocIDs: []string{couchdb.ReplicationDocument},
114 },
115 }
116 replicationRef := server.ReplicationCredentials()
117 return &dsapi.CouchDBReplicationSet{
118 TypeMeta: metav1.TypeMeta{
119 APIVersion: dsapi.GroupVersion.String(),
120 Kind: "CouchDBReplicationSet",
121 },
122 ObjectMeta: metav1.ObjectMeta{
123 Name: name,
124 Namespace: server.Namespace,
125 },
126 Spec: dsapi.CouchDBReplicationSetSpec{
127 Source: replicationRef,
128 Target: server.ServerRef(),
129 Datasets: []dsapi.Dataset{dataset},
130 },
131 }
132 }
133
View as plain text