...

Source file src/edge-infra.dev/pkg/edge/datasync/controllers/couchctl/replicationset_controller_test.go

Documentation: edge-infra.dev/pkg/edge/datasync/controllers/couchctl

     1  //nolint:dupl
     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) { //nolint:dupl
    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