1 package cloudtoedge
2
3 import (
4 "context"
5 _ "embed"
6 "fmt"
7 "os"
8 "testing"
9 "time"
10
11 "cloud.google.com/go/pubsub"
12
13 "edge-infra.dev/pkg/edge/bsl"
14 dsapi "edge-infra.dev/pkg/edge/datasync/apis/v1alpha1"
15 "edge-infra.dev/pkg/edge/info"
16 "edge-infra.dev/pkg/k8s/runtime/controller"
17 "edge-infra.dev/pkg/lib/fog"
18 "edge-infra.dev/test/f2"
19 "edge-infra.dev/test/f2/x/ktest"
20 "edge-infra.dev/test/f2/x/ktest/envtest"
21
22 corev1 "k8s.io/api/core/v1"
23 "k8s.io/apimachinery/pkg/runtime"
24 utilruntime "k8s.io/apimachinery/pkg/util/runtime"
25 clientgoscheme "k8s.io/client-go/kubernetes/scheme"
26 ctrl "sigs.k8s.io/controller-runtime"
27 "sigs.k8s.io/controller-runtime/pkg/client"
28 )
29
30 var (
31 f f2.Framework
32
33 bslInfo *bsl.BSLInfo
34 edgeInfo *info.EdgeInfo
35 nodes *corev1.NodeList
36 pubSubClient *pubsub.Client
37
38 couchNamespace = "data-sync-couchdb"
39 pubSubTopic = "data-sync-c2e"
40 dbName = "data-sync-e2e-tests"
41
42 defaultPort = 5984
43
44 timeoutMultiplier time.Duration = 10
45
46 portMapping = map[string]*ktest.PortForward{}
47
48
49 tlog []byte
50 )
51
52 func TestMain(m *testing.M) {
53 ctrl.SetLogger(fog.New().WithName("cloudtoedge_e2e_test"))
54
55 f = f2.New(context.Background(),
56 f2.WithExtensions(ktest.New(
57 ktest.WithCtrlManager(createManager),
58 ktest.WithEnvtestOptions(envtest.WithoutCRDs()),
59 ktest.SkipNamespaceCreation(),
60 ))).
61 WithLabel("dsds", "true")
62
63 f.Setup(func(ctx f2.Context) (f2.Context, error) {
64 k, err := ktest.FromContext(ctx)
65 if err != nil {
66 return ctx, err
67 }
68
69 edgeInfo, err = info.FromClient(ctx, k.Client)
70 if err != nil {
71 return ctx, fmt.Errorf("fail to get edge-info configmap: %w", err)
72 }
73
74 bslInfo, err = bsl.FromClient(ctx, k.Client)
75 if err != nil {
76 return ctx, fmt.Errorf("fail to get bsl-info configmap: %w", err)
77 }
78
79 pubSubClient, err = pubsub.NewClient(ctx, edgeInfo.ForemanProjectID)
80 if err != nil {
81 return ctx, fmt.Errorf("fail to create pub/sub client: %s: %w", edgeInfo.ForemanProjectID, err)
82 }
83
84 exists, err := pubSubClient.Topic(pubSubTopic).Exists(ctx)
85 if err != nil {
86 return ctx, fmt.Errorf("fail to check if topic exists: %w", err)
87 }
88 if !exists {
89 return ctx, fmt.Errorf("topic %s does not exist", pubSubTopic)
90 }
91
92 nodes = &corev1.NodeList{}
93 err = k.Client.List(ctx, nodes)
94 if err != nil {
95 return ctx, fmt.Errorf("fail to list nodes: %w", err)
96 }
97
98 couchdbPods := &corev1.PodList{}
99 err = k.Client.List(ctx, couchdbPods, client.InNamespace(couchNamespace),
100 client.MatchingLabels{"platform.edge.ncr.com/component": couchNamespace})
101 if err != nil {
102 return ctx, fmt.Errorf("fail to list couchdb pods: %w", err)
103 }
104
105 if len(nodes.Items) != len(couchdbPods.Items) {
106 return ctx, fmt.Errorf("number of couchdb pods not equal to number of nodes")
107 }
108
109 for _, couchdbPod := range couchdbPods.Items {
110 portForward := &ktest.PortForward{Namespace: couchNamespace}
111 err = portForward.ForwardPodCtx(ctx, couchdbPod.Name, defaultPort)
112 if err != nil {
113 return ctx, fmt.Errorf("fail to forward couchdb pod: %w", err)
114 }
115 portMapping[couchdbPod.Name] = portForward
116 }
117
118 return ctx, nil
119 }).Teardown(func(ctx f2.Context) (f2.Context, error) {
120 if pubSubClient == nil {
121 return ctx, nil
122 }
123 return ctx, pubSubClient.Close()
124 })
125 os.Exit(f.Run(m))
126 }
127
128 func createManager(opts ...controller.Option) (ctrl.Manager, error) {
129 mgrCfg, mgrOpts := controller.ProcessOptions(opts...)
130 mgrOpts.Scheme = createScheme()
131 return ctrl.NewManager(mgrCfg, mgrOpts)
132 }
133
134 func createScheme() *runtime.Scheme {
135 scheme := runtime.NewScheme()
136 utilruntime.Must(clientgoscheme.AddToScheme(scheme))
137 utilruntime.Must(dsapi.AddToScheme(scheme))
138 return scheme
139 }
140
View as plain text