Skip to content
This repository was archived by the owner on Dec 6, 2024. It is now read-only.

Commit a52ab3a

Browse files
committed
test: add e2e scaffolding
Signed-off-by: Mateusz Urbanek <[email protected]>
1 parent a56c8d1 commit a52ab3a

File tree

10 files changed

+909
-0
lines changed

10 files changed

+909
-0
lines changed

Diff for: test/e2e/assesments/cosi/cosi.go

+133
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
package cosi
2+
3+
import (
4+
"context"
5+
"testing"
6+
7+
appsv1 "k8s.io/api/apps/v1"
8+
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
9+
cosiv1alpha1 "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage/v1alpha1"
10+
11+
"sigs.k8s.io/e2e-framework/klient/k8s/resources"
12+
"sigs.k8s.io/e2e-framework/pkg/envconf"
13+
"sigs.k8s.io/e2e-framework/pkg/types"
14+
)
15+
16+
// CRDsInstalled checks if the required COSI CRDs are installed in the cluster.
17+
func CRDsInstalled() types.TestEnvFunc {
18+
return func(ctx context.Context, cfg *envconf.Config, t *testing.T) (context.Context, error) {
19+
var crds apiextensionsv1.CustomResourceDefinitionList
20+
21+
expectedCRDs := []string{
22+
"bucketaccessclasses.objectstorage.k8s.io",
23+
"bucketaccesses.objectstorage.k8s.io",
24+
"bucketclaims.objectstorage.k8s.io",
25+
"bucketclasses.objectstorage.k8s.io",
26+
"buckets.objectstorage.k8s.io",
27+
}
28+
29+
if err := cfg.Client().Resources().List(ctx, &crds); err != nil {
30+
t.Fatal(err)
31+
}
32+
33+
found := 0
34+
35+
for _, item := range crds.Items {
36+
for _, expected := range expectedCRDs {
37+
if item.GetObjectMeta().GetName() == expected {
38+
found++
39+
}
40+
}
41+
}
42+
43+
if len(expectedCRDs) != found {
44+
t.Fatal("COSI CRDs not installed")
45+
}
46+
47+
return ctx, nil
48+
}
49+
}
50+
51+
// ObjectstorageControllerInstalled checks if the COSI object storage controller deployment is installed.
52+
func ObjectstorageControllerInstalled() types.StepFunc {
53+
return func(ctx context.Context, t *testing.T, cfg *envconf.Config) context.Context {
54+
var deploymentList appsv1.DeploymentList
55+
56+
selector := resources.WithLabelSelector("app.kubernetes.io/part-of=container-object-storage-interface")
57+
58+
if err := cfg.Client().Resources().List(ctx, &deploymentList, selector); err != nil {
59+
t.Fatal(err)
60+
}
61+
62+
if len(deploymentList.Items) == 0 {
63+
t.Fatal("deployment not found")
64+
}
65+
66+
return ctx
67+
}
68+
}
69+
70+
// BucketAccessStatusReady checks if the status of BucketAccess is ready.
71+
func BucketAccessStatusReady(ready bool) types.StepFunc {
72+
return func(ctx context.Context, t *testing.T, cfg *envconf.Config) context.Context {
73+
return ctx
74+
}
75+
}
76+
77+
// BucketClaimStatusReady checks if the status of BucketClaim is ready.
78+
func BucketClaimStatusReady(ready bool) types.StepFunc {
79+
return func(ctx context.Context, t *testing.T, cfg *envconf.Config) context.Context {
80+
return ctx
81+
}
82+
}
83+
84+
// CreateBucket creates a new Bucket resource.
85+
func CreateBucket(bucket *cosiv1alpha1.Bucket) types.StepFunc {
86+
return func(ctx context.Context, t *testing.T, cfg *envconf.Config) context.Context {
87+
return ctx
88+
}
89+
}
90+
91+
// BucketExists checks if the Bucket resource exists.
92+
func BucketExists(expected bool) types.StepFunc {
93+
return func(ctx context.Context, t *testing.T, cfg *envconf.Config) context.Context {
94+
return ctx
95+
}
96+
}
97+
98+
// CreateBucketClaim creates a new BucketClaim resource.
99+
func CreateBucketClaim(bucketClaim *cosiv1alpha1.BucketClaim) types.StepFunc {
100+
return func(ctx context.Context, t *testing.T, cfg *envconf.Config) context.Context {
101+
return ctx
102+
}
103+
}
104+
105+
// DeleteBucketClaim deletes the specified BucketClaim resource.
106+
func DeleteBucketClaim() types.StepFunc {
107+
return func(ctx context.Context, t *testing.T, cfg *envconf.Config) context.Context {
108+
return ctx
109+
}
110+
}
111+
112+
// CreateBucketAccess creates a new BucketAccess resource.
113+
func CreateBucketAccess(bucketAccess *cosiv1alpha1.BucketAccess) types.StepFunc {
114+
return func(ctx context.Context, t *testing.T, cfg *envconf.Config) context.Context {
115+
return ctx
116+
}
117+
}
118+
119+
// SecretExists checks if the specified Secret resource exists.
120+
func SecretExists(expected bool) types.StepFunc {
121+
// TODO: this should also check if the format of the secret conforms
122+
// to the expectations, so one more arg will be needed
123+
return func(ctx context.Context, t *testing.T, cfg *envconf.Config) context.Context {
124+
return ctx
125+
}
126+
}
127+
128+
// DeleteBucketAccess deletes the specified BucketAccess resource.
129+
func DeleteBucketAccess() types.StepFunc {
130+
return func(ctx context.Context, t *testing.T, cfg *envconf.Config) context.Context {
131+
return ctx
132+
}
133+
}

Diff for: test/e2e/cosi_test.go

+183
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
package cositest
2+
3+
import (
4+
"e2e/assesments/cosi"
5+
"e2e/envfuncs"
6+
"flag"
7+
"log"
8+
"os"
9+
"testing"
10+
11+
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
12+
cosiv1alpha1 "sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage/v1alpha1"
13+
14+
"k8s.io/client-go/kubernetes/scheme"
15+
"sigs.k8s.io/container-object-storage-interface-api/apis/objectstorage/v1alpha1"
16+
"sigs.k8s.io/e2e-framework/pkg/env"
17+
"sigs.k8s.io/e2e-framework/pkg/envconf"
18+
"sigs.k8s.io/e2e-framework/pkg/features"
19+
)
20+
21+
var (
22+
testenv env.Environment
23+
24+
noKinD bool
25+
noInstallCRDs bool
26+
noInstallController bool
27+
noInstallSampleDriver bool
28+
29+
foo string
30+
)
31+
32+
func init() {
33+
apiextensionsv1.AddToScheme(scheme.Scheme)
34+
cosiv1alpha1.AddToScheme(scheme.Scheme)
35+
}
36+
37+
func TestMain(m *testing.M) {
38+
flag.BoolVar(
39+
&noKinD,
40+
"no-kind",
41+
false,
42+
"Start new environment with kind",
43+
)
44+
flag.BoolVar(
45+
&noInstallCRDs,
46+
"cosi.no-install-crds",
47+
false,
48+
"Disable installing CRDs on cluster",
49+
)
50+
flag.BoolVar(
51+
&noInstallController,
52+
"cosi.no-install-controller",
53+
false,
54+
"Disable installing COSI Controller on cluster",
55+
)
56+
flag.BoolVar(
57+
&noInstallSampleDriver,
58+
"cosi.no-install-sample-driver",
59+
false,
60+
"Disable installing sample driver on cluster",
61+
)
62+
flag.Parse()
63+
64+
cfg, err := envconf.NewFromFlags()
65+
if err != nil {
66+
log.Fatalf("failed to build envconf from flags: %s", err)
67+
}
68+
testenv = env.NewWithConfig(cfg)
69+
70+
testenv.Setup(
71+
envfuncs.CreateCluster(noKinD),
72+
73+
envfuncs.InstallCRDs(noInstallCRDs),
74+
envfuncs.InstallController(noInstallController),
75+
envfuncs.InstallDriver(noInstallSampleDriver),
76+
77+
envfuncs.CreateBucketClass(false),
78+
envfuncs.CreateBucketAccessClass(false),
79+
)
80+
81+
testenv.Finish(
82+
envfuncs.DeleteBucketAccessClass(false),
83+
envfuncs.DeleteBucketClass(false),
84+
85+
envfuncs.UninstallDriver(noInstallSampleDriver),
86+
envfuncs.UninstallController(noInstallController),
87+
envfuncs.UninstallCRDs(noInstallCRDs),
88+
89+
envfuncs.DeleteCluster(noKinD),
90+
)
91+
92+
testenv.BeforeEachTest(
93+
envfuncs.IsClusterReadyTest(),
94+
envfuncs.CreateNSForTest(),
95+
cosi.CRDsInstalled(),
96+
)
97+
98+
testenv.AfterEachTest(
99+
envfuncs.DeleteNSForTest(),
100+
)
101+
102+
os.Exit(testenv.Run(m))
103+
}
104+
105+
func TestBucketProvisioning(t *testing.T) {
106+
testenv.Test(t,
107+
features.New("Greenfield Bucket").
108+
Assess("BucketClaim is created",
109+
cosi.CreateBucketClaim(&v1alpha1.BucketClaim{})).
110+
Assess("Bucket is created",
111+
cosi.CreateBucket(&v1alpha1.Bucket{})).
112+
Assess("BucketClaim has ready status",
113+
cosi.BucketClaimStatusReady(true)).
114+
Assess("BucketClaim is deleted",
115+
cosi.DeleteBucketClaim()).
116+
Assess("Bucket is deleted",
117+
cosi.BucketExists(false)).
118+
Feature(),
119+
120+
features.New("Brownfield Bucket").
121+
Assess("BucketClaim is created",
122+
cosi.CreateBucketClaim(&v1alpha1.BucketClaim{})).
123+
Assess("Bucket is created",
124+
cosi.CreateBucket(&v1alpha1.Bucket{})).
125+
Assess("BucketClaim has ready status",
126+
cosi.BucketClaimStatusReady(true)).
127+
Assess("BucketClaim is deleted",
128+
cosi.DeleteBucketClaim()).
129+
Assess("Bucket is deleted",
130+
cosi.BucketExists(false)).
131+
Feature(),
132+
)
133+
}
134+
135+
func TestBucketAccessProvisioning(t *testing.T) {
136+
testenv.Test(t,
137+
features.New("BucketAccess for S3").
138+
Assess("BucketClaim is created",
139+
cosi.CreateBucketClaim(&v1alpha1.BucketClaim{})).
140+
Assess("Bucket is created",
141+
cosi.CreateBucket(&v1alpha1.Bucket{})).
142+
Assess("BucketClaim has ready status",
143+
cosi.BucketClaimStatusReady(true)).
144+
Assess("BucketAccess is created",
145+
cosi.CreateBucketAccess(&v1alpha1.BucketAccess{})).
146+
Assess("BucketAccess has ready status",
147+
cosi.BucketAccessStatusReady(true)).
148+
Assess("Secret is created",
149+
cosi.SecretExists(true)).
150+
Assess("BucketAccess is deleted",
151+
cosi.DeleteBucketAccess()).
152+
Assess("Secret is deleted",
153+
cosi.SecretExists(false)).
154+
Assess("BucketClaim is deleted",
155+
cosi.DeleteBucketClaim()).
156+
Assess("Bucket is deleted",
157+
cosi.BucketExists(false)).
158+
Feature(),
159+
160+
features.New("BucketAccess for Azure").
161+
Assess("BucketClaim is created",
162+
cosi.CreateBucketClaim(&v1alpha1.BucketClaim{})).
163+
Assess("Bucket is created",
164+
cosi.CreateBucket(&v1alpha1.Bucket{})).
165+
Assess("BucketClaim has ready status",
166+
cosi.BucketClaimStatusReady(true)).
167+
Assess("BucketAccess is created",
168+
cosi.CreateBucketAccess(&v1alpha1.BucketAccess{})).
169+
Assess("BucketAccess has ready status",
170+
cosi.BucketAccessStatusReady(true)).
171+
Assess("Secret is created",
172+
cosi.SecretExists(true)).
173+
Assess("BucketAccess is deleted",
174+
cosi.DeleteBucketAccess()).
175+
Assess("Secret is deleted",
176+
cosi.SecretExists(false)).
177+
Assess("BucketClaim is deleted",
178+
cosi.DeleteBucketClaim()).
179+
Assess("Bucket is deleted",
180+
cosi.BucketExists(false)).
181+
Feature(),
182+
)
183+
}

Diff for: test/e2e/envfuncs/common.go

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// Package envfuncs provides a collection of functions that return closures
2+
// conforming to the types defined in sigs.k8s.io/e2e-framework/pkg/types .
3+
// These functions are designed to be used within the Kubernetes end-to-end
4+
// testing framework to facilitate the creation and management of test
5+
// environments.
6+
7+
package envfuncs
8+
9+
import (
10+
"context"
11+
12+
"sigs.k8s.io/e2e-framework/pkg/envconf"
13+
)
14+
15+
// Noop returns an EnvFunc that performs no operation. This can be used as a placeholder
16+
// or default function within an environment configuration.
17+
func Noop() func(ctx context.Context, cfg *envconf.Config) (context.Context, error) {
18+
return func(ctx context.Context, cfg *envconf.Config) (context.Context, error) {
19+
return ctx, nil
20+
}
21+
}

0 commit comments

Comments
 (0)