1 package cloudtoedge
2
3 import (
4 "testing"
5
6 dsapi "edge-infra.dev/pkg/edge/datasync/apis/v1alpha1"
7 "edge-infra.dev/pkg/edge/datasync/couchdb"
8 "edge-infra.dev/pkg/k8s/testing/kmp"
9 "edge-infra.dev/test/f2"
10 "edge-infra.dev/test/f2/x/ktest"
11
12 "gotest.tools/v3/assert"
13 "gotest.tools/v3/assert/cmp"
14
15 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
16 "sigs.k8s.io/controller-runtime/pkg/client"
17 )
18
19
20 func TestCouchDBNewResources(t *testing.T) {
21 var k *ktest.K8s
22 var ref dsapi.ServerReference
23 var objs []client.Object
24 feature := f2.NewFeature("CouchDB New Resources Check").
25 Setup("Initial setup", func(ctx f2.Context, t *testing.T) f2.Context {
26 k = ktest.FromContextT(ctx, t)
27 servers := dsapi.CouchDBServerList{}
28 err := k.Client.List(ctx, &servers, client.MatchingLabels{
29 couchdb.NodeLeaderLabel: "true",
30 })
31 assert.NilError(t, err, "fail to list couchdb servers")
32 assert.Equal(t, len(servers.Items), 1, "number of couchdb servers not equal to 1")
33
34 ref = dsapi.ServerReference{
35 Name: servers.Items[0].Name,
36 Namespace: servers.Items[0].Namespace,
37 }
38 objs = couchResources(ref, ctx.RunID)
39 for _, obj := range objs {
40 assert.NilError(t, k.Client.Create(ctx, obj), "fail to create object")
41 }
42 return ctx
43 }).
44 Test("Verify CouchDBDatabase in ready state", func(ctx f2.Context, t *testing.T) f2.Context {
45 databases := dsapi.CouchDBDatabaseList{}
46 err := k.Client.List(ctx, &databases, client.InNamespace(couchNamespace))
47 assert.NilError(t, err, "fail to list couchdb databases")
48 assert.Check(t, cmp.Len(databases.Items, 1), "CouchDBDatabase should not be empty")
49
50 for _, database := range databases.Items {
51 db := database
52 k.WaitOn(t, k.Check(&db, kmp.IsReady()))
53 }
54 return ctx
55 }).
56 Test("Verify CouchDBIndex in ready state", func(ctx f2.Context, t *testing.T) f2.Context {
57 indices := dsapi.CouchDBIndexList{}
58 err := k.Client.List(ctx, &indices, client.InNamespace(couchNamespace))
59 assert.NilError(t, err, "fail to list couchdb indices")
60 assert.Check(t, cmp.Len(indices.Items, 1), "CouchDBIndex should not be empty")
61
62 for _, index := range indices.Items {
63 index := index
64 k.WaitOn(t, k.Check(&index, kmp.IsReady()))
65 }
66 return ctx
67 }).
68 Test("Verify CouchDBDesignDoc in ready state", func(ctx f2.Context, t *testing.T) f2.Context {
69 ddocs := dsapi.CouchDBDesignDocList{}
70 err := k.Client.List(ctx, &ddocs, client.InNamespace(couchNamespace))
71 assert.NilError(t, err, "fail to list couchdb design docs")
72 assert.Check(t, cmp.Len(ddocs.Items, 1), "CouchDBDesignDoc should not be empty")
73
74 for _, ddoc := range ddocs.Items {
75 ddoc := ddoc
76 k.WaitOn(t, k.Check(&ddoc, kmp.IsReady()))
77 }
78 return ctx
79 }).
80 Teardown("Clean up", func(ctx f2.Context, t *testing.T) f2.Context {
81 for _, obj := range objs {
82 assert.NilError(t, k.Client.Delete(ctx, obj), "fail to delete object")
83 }
84 return ctx
85 }).
86 Feature()
87 f.Test(t, feature)
88 }
89
90 func couchResources(ref dsapi.ServerReference, runID string) []client.Object {
91 var resources []client.Object
92 name := "test-" + runID
93 resources = append(resources, &dsapi.CouchDBDatabase{
94 TypeMeta: metav1.TypeMeta{
95 APIVersion: dsapi.GroupVersion.String(),
96 Kind: "CouchDBDatabase",
97 },
98 ObjectMeta: metav1.ObjectMeta{
99 Name: name,
100 Namespace: couchNamespace,
101 },
102 Spec: dsapi.CouchDBDatabaseSpec{
103 Name: name,
104 ServerRef: ref,
105 Security: dsapi.Security{
106 Admins: dsapi.NameRole{
107 Names: []string{"admin"},
108 Roles: []string{"admin"},
109 },
110 },
111 },
112 }, &dsapi.CouchDBIndex{
113 TypeMeta: metav1.TypeMeta{
114 APIVersion: dsapi.GroupVersion.String(),
115 Kind: "CouchDBIndex",
116 },
117 ObjectMeta: metav1.ObjectMeta{
118 Name: name,
119 Namespace: couchNamespace,
120 },
121 Spec: dsapi.CouchDBIndexSpec{
122 DB: name,
123 DDoc: "referenceId-index",
124 Index: dsapi.Index{
125 Fields: []string{"referenceId"},
126 },
127 },
128 }, &dsapi.CouchDBDesignDoc{
129 TypeMeta: metav1.TypeMeta{
130 APIVersion: dsapi.GroupVersion.String(),
131 Kind: "CouchDBDesignDoc",
132 },
133 ObjectMeta: metav1.ObjectMeta{
134 Name: name,
135 Namespace: couchNamespace,
136 },
137 Spec: dsapi.CouchDBDesignDocSpec{
138 DB: name,
139 ID: "package-identifier",
140 DesignDoc: dsapi.DesignDoc{
141 Views: map[string]map[string]string{
142 "by_package_value": {
143 "map": "function(doc) { if(doc.packageIdentifiers) { doc.packageIdentifiers.forEach(function(item) { if(item.value) emit([item.value],doc)});}}",
144 },
145 },
146 },
147 },
148 })
149 return resources
150 }
151
View as plain text