Skip to content

Commit 201409c

Browse files
authored
Merge pull request #5643 from mohamedawnallah/unitTestCertDeInitTaskOperatorPkg
operator/pkg/tasks/deinit: unit test cert
2 parents 23bcebc + 2c7aea5 commit 201409c

File tree

1 file changed

+191
-0
lines changed

1 file changed

+191
-0
lines changed
+191
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
/*
2+
Copyright 2024 The Karmada Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package tasks
18+
19+
import (
20+
"context"
21+
"fmt"
22+
"strings"
23+
"testing"
24+
25+
corev1 "k8s.io/api/core/v1"
26+
apierrors "k8s.io/apimachinery/pkg/api/errors"
27+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
28+
fakeclientset "k8s.io/client-go/kubernetes/fake"
29+
30+
"github.com/karmada-io/karmada/operator/pkg/constants"
31+
"github.com/karmada-io/karmada/operator/pkg/util"
32+
"github.com/karmada-io/karmada/operator/pkg/workflow"
33+
)
34+
35+
func TestNewCleanupCertTask(t *testing.T) {
36+
tests := []struct {
37+
name string
38+
wantTask workflow.Task
39+
}{
40+
{
41+
name: "NewCleanupCertTask_IsCalled_ExpectedWorkflowTask",
42+
wantTask: workflow.Task{
43+
Name: "cleanup-cert",
44+
Run: runCleanupCert,
45+
RunSubTasks: true,
46+
Tasks: []workflow.Task{
47+
newCleanupCertSubTask("karmada", util.KarmadaCertSecretName),
48+
newCleanupCertSubTask("etcd", util.EtcdCertSecretName),
49+
newCleanupCertSubTask("webhook", util.WebhookCertSecretName),
50+
},
51+
},
52+
},
53+
}
54+
for _, test := range tests {
55+
t.Run(test.name, func(t *testing.T) {
56+
cleanupCertTask := NewCleanupCertTask()
57+
if err := util.DeepEqualTasks(cleanupCertTask, test.wantTask); err != nil {
58+
t.Errorf("unexpected error: %v", err)
59+
}
60+
})
61+
}
62+
}
63+
64+
func TestRunCleanupCert(t *testing.T) {
65+
tests := []struct {
66+
name string
67+
runData workflow.RunData
68+
wantErr bool
69+
errMsg string
70+
}{
71+
{
72+
name: "RunCleanupCert_InvalidTypeAssertion_TypeAssertionIsInvalid",
73+
runData: &MyTestData{Data: "test"},
74+
wantErr: true,
75+
errMsg: "cleanup-cert task invoked with an invalid data struct",
76+
},
77+
{
78+
name: "RunCleanupCert_ValidTypeAssertion_TypeAssertionIsValid",
79+
runData: &TestDeInitData{
80+
name: "karmada-demo",
81+
namespace: "test",
82+
},
83+
},
84+
}
85+
86+
for _, test := range tests {
87+
t.Run(test.name, func(t *testing.T) {
88+
err := runCleanupCert(test.runData)
89+
if err == nil && test.wantErr {
90+
t.Errorf("expected error, but got none")
91+
}
92+
if err != nil && !test.wantErr {
93+
t.Errorf("unexpected error: %v", err)
94+
}
95+
if err != nil && test.wantErr && !strings.Contains(err.Error(), test.errMsg) {
96+
t.Errorf("expected %s error msg to contain %s", err.Error(), test.errMsg)
97+
}
98+
})
99+
}
100+
}
101+
102+
func TestRunCleanupCertSubTask(t *testing.T) {
103+
tests := []struct {
104+
name string
105+
owner string
106+
secretNameFunc util.Namefunc
107+
runData workflow.RunData
108+
prep func(workflow.RunData) error
109+
verify func(workflow.RunData) error
110+
wantErr bool
111+
errMsg string
112+
}{
113+
{
114+
name: "RunCleanupCertSubTask_InvalidTypeAssertion_TypeAssertionIsInvalid",
115+
owner: "karmada",
116+
runData: &MyTestData{Data: "test"},
117+
prep: func(workflow.RunData) error { return nil },
118+
verify: func(workflow.RunData) error { return nil },
119+
wantErr: true,
120+
errMsg: fmt.Sprintf("cleanup-%s-cert task invoked with an invalid data struct", "karmada"),
121+
},
122+
{
123+
name: "RunCleanupCertSubTask_WithKarmadaCertSecret_CertsHaveBeenCleanedUp",
124+
owner: "karmada",
125+
secretNameFunc: util.KarmadaCertSecretName,
126+
prep: prepareKarmadaCertSecret,
127+
verify: verifyKarmadaCertSecretDeleted,
128+
runData: &TestDeInitData{
129+
name: "karmada-demo",
130+
namespace: "test",
131+
remoteClient: fakeclientset.NewSimpleClientset(),
132+
},
133+
wantErr: false,
134+
},
135+
}
136+
137+
for _, test := range tests {
138+
t.Run(test.name, func(t *testing.T) {
139+
if err := test.prep(test.runData); err != nil {
140+
t.Errorf("failed to prep the run cleanup cert subtask: %v", err)
141+
}
142+
cleanupCertSubTask := runCleanupCertSubTask(test.owner, test.secretNameFunc)
143+
err := cleanupCertSubTask(test.runData)
144+
if err == nil && test.wantErr {
145+
t.Errorf("expected error, but got none")
146+
}
147+
if err != nil && !test.wantErr {
148+
t.Errorf("unexpected error: %v", err)
149+
}
150+
if err != nil && test.wantErr && !strings.Contains(err.Error(), test.errMsg) {
151+
t.Errorf("expected %s error msg to contain %s", err.Error(), test.errMsg)
152+
}
153+
if err := test.verify(test.runData); err != nil {
154+
t.Errorf("failed to verify run cleanup cert subtask: %v", err)
155+
}
156+
})
157+
}
158+
}
159+
160+
func prepareKarmadaCertSecret(rd workflow.RunData) error {
161+
data := rd.(*TestDeInitData)
162+
secretName := util.KarmadaCertSecretName(data.name)
163+
_, err := data.remoteClient.CoreV1().Secrets(data.namespace).Create(context.TODO(), &corev1.Secret{
164+
ObjectMeta: metav1.ObjectMeta{
165+
Name: secretName,
166+
Namespace: data.namespace,
167+
Labels: constants.KarmadaOperatorLabel,
168+
},
169+
Type: corev1.SecretTypeOpaque,
170+
}, metav1.CreateOptions{})
171+
if err != nil {
172+
return fmt.Errorf("failed to create secret: %v", err)
173+
}
174+
return nil
175+
}
176+
177+
func verifyKarmadaCertSecretDeleted(rd workflow.RunData) error {
178+
data := rd.(*TestDeInitData)
179+
secretName := util.KarmadaCertSecretName(data.name)
180+
secret, err := data.remoteClient.CoreV1().Secrets(data.namespace).Get(context.TODO(), secretName, metav1.GetOptions{})
181+
if err == nil {
182+
if val, exists := secret.Labels[constants.KarmadaOperatorLabelKeyName]; exists && val != "" {
183+
return fmt.Errorf("expected secret %s to be deleted, but it still exists with label %s=%s", secretName, constants.KarmadaOperatorLabelKeyName, val)
184+
}
185+
return fmt.Errorf("expected secret %s to be deleted, but it still exists", secretName)
186+
}
187+
if apierrors.IsNotFound(err) {
188+
return nil
189+
}
190+
return err
191+
}

0 commit comments

Comments
 (0)