@@ -22,13 +22,15 @@ import (
2222 "crypto/elliptic"
2323 "crypto/rand"
2424 "testing"
25+ "time"
2526
2627 cmapi "github.com/cert-manager/cert-manager/pkg/apis/certmanager/v1"
2728 utilpki "github.com/cert-manager/cert-manager/pkg/util/pki"
2829 "github.com/cert-manager/csi-lib/metadata"
2930 "github.com/cert-manager/csi-lib/storage"
3031 "github.com/spiffe/go-spiffe/v2/svid/x509svid"
3132 "github.com/stretchr/testify/require"
33+ "k8s.io/klog/v2/klogr"
3234
3335 "github.com/AthenZ/csi-driver-athenz/internal/csi/rootca"
3436)
@@ -68,6 +70,7 @@ func Test_writeKeyPair(t *testing.T) {
6870
6971 store := storage .NewMemoryFS ()
7072 d := & Driver {
73+ log : klogr .New (),
7174 certFileName : "crt.pem" ,
7275 keyFileName : "key.pem" ,
7376 caFileName : "ca.pem" ,
@@ -297,3 +300,141 @@ func Test_generateRequestWithNamespaceDomainFalse(t *testing.T) {
297300 expectedSpiffeID := "spiffe://athenz.io/ns/sandbox/sa/athenz.example"
298301 require .Equal (t , expectedSpiffeID , certBundle .Annotations ["csi.cert-manager.athenz.io/identity" ])
299302}
303+
304+ func Test_writeKeyPairWithCustomRefreshInterval (t * testing.T ) {
305+ ctx , cancel := context .WithCancel (context .Background ())
306+ t .Cleanup (func () {
307+ cancel ()
308+ })
309+
310+ capk , err := ecdsa .GenerateKey (elliptic .P256 (), rand .Reader )
311+ require .NoError (t , err )
312+
313+ caTmpl , err := utilpki .CertificateTemplateFromCertificate (& cmapi.Certificate {Spec : cmapi.CertificateSpec {CommonName : "my-ca" }})
314+ require .NoError (t , err )
315+
316+ caPEM , ca , err := utilpki .SignCertificate (caTmpl , caTmpl , capk .Public (), capk )
317+ require .NoError (t , err )
318+
319+ leafpk , err := ecdsa .GenerateKey (elliptic .P256 (), rand .Reader )
320+ require .NoError (t , err )
321+
322+ leafTmpl , err := utilpki .CertificateTemplateFromCertificate (
323+ & cmapi.Certificate {
324+ Spec : cmapi.CertificateSpec {URIs : []string {"spiffe://athenz.io/ns/sandbox/sa/default" }},
325+ },
326+ )
327+ require .NoError (t , err )
328+
329+ leafPEM , _ , err := utilpki .SignCertificate (leafTmpl , ca , leafpk .Public (), capk )
330+ require .NoError (t , err )
331+
332+ ch := make (chan []byte )
333+ rootCAs := rootca .NewMemory (ctx , ch )
334+ ch <- caPEM
335+
336+ store := storage .NewMemoryFS ()
337+ d := & Driver {
338+ log : klogr .New (),
339+ certFileName : "crt.pem" ,
340+ keyFileName : "key.pem" ,
341+ caFileName : "ca.pem" ,
342+ rootCAs : rootCAs ,
343+ store : store ,
344+ }
345+
346+ // Test with custom refresh interval of 12 hours
347+ volumeContext := map [string ]string {
348+ "csi.cert-manager.athenz.io/refresh-interval" : "12h" ,
349+ }
350+ meta := metadata.Metadata {VolumeID : "vol-id-refresh" , VolumeContext : volumeContext }
351+
352+ _ , err = store .RegisterMetadata (meta )
353+ require .NoError (t , err )
354+
355+ beforeWrite := time .Now ()
356+ err = d .writeKeypair (meta , leafpk , leafPEM , nil )
357+ require .NoError (t , err )
358+ afterWrite := time .Now ()
359+
360+ files , err := store .ReadFiles ("vol-id-refresh" )
361+ require .NoError (t , err )
362+
363+ _ , err = x509svid .Parse (files ["crt.pem" ], files ["key.pem" ])
364+ require .NoError (t , err )
365+
366+ // Verify the next issuance time is approximately 12 hours from now
367+ updatedMeta , err := store .ReadMetadata ("vol-id-refresh" )
368+ require .NoError (t , err )
369+ require .NotNil (t , updatedMeta .NextIssuanceTime )
370+
371+ expectedMin := beforeWrite .Add (12 * time .Hour )
372+ expectedMax := afterWrite .Add (12 * time .Hour )
373+ require .True (t , updatedMeta .NextIssuanceTime .After (expectedMin ) || updatedMeta .NextIssuanceTime .Equal (expectedMin ),
374+ "NextIssuanceTime should be >= now + 12h" )
375+ require .True (t , updatedMeta .NextIssuanceTime .Before (expectedMax ) || updatedMeta .NextIssuanceTime .Equal (expectedMax ),
376+ "NextIssuanceTime should be <= now + 12h" )
377+ }
378+
379+ func Test_writeKeyPairWithDefaultRefreshInterval (t * testing.T ) {
380+ ctx , cancel := context .WithCancel (context .Background ())
381+ t .Cleanup (func () {
382+ cancel ()
383+ })
384+
385+ capk , err := ecdsa .GenerateKey (elliptic .P256 (), rand .Reader )
386+ require .NoError (t , err )
387+
388+ caTmpl , err := utilpki .CertificateTemplateFromCertificate (& cmapi.Certificate {Spec : cmapi.CertificateSpec {CommonName : "my-ca" }})
389+ require .NoError (t , err )
390+
391+ caPEM , ca , err := utilpki .SignCertificate (caTmpl , caTmpl , capk .Public (), capk )
392+ require .NoError (t , err )
393+
394+ leafpk , err := ecdsa .GenerateKey (elliptic .P256 (), rand .Reader )
395+ require .NoError (t , err )
396+
397+ leafTmpl , err := utilpki .CertificateTemplateFromCertificate (
398+ & cmapi.Certificate {
399+ Spec : cmapi.CertificateSpec {URIs : []string {"spiffe://athenz.io/ns/sandbox/sa/default" }},
400+ },
401+ )
402+ require .NoError (t , err )
403+
404+ leafPEM , _ , err := utilpki .SignCertificate (leafTmpl , ca , leafpk .Public (), capk )
405+ require .NoError (t , err )
406+
407+ ch := make (chan []byte )
408+ rootCAs := rootca .NewMemory (ctx , ch )
409+ ch <- caPEM
410+
411+ store := storage .NewMemoryFS ()
412+ d := & Driver {
413+ log : klogr .New (),
414+ certFileName : "crt.pem" ,
415+ keyFileName : "key.pem" ,
416+ caFileName : "ca.pem" ,
417+ rootCAs : rootCAs ,
418+ store : store ,
419+ }
420+
421+ // Test without custom refresh interval (should use certificate-based calculation)
422+ meta := metadata.Metadata {VolumeID : "vol-id-default" }
423+
424+ _ , err = store .RegisterMetadata (meta )
425+ require .NoError (t , err )
426+
427+ err = d .writeKeypair (meta , leafpk , leafPEM , nil )
428+ require .NoError (t , err )
429+
430+ files , err := store .ReadFiles ("vol-id-default" )
431+ require .NoError (t , err )
432+
433+ _ , err = x509svid .Parse (files ["crt.pem" ], files ["key.pem" ])
434+ require .NoError (t , err )
435+
436+ // Verify the next issuance time was set (based on certificate validity)
437+ updatedMeta , err := store .ReadMetadata ("vol-id-default" )
438+ require .NoError (t , err )
439+ require .NotNil (t , updatedMeta .NextIssuanceTime )
440+ }
0 commit comments