Skip to content

Commit 7c28606

Browse files
committed
Allow for more asynchronycity in the tests.
For example, secrets depend on mcio.projects. Eventually all the fields are set, so allow for that. 1. Wait for the project's spec.{clusterName,displayName} to be set 2. Allow for the secret/project tests to fail at first.
1 parent 5f83ccd commit 7c28606

File tree

1 file changed

+98
-10
lines changed

1 file changed

+98
-10
lines changed

pkg/sqlcache/integration_test.go

Lines changed: 98 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -540,6 +540,71 @@ func waitForObjectsBySchema(ctx context.Context, proxyStore *sqlproxy.Store, sch
540540
})
541541
}
542542

543+
// Do not call this if there are no projects -- the function will run until it times out.
544+
func waitForProjectsDisplayName(ctx context.Context, proxyStore *sqlproxy.Store, schema *types.APISchema) error {
545+
return wait.PollUntilContextCancel(ctx, time.Second*10, true, func(ctx context.Context) (done bool, err error) {
546+
req, err := http.NewRequest("GET", "http://localhost:8080", nil)
547+
if err != nil {
548+
return false, err
549+
}
550+
apiOp := &types.APIRequest{
551+
Request: req,
552+
}
553+
partitions := []partition.Partition{defaultPartition}
554+
list, total, _, err := proxyStore.ListByPartitions(apiOp, schema, partitions)
555+
if err != nil || total == 0 {
556+
// note that we don't return the error since that would stop the polling
557+
return false, nil
558+
}
559+
// Moving on, if there are errors return them
560+
for _, item := range list.Items {
561+
displayName, ok, err := unstructured.NestedFieldNoCopy(item.Object, "spec", "displayName")
562+
if !ok || displayName == "" || err != nil {
563+
if err == nil && ok {
564+
fmt.Printf("No displayName yet for mcio.project %q\n", item.GetName())
565+
}
566+
return false, err
567+
}
568+
clusterName, ok, err := unstructured.NestedFieldNoCopy(item.Object, "spec", "clusterName")
569+
if !ok || clusterName == "" || err != nil {
570+
if err == nil {
571+
fmt.Printf("No clusterName yet for mcio.project %q\n", item.GetName())
572+
}
573+
return false, err
574+
}
575+
}
576+
return true, nil
577+
})
578+
}
579+
580+
func waitForTransferredFields(ctx context.Context, proxyStore *sqlproxy.Store, schema *types.APISchema, labelTest string, expectedNum int, transferredFields ...string) error {
581+
if expectedNum == 0 {
582+
return nil
583+
}
584+
return wait.PollUntilContextCancel(ctx, time.Second*10, true, func(ctx context.Context) (done bool, err error) {
585+
q := "?filter="
586+
nextFilter := ""
587+
if labelTest != "" {
588+
q = fmt.Sprintf("?%s=%s", testFilter, labelTest)
589+
nextFilter = "&"
590+
}
591+
for _, s := range transferredFields {
592+
q += fmt.Sprintf(`%s%s!=""`, nextFilter, s)
593+
nextFilter = "&"
594+
}
595+
req, err := http.NewRequest("GET", "http://localhost:8080"+q, nil)
596+
if err != nil {
597+
return false, err
598+
}
599+
apiOp := &types.APIRequest{
600+
Request: req,
601+
}
602+
partitions := []partition.Partition{defaultPartition}
603+
_, total, _, err := proxyStore.ListByPartitions(apiOp, schema, partitions)
604+
return err == nil && total == expectedNum, err
605+
})
606+
}
607+
543608
type ResetFunc func(k8sschema.GroupVersionKind) error
544609

545610
func (f ResetFunc) Reset(gvk k8sschema.GroupVersionKind) error {
@@ -1131,6 +1196,8 @@ func (i *IntegrationSuite) TestNamespaceProjectDependencies() {
11311196
requireT.NoError(err)
11321197
err = waitForObjectsBySchema(ctx, proxyStore, nsSchema, labelTest, len(namespaceInfo))
11331198
requireT.NoError(err)
1199+
err = waitForProjectsDisplayName(ctx, proxyStore, mcioSchema)
1200+
requireT.NoError(err)
11341201

11351202
partitions := []partition.Partition{defaultPartition}
11361203
for _, test := range tests {
@@ -1211,12 +1278,14 @@ func (i *IntegrationSuite) TestSecretProjectDependencies() {
12111278
err = ctrl.Start(ctx)
12121279
requireT.NoError(err)
12131280
secretInfo := [][2]string{
1281+
// metadata.name, metadata.projects[management.cattle.io/project-scoped-secret]
12141282
{"morocco", "rabat"},
12151283
{"eritrea", "asmara"},
12161284
{"kenya", "nairobi"},
12171285
{"benin", "portonovo"},
12181286
}
12191287
projectInfo := [][3]string{
1288+
// metadata.name, spec.clusterName, spec.displayName
12201289
{"rabat", "arabic", "casablanca"},
12211290
{"asmara", "tigrinya", "keren"},
12221291
{"nairobi", "english", "mombasa"},
@@ -1305,8 +1374,24 @@ func (i *IntegrationSuite) TestSecretProjectDependencies() {
13051374
}
13061375

13071376
err = waitForObjectsBySchema(ctx, proxyStore, mcioSchema, labelTest, len(projectInfo))
1377+
if err != nil {
1378+
fmt.Printf("Error in secret/project tests: waitFor mico projects failed: %s\n", err)
1379+
}
13081380
requireT.NoError(err)
13091381
err = waitForObjectsBySchema(ctx, proxyStore, secretSchema, labelTest, len(secretInfo))
1382+
if err != nil {
1383+
fmt.Printf("Error in secret/project tests: waitFor secrets failed: %s\n", err)
1384+
}
1385+
requireT.NoError(err)
1386+
err = waitForProjectsDisplayName(ctx, proxyStore, mcioSchema)
1387+
if err != nil {
1388+
fmt.Printf("Error in secret/project tests: waitFor ProjectsDisplayName failed: %s\n", err)
1389+
}
1390+
requireT.NoError(err)
1391+
err = waitForTransferredFields(ctx, proxyStore, secretSchema, labelTest, len(secretInfo), "spec.clusterName", "spec.displayName")
1392+
if err != nil {
1393+
fmt.Printf("Error in secret/project tests: waitFor secrets transferred-fields failed: %s\n", err)
1394+
}
13101395
requireT.NoError(err)
13111396

13121397
partitions := []partition.Partition{defaultPartition}
@@ -1319,17 +1404,20 @@ func (i *IntegrationSuite) TestSecretProjectDependencies() {
13191404
apiOp := &types.APIRequest{
13201405
Request: req,
13211406
}
1407+
requireT.EventuallyWithT(func(c *assert.CollectT) {
1408+
1409+
got, total, continueToken, err := proxyStore.ListByPartitions(apiOp, secretSchema, partitions)
1410+
if err != nil {
1411+
require.NoError(c, err)
1412+
return
1413+
}
1414+
require.Equal(c, len(test.wantNames), total)
1415+
require.Equal(c, "", continueToken)
1416+
require.Equal(c, len(got.Items), len(test.wantNames))
1417+
gotNames := stringsFromULIst(got)
1418+
require.Equal(c, test.wantNames, gotNames)
1419+
}, 15*time.Second, 500*time.Millisecond)
13221420

1323-
got, total, continueToken, err := proxyStore.ListByPartitions(apiOp, secretSchema, partitions)
1324-
if err != nil {
1325-
i.Assert().NoError(err)
1326-
return
1327-
}
1328-
i.Assert().Equal(len(test.wantNames), total)
1329-
i.Assert().Equal("", continueToken)
1330-
i.Assert().Len(got.Items, len(test.wantNames))
1331-
gotNames := stringsFromULIst(got)
1332-
i.Assert().Equal(test.wantNames, gotNames)
13331421
})
13341422
}
13351423
}

0 commit comments

Comments
 (0)