@@ -3,8 +3,6 @@ package certificates
3
3
import (
4
4
"bytes"
5
5
"context"
6
- "crypto/x509"
7
- "encoding/pem"
8
6
"errors"
9
7
"fmt"
10
8
"os"
@@ -16,13 +14,13 @@ import (
16
14
corev1 "k8s.io/api/core/v1"
17
15
k8serrors "k8s.io/apimachinery/pkg/api/errors"
18
16
"sigs.k8s.io/controller-runtime/pkg/client"
19
- "sigs.k8s.io/controller-runtime/pkg/manager"
20
17
)
21
18
22
19
const (
23
20
certificateRenewalInterval = 6 * time .Hour
24
21
ServerKey = "tls.key"
25
22
ServerCert = "tls.crt"
23
+ CertThreshold = 5 * time .Minute
26
24
)
27
25
28
26
type CertificateWatcher struct {
@@ -31,16 +29,20 @@ type CertificateWatcher struct {
31
29
certificateDirectory string
32
30
namespace string
33
31
certificateSecretName string
34
- Log logr.Logger
32
+ certificateTreshold time.Duration
33
+ ICertificateHandler
34
+ Log logr.Logger
35
35
}
36
36
37
- func NewCertificateWatcher (mgr manager. Manager , namespace string , secretName string , log logr.Logger ) * CertificateWatcher {
37
+ func NewCertificateWatcher (reader client. Reader , certDir string , namespace string , secretName string , log logr.Logger ) * CertificateWatcher {
38
38
return & CertificateWatcher {
39
- apiReader : mgr . GetAPIReader () ,
39
+ apiReader : reader ,
40
40
fs : afero .NewOsFs (),
41
- certificateDirectory : mgr . GetWebhookServer (). CertDir ,
41
+ certificateDirectory : certDir ,
42
42
namespace : namespace ,
43
43
certificateSecretName : secretName ,
44
+ ICertificateHandler : defaultCertificateHandler {},
45
+ certificateTreshold : CertThreshold ,
44
46
Log : log ,
45
47
}
46
48
}
@@ -75,7 +77,7 @@ func (watcher *CertificateWatcher) updateCertificatesFromSecret() error {
75
77
}
76
78
77
79
for _ , filename := range []string {ServerCert , ServerKey } {
78
- if _ , err = watcher .ensureCertificateFile (secret , filename ); err != nil {
80
+ if err = watcher .ensureCertificateFile (secret , filename ); err != nil {
79
81
return err
80
82
}
81
83
}
@@ -88,22 +90,18 @@ func (watcher *CertificateWatcher) updateCertificatesFromSecret() error {
88
90
return nil
89
91
}
90
92
91
- func (watcher * CertificateWatcher ) ensureCertificateFile (secret corev1.Secret , filename string ) ( bool , error ) {
93
+ func (watcher * CertificateWatcher ) ensureCertificateFile (secret corev1.Secret , filename string ) error {
92
94
f := filepath .Join (watcher .certificateDirectory , filename )
93
-
94
95
data , err := afero .ReadFile (watcher .fs , f )
95
96
if os .IsNotExist (err ) || ! bytes .Equal (data , secret .Data [filename ]) {
96
- if err := afero .WriteFile (watcher .fs , f , secret .Data [filename ], 0666 ); err != nil {
97
- return false , err
98
- }
99
- } else {
100
- return false , err
97
+ return afero .WriteFile (watcher .fs , f , secret .Data [filename ], 0666 )
101
98
}
102
- return true , nil
99
+ return err
100
+
103
101
}
104
102
105
103
func (watcher * CertificateWatcher ) WaitForCertificates () {
106
- for threshold := time .Now ().Add (5 * time . Minute ); time .Now ().Before (threshold ); {
104
+ for threshold := time .Now ().Add (watcher . certificateTreshold ); time .Now ().Before (threshold ); {
107
105
108
106
if err := watcher .updateCertificatesFromSecret (); err != nil {
109
107
if k8serrors .IsNotFound (err ) {
@@ -120,10 +118,10 @@ func (watcher *CertificateWatcher) WaitForCertificates() {
120
118
}
121
119
122
120
func (watcher * CertificateWatcher ) ValidateCertificateExpiration (certData []byte , renewalThreshold time.Duration , now time.Time ) (bool , error ) {
123
- if block , _ := pem .Decode (certData ); block == nil {
121
+ if block , _ := watcher .Decode (certData ); block == nil {
124
122
watcher .Log .Error (errors .New ("can't decode PEM file" ), "failed to parse certificate" )
125
123
return false , nil
126
- } else if cert , err := x509 . ParseCertificate (block .Bytes ); err != nil {
124
+ } else if cert , err := watcher . Parse (block .Bytes ); err != nil {
127
125
watcher .Log .Error (err , "failed to parse certificate" )
128
126
return false , err
129
127
} else if now .After (cert .NotAfter .Add (- renewalThreshold )) {
0 commit comments