@@ -6,13 +6,17 @@ import (
66
77 cm "github.com/cert-manager/cert-manager/pkg/apis/certmanager/v1"
88 cmmeta "github.com/cert-manager/cert-manager/pkg/apis/meta/v1"
9+ "github.com/stretchr/testify/assert"
10+ corev1 "k8s.io/api/core/v1"
911 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1012 "k8s.io/apimachinery/pkg/types"
1113 "k8s.io/client-go/kubernetes/scheme"
14+ "k8s.io/utils/ptr"
1215 "sigs.k8s.io/controller-runtime/pkg/client"
1316 "sigs.k8s.io/controller-runtime/pkg/client/fake" // nolint
1417
1518 api "github.com/percona/percona-server-mongodb-operator/pkg/apis/psmdb/v1"
19+ "github.com/percona/percona-server-mongodb-operator/pkg/version"
1620)
1721
1822func TestCreateIssuer (t * testing.T ) {
@@ -132,12 +136,142 @@ func TestCreateCertificate(t *testing.T) {
132136 })
133137}
134138
139+ func TestWaitForCerts (t * testing.T ) {
140+ ctx := context .Background ()
141+
142+ cr := & api.PerconaServerMongoDB {
143+ ObjectMeta : metav1.ObjectMeta {
144+ Name : "test-cluster" ,
145+ Namespace : "default" ,
146+ UID : "test-uid-123" ,
147+ },
148+ Spec : api.PerconaServerMongoDBSpec {
149+ CRVersion : version .Version (),
150+ },
151+ }
152+
153+ certName := CertificateCA (cr ).SecretName ()
154+
155+ tests := map [string ]struct {
156+ certificate * cm.Certificate
157+ secret * corev1.Secret
158+ }{
159+ "with cert-manager managed secret" : {
160+ certificate : & cm.Certificate {
161+ ObjectMeta : metav1.ObjectMeta {
162+ Name : certName ,
163+ Namespace : cr .Namespace ,
164+ UID : "cert-uid-456" ,
165+ },
166+ Spec : cm.CertificateSpec {
167+ SecretName : certName ,
168+ },
169+ },
170+ secret : & corev1.Secret {
171+ ObjectMeta : metav1.ObjectMeta {
172+ Name : certName ,
173+ Namespace : cr .Namespace ,
174+ Annotations : map [string ]string {
175+ cm .CertificateNameKey : certName ,
176+ },
177+ OwnerReferences : []metav1.OwnerReference {
178+ {
179+ APIVersion : cm .SchemeGroupVersion .String (),
180+ Kind : cm .CertificateKind ,
181+ Name : certName ,
182+ UID : "cert-uid-456" ,
183+ Controller : ptr .To (true ),
184+ },
185+ },
186+ },
187+ Data : map [string ][]byte {
188+ "ca.crt" : []byte ("fake-ca-cert" ),
189+ "tls.crt" : []byte ("fake-tls-cert" ),
190+ "tls.key" : []byte ("fake-tls-key" ),
191+ },
192+ },
193+ },
194+ "with cert-manager managed secret but without OwnerReferences" : {
195+ certificate : & cm.Certificate {
196+ ObjectMeta : metav1.ObjectMeta {
197+ Name : certName ,
198+ Namespace : cr .Namespace ,
199+ UID : "cert-uid-456" ,
200+ },
201+ Spec : cm.CertificateSpec {
202+ SecretName : certName ,
203+ },
204+ },
205+ secret : & corev1.Secret {
206+ ObjectMeta : metav1.ObjectMeta {
207+ Name : certName ,
208+ Namespace : cr .Namespace ,
209+ Annotations : map [string ]string {
210+ cm .CertificateNameKey : certName ,
211+ },
212+ },
213+ Data : map [string ][]byte {
214+ "ca.crt" : []byte ("fake-ca-cert" ),
215+ "tls.crt" : []byte ("fake-tls-cert" ),
216+ "tls.key" : []byte ("fake-tls-key" ),
217+ },
218+ },
219+ },
220+ "without cert-manager" : {
221+ certificate : nil ,
222+ secret : & corev1.Secret {
223+ ObjectMeta : metav1.ObjectMeta {
224+ Name : certName ,
225+ Namespace : cr .Namespace ,
226+ },
227+ Data : map [string ][]byte {
228+ "ca.crt" : []byte ("fake-ca-cert" ),
229+ "tls.crt" : []byte ("fake-tls-cert" ),
230+ "tls.key" : []byte ("fake-tls-key" ),
231+ },
232+ },
233+ },
234+ }
235+
236+ for name , tc := range tests {
237+ t .Run (name , func (t * testing.T ) {
238+ s := scheme .Scheme
239+ s .AddKnownTypes (api .SchemeGroupVersion , new (api.PerconaServerMongoDB ))
240+ s .AddKnownTypes (cm .SchemeGroupVersion , new (cm.Certificate ))
241+ s .AddKnownTypes (corev1 .SchemeGroupVersion , new (corev1.Secret ))
242+
243+ objects := []client.Object {cr , tc .secret }
244+ if tc .certificate != nil {
245+ objects = append (objects , tc .certificate )
246+ }
247+
248+ cl := fake .NewClientBuilder ().
249+ WithScheme (s ).
250+ WithObjects (objects ... ).
251+ WithStatusSubresource (cr ).
252+ Build ()
253+
254+ controller := & certManagerController {
255+ cl : cl ,
256+ scheme : s ,
257+ dryRun : false ,
258+ }
259+
260+ err := controller .WaitForCerts (ctx , cr , CertificateCA (cr ))
261+ assert .NoError (t , err )
262+ })
263+ }
264+ }
265+
135266// creates a fake client to mock API calls with the mock objects
136267func buildFakeClient (objs ... client.Object ) CertManagerController {
137268 s := scheme .Scheme
138269
139270 s .AddKnownTypes (api .SchemeGroupVersion ,
140271 new (api.PerconaServerMongoDB ),
272+ )
273+
274+ s .AddKnownTypes (cm .SchemeGroupVersion ,
141275 new (cm.Issuer ),
142276 new (cm.Certificate ),
143277 )
0 commit comments