...

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

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

     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  // TestCouchDBAdditionalResource test resources not deployed as part of couchdb pallet
    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