@@ -41,6 +41,8 @@ import (
4141
4242var (
4343 kubeconfig , namespace , secret , service string
44+ days int
45+ forceRenewal bool
4446 csrNameTemplate0 = "${service}"
4547 csrNameTemplate1 = "${service}.${namespace}"
4648 csrNameTemplate2 = "${service}.${namespace}.svc"
@@ -128,12 +130,45 @@ Usage:
128130 },
129131 }
130132
131- log .Println ("Certificate signing request, status: Deleting " )
132- err = certificateSigningRequestsClient .Delete (context .TODO (), csrNameWithServiceAndNamespace , metav1.DeleteOptions {})
133+ log .Println ("Certificate signing request, status: Retrieving " )
134+ csExistInCluster , err : = certificateSigningRequestsClient .Get (context .TODO (), csrNameWithServiceAndNamespace , metav1.GetOptions {})
133135 if err != nil {
134- log .Printf ("Delete CertificateSigningRequest - error occurred, detail: %v, but ignored" , err )
136+ log .Printf ("Get CertificateSigningRequest - error occurred, detail: %v, but ignored" , err )
135137 }
136138
139+ if csExistInCluster .Status .Certificate != nil {
140+ log .Println ("Certificate signing request, status: Retrieved" )
141+ certificateAlreadyCreated := csExistInCluster .Status .Certificate
142+ block , _ := pem .Decode (certificateAlreadyCreated )
143+ cert , err := x509 .ParseCertificate (block .Bytes )
144+ if err != nil {
145+ log .Fatalf ("x509.ParseCertificate - error occurred, detail: %v" , err )
146+ }
147+ log .Println ("Certificate signing request, status: Checking NotAfter date" )
148+
149+ validForDays := int (cert .NotAfter .Sub (time .Now ()).Hours () / 24 )
150+ log .Printf ("Certificate signing request - status: This certificate valid for %d days" , validForDays )
151+
152+ expired := validForDays <= days
153+ log .Printf ("Certificate signing request - status: Renewal necessary %t" , expired || forceRenewal )
154+
155+ log .Printf ("Certificate signing request, status: Expired %t" , expired )
156+ log .Printf ("Certificate signing request, status: Force renewal %t" , forceRenewal )
157+ if expired || forceRenewal {
158+ log .Println ("Certificate signing request, status: Renewal process started" )
159+ log .Println ("Certificate signing request, status: Deleting" )
160+ err = certificateSigningRequestsClient .Delete (context .TODO (), csrNameWithServiceAndNamespace , metav1.DeleteOptions {})
161+ if err != nil {
162+ log .Fatalf ("Delete CertificateSigningRequest - error occurred, detail: %v, but ignored" , err )
163+ }
164+ log .Println ("Certificate signing request, status: Deleted" )
165+ } else {
166+ log .Println ("Certificate signing request, status: Renewal process is not necessary, skipped" )
167+ os .Exit (0 )
168+ }
169+ }
170+ log .Println ("Certificate signing request, status: Not Retrieved" )
171+
137172 log .Println ("Certificate signing request, status: Creating" )
138173 csr , err := certificateSigningRequestsClient .Create (context .TODO (), certificateSigningRequest , metav1.CreateOptions {})
139174 if err != nil {
@@ -213,7 +248,7 @@ Usage:
213248 } else {
214249 log .Println ("Secret, status: Updated" )
215250 }
216-
251+
217252 log .Printf ("Done in %d milliseconds" , time .Since (start ).Milliseconds ())
218253 },
219254}
@@ -243,6 +278,8 @@ func init() {
243278 rootCmd .Flags ().StringVarP (& service , "service" , "s" , "" , "Service name of webhook." )
244279 rootCmd .Flags ().StringVarP (& secret , "secret" , "t" , "tls-secret" , "Secret name for CA certificate and server certificate/key pair." )
245280 rootCmd .Flags ().StringVarP (& kubeconfig , "kubeconfig" , "k" , "" , "kubeconfig path" )
281+ rootCmd .Flags ().IntVarP (& days , "days" , "d" , 1 , "the number of days remaining for certificate renewal" )
282+ rootCmd .Flags ().BoolVarP (& forceRenewal , "force" , "f" , false , "enable force renewal before expiration time" )
246283
247284 _ = rootCmd .MarkFlagRequired ("service" )
248285}
0 commit comments