Skip to content

Commit 9d90c9e

Browse files
committed
Add e2e tests for AutoProvider
Signed-off-by: ArkaSaha30 <[email protected]>
1 parent 1dd959b commit 9d90c9e

File tree

1 file changed

+222
-0
lines changed

1 file changed

+222
-0
lines changed

test/e2e/auto_provider_test.go

Lines changed: 222 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,222 @@
1+
package e2e
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"testing"
7+
"time"
8+
9+
certv1 "github.com/cert-manager/cert-manager/pkg/apis/certmanager/v1"
10+
appsv1 "k8s.io/api/apps/v1"
11+
corev1 "k8s.io/api/core/v1"
12+
apiextensionsV1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
13+
k8serrors "k8s.io/apimachinery/pkg/api/errors"
14+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
15+
"sigs.k8s.io/e2e-framework/klient"
16+
"sigs.k8s.io/e2e-framework/klient/k8s"
17+
"sigs.k8s.io/e2e-framework/klient/wait"
18+
"sigs.k8s.io/e2e-framework/pkg/envconf"
19+
"sigs.k8s.io/e2e-framework/pkg/features"
20+
21+
ecv1alpha1 "go.etcd.io/etcd-operator/api/v1alpha1"
22+
"go.etcd.io/etcd-operator/pkg/certificate"
23+
"go.etcd.io/etcd-operator/pkg/certificate/auto"
24+
interfaces "go.etcd.io/etcd-operator/pkg/certificate/interfaces"
25+
)
26+
27+
const (
28+
autoCertificateName = "sample-cert"
29+
autoCertificateNamespace = "default"
30+
autoCertificateValidity = auto.DefaultValidity
31+
)
32+
33+
func TestAutoProvider(t *testing.T) {
34+
feature := features.New("Auto Provider Certificate").WithLabel("app", string(certificate.Auto))
35+
36+
cmConfig := &interfaces.Config{
37+
CommonName: autoCertificateName,
38+
ValidityDuration: autoCertificateValidity,
39+
}
40+
41+
feature.Setup(
42+
func(ctx context.Context, t *testing.T, cfg *envconf.Config) context.Context {
43+
client := cfg.Client()
44+
_ = appsv1.AddToScheme(client.Resources().GetScheme())
45+
_ = corev1.AddToScheme(client.Resources().GetScheme())
46+
_ = certv1.AddToScheme(client.Resources().GetScheme())
47+
_ = apiextensionsV1.AddToScheme(client.Resources().GetScheme())
48+
49+
return ctx
50+
})
51+
52+
feature.Assess("Ensure certificate",
53+
func(ctx context.Context, t *testing.T, cfg *envconf.Config) context.Context {
54+
client := cfg.Client()
55+
acProvider := auto.New(client.Resources().GetControllerRuntimeClient())
56+
err := acProvider.EnsureCertificateSecret(ctx, autoCertificateName, autoCertificateNamespace, cmConfig)
57+
if err != nil {
58+
t.Fatalf("Auto Provider Certificate could not be created: %v", err)
59+
}
60+
return ctx
61+
})
62+
63+
feature.Assess("Validate certificate secret",
64+
func(ctx context.Context, t *testing.T, cfg *envconf.Config) context.Context {
65+
client := cfg.Client()
66+
acProvider := auto.New(client.Resources().GetControllerRuntimeClient())
67+
err := acProvider.ValidateCertificateSecret(ctx, autoCertificateName, autoCertificateNamespace, cmConfig)
68+
if err != nil {
69+
t.Fatalf("Failed to validate Auto Provider Certificate secret: %v", err)
70+
}
71+
return ctx
72+
})
73+
74+
feature.Assess("Delete certificate secret",
75+
func(ctx context.Context, t *testing.T, cfg *envconf.Config) context.Context {
76+
client := cfg.Client()
77+
acProvider := auto.New(client.Resources().GetControllerRuntimeClient())
78+
err := acProvider.DeleteCertificateSecret(ctx, autoCertificateName, autoCertificateNamespace)
79+
if err != nil {
80+
t.Fatalf("Failed to delete Certificate secret: %v", err)
81+
}
82+
return ctx
83+
})
84+
85+
feature.Assess("Verify Delete certificate",
86+
func(ctx context.Context, t *testing.T, cfg *envconf.Config) context.Context {
87+
client := cfg.Client()
88+
acProvider := auto.New(client.Resources().GetControllerRuntimeClient())
89+
_, err := acProvider.GetCertificateConfig(ctx, autoCertificateName, autoCertificateNamespace)
90+
if err == nil {
91+
t.Fatalf("Auto Provider Certificate found, deletion failed: %v", err)
92+
}
93+
return ctx
94+
})
95+
96+
_ = testEnv.Test(t, feature.Feature())
97+
}
98+
99+
func TestClusterAutoCertCreation(t *testing.T) {
100+
feature := features.New("cluster-auto-cert-creation")
101+
102+
const etcdClusterName = "etcd-cluster-auto-cert"
103+
const size = 3
104+
105+
etcdCluster := &ecv1alpha1.EtcdCluster{
106+
TypeMeta: metav1.TypeMeta{
107+
APIVersion: "operator.etcd.io/v1alpha1",
108+
Kind: "EtcdCluster",
109+
},
110+
ObjectMeta: metav1.ObjectMeta{
111+
Name: etcdClusterName,
112+
Namespace: namespace,
113+
},
114+
Spec: ecv1alpha1.EtcdClusterSpec{
115+
Size: size,
116+
Version: etcdVersion,
117+
TLS: &ecv1alpha1.TLSCertificate{
118+
Provider: string(certificate.Auto),
119+
ProviderCfg: ecv1alpha1.ProviderConfig{
120+
AutoCfg: &ecv1alpha1.ProviderAutoConfig{
121+
CommonConfig: ecv1alpha1.CommonConfig{
122+
CommonName: "etcd-operator-system",
123+
ValidityDuration: "8760h",
124+
},
125+
},
126+
},
127+
},
128+
},
129+
}
130+
131+
feature.Setup(func(ctx context.Context, t *testing.T, cfg *envconf.Config) context.Context {
132+
client := cfg.Client()
133+
_ = appsv1.AddToScheme(client.Resources().GetScheme())
134+
_ = corev1.AddToScheme(client.Resources().GetScheme())
135+
_ = certv1.AddToScheme(client.Resources().GetScheme())
136+
_ = apiextensionsV1.AddToScheme(client.Resources().GetScheme())
137+
138+
// create etcd cluster
139+
if err := client.Resources().Create(ctx, etcdCluster); err != nil {
140+
t.Fatalf("unable to create etcd cluster: %s", err)
141+
}
142+
143+
// get etcd cluster object
144+
var ec ecv1alpha1.EtcdCluster
145+
if err := client.Resources().Get(ctx, etcdClusterName, namespace, &ec); err != nil {
146+
t.Fatalf("unable to fetch etcd cluster: %s", err)
147+
}
148+
149+
return ctx
150+
})
151+
152+
feature.Assess("Check certificate secrets exist",
153+
func(ctx context.Context, t *testing.T, c *envconf.Config) context.Context {
154+
client := c.Client()
155+
// checks if corresponding client, server, peer secrets are created in the respective namespace
156+
if err := wait.For(
157+
func(context.Context) (bool, error) {
158+
return validateSecretExists(ctx, client, etcdClusterName, namespace, "secret")
159+
},
160+
wait.WithTimeout(3*time.Minute),
161+
wait.WithInterval(10*time.Second),
162+
); err != nil {
163+
t.Fatalf("timed out waiting for certificate: %s", err)
164+
}
165+
return ctx
166+
},
167+
)
168+
169+
feature.Assess("Verify Data Operations",
170+
func(ctx context.Context, t *testing.T, c *envconf.Config) context.Context {
171+
// verify etcdCluster is accessible via client certificate with put and get
172+
verifyDataOperations(t, c, etcdClusterName, "test-key", "test-value")
173+
return ctx
174+
},
175+
)
176+
177+
_ = testEnv.Test(t, feature.Feature())
178+
}
179+
180+
func validateSecretExists(ctx context.Context, client klient.Client,
181+
etcdClusterName, etcdClusterNamespace, resourceType string) (bool, error) {
182+
clientCertName := fmt.Sprintf("%s-client-tls", etcdClusterName)
183+
serverCertName := fmt.Sprintf("%s-server-tls", etcdClusterName)
184+
peerCertName := fmt.Sprintf("%s-peer-tls", etcdClusterName)
185+
186+
var obj any
187+
188+
switch resourceType {
189+
case "secret":
190+
var secretObj corev1.Secret
191+
obj = &secretObj
192+
default:
193+
return false, fmt.Errorf("invalid resource type: %v", resourceType)
194+
}
195+
196+
runtimeObj, err := obj.(k8s.Object)
197+
if !err {
198+
return false, fmt.Errorf("object does not implement runtime.Object: %T", obj)
199+
}
200+
201+
if err := client.Resources().Get(ctx, clientCertName, etcdClusterNamespace, runtimeObj); err != nil {
202+
if k8serrors.IsNotFound(err) {
203+
return false, nil
204+
}
205+
return false, fmt.Errorf("failed to get Client %s: %v", resourceType, err)
206+
}
207+
208+
if err := client.Resources().Get(ctx, serverCertName, etcdClusterNamespace, runtimeObj); err != nil {
209+
if k8serrors.IsNotFound(err) {
210+
return false, nil
211+
}
212+
return false, fmt.Errorf("failed to get Server %s: %v", resourceType, err)
213+
}
214+
215+
if err := client.Resources().Get(ctx, peerCertName, etcdClusterNamespace, runtimeObj); err != nil {
216+
if k8serrors.IsNotFound(err) {
217+
return false, nil
218+
}
219+
return false, fmt.Errorf("failed to get Peer %s: %v", resourceType, err)
220+
}
221+
return true, nil
222+
}

0 commit comments

Comments
 (0)