...

Source file src/edge-infra.dev/test/e2e/datasync/cloudtoedge/e2e_test.go

Documentation: edge-infra.dev/test/e2e/datasync/cloudtoedge

     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  	//go:embed testdata/tlog.json
    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