diff --git a/pkg/controller/certificates/cleaner/cleaner.go b/pkg/controller/certificates/cleaner/cleaner.go index 22e38936065..966131a95fd 100644 --- a/pkg/controller/certificates/cleaner/cleaner.go +++ b/pkg/controller/certificates/cleaner/cleaner.go @@ -47,6 +47,7 @@ const ( // cleaned up. approvedExpiration = 1 * time.Hour deniedExpiration = 1 * time.Hour + failedExpiration = 1 * time.Hour pendingExpiration = 24 * time.Hour ) @@ -108,7 +109,7 @@ func (ccc *CSRCleanerController) handle(csr *capi.CertificateSigningRequest) err if err != nil { return err } - if isIssuedPastDeadline(csr) || isDeniedPastDeadline(csr) || isPendingPastDeadline(csr) || isIssuedExpired { + if isIssuedPastDeadline(csr) || isDeniedPastDeadline(csr) || isFailedPastDeadline(csr) || isPendingPastDeadline(csr) || isIssuedExpired { if err := ccc.csrClient.Delete(context.TODO(), csr.Name, metav1.DeleteOptions{}); err != nil { return fmt.Errorf("unable to delete CSR %q: %v", csr.Name, err) } @@ -158,6 +159,19 @@ func isDeniedPastDeadline(csr *capi.CertificateSigningRequest) bool { return false } +// isFailedPastDeadline checks if the certificate has a Failed status and the +// creation time of the CSR is passed the deadline that pending requests are +// maintained for. +func isFailedPastDeadline(csr *capi.CertificateSigningRequest) bool { + for _, c := range csr.Status.Conditions { + if c.Type == capi.CertificateFailed && isOlderThan(c.LastUpdateTime, deniedExpiration) { + klog.Infof("Cleaning CSR %q as it is more than %v old and failed.", csr.Name, deniedExpiration) + return true + } + } + return false +} + // isIssuedPastDeadline checks if the certificate has an Issued status and the // creation time of the CSR is passed the deadline that issued requests are // maintained for. diff --git a/pkg/controller/certificates/cleaner/cleaner_test.go b/pkg/controller/certificates/cleaner/cleaner_test.go index 7a8d8f6e1d3..4d9303d0c11 100644 --- a/pkg/controller/certificates/cleaner/cleaner_test.go +++ b/pkg/controller/certificates/cleaner/cleaner_test.go @@ -124,6 +124,38 @@ func TestCleanerWithApprovedExpiredCSR(t *testing.T) { }, []string{"delete"}, }, + { + "no delete failed not passed deadline", + metav1.NewTime(time.Now().Add(-1 * time.Minute)), + nil, + []capi.CertificateSigningRequestCondition{ + { + Type: capi.CertificateApproved, + LastUpdateTime: metav1.NewTime(time.Now().Add(-2 * time.Hour)), + }, + { + Type: capi.CertificateFailed, + LastUpdateTime: metav1.NewTime(time.Now().Add(-50 * time.Minute)), + }, + }, + []string{}, + }, + { + "delete failed passed deadline", + metav1.NewTime(time.Now().Add(-1 * time.Minute)), + nil, + []capi.CertificateSigningRequestCondition{ + { + Type: capi.CertificateApproved, + LastUpdateTime: metav1.NewTime(time.Now().Add(-2 * time.Hour)), + }, + { + Type: capi.CertificateFailed, + LastUpdateTime: metav1.NewTime(time.Now().Add(-2 * time.Hour)), + }, + }, + []string{"delete"}, + }, { "no delete pending not passed deadline", metav1.NewTime(time.Now().Add(-5 * time.Hour)),