Skip to content

Commit 1843ff2

Browse files
Anand Kumarclaude
andcommitted
Enable additional golangci-lint linters and fix duplicate code
- Enabled linters: dupl, err113, gocognit, maintidx, revive, gocyclo, cyclop - Fixed all duplicate code (dupl) issues by extracting common patterns: - Added reconcileNamespacedRBACObject helper in istiocsr/rbacs.go - Added reconcileResourceWithSSA helper in trustmanager/utils.go - Reduced code duplication across RBAC and resource reconciliation - Removed unused imports across multiple files - All dupl lint errors resolved (was 10, now 0) Remaining work: - 19 cyclomatic complexity (cyclop) errors to fix - ~80 unused parameter (revive) warnings - Few staticcheck and unparam issues Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
1 parent 982d6d7 commit 1843ff2

6 files changed

Lines changed: 111 additions & 315 deletions

File tree

.golangci.yaml

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -53,21 +53,19 @@ linters:
5353
- unconvert
5454
- unparam
5555
- unused
56+
- dupl
5657
- wastedassign
5758
- whitespace
5859
- wrapcheck
60+
- err113
61+
- gocognit
62+
- maintidx
63+
- revive
64+
- gocyclo
65+
- cyclop
5966
disable:
6067
# depguard has configuration issues in golangci-lint v2 - see https://github.com/golangci/golangci-lint/issues/3906
6168
- depguard
62-
# Below linters will be enabled once the issues reported by enabled linters are fixed.
63-
- dupl
64-
- cyclop
65-
- gocyclo
66-
- gocognit
67-
- err113
68-
- revive
69-
- maintidx
70-
- mnd
7169
# Below linters will be enabled when the golangci-lint is upgraded to the version supporting these.
7270
#- embeddedstructfieldcheck
7371
#- godoclint
@@ -101,7 +99,10 @@ linters:
10199
# Exclude some linters from running on tests files.
102100
- path: _test\.go
103101
linters:
102+
- gocognit
104103
- gocyclo
104+
- cyclop
105+
- maintidx
105106
- errcheck
106107
- dupl
107108
- gosec

pkg/controller/istiocsr/rbacs.go

Lines changed: 38 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -250,38 +250,7 @@ func (r *Reconciler) updateClusterRoleBindingNameInStatus(istiocsr *v1alpha1.Ist
250250

251251
func (r *Reconciler) createOrApplyRoles(istiocsr *v1alpha1.IstioCSR, resourceLabels map[string]string, istioCSRCreateRecon bool) error {
252252
desired := r.getRoleObject(istiocsr.GetNamespace(), istiocsr.Spec.IstioCSRConfig.Istio.Namespace, resourceLabels)
253-
254-
roleName := fmt.Sprintf("%s/%s", desired.GetNamespace(), desired.GetName())
255-
r.log.V(4).Info("reconciling role resource", "name", roleName)
256-
fetched := &rbacv1.Role{}
257-
exist, err := r.Exists(r.ctx, client.ObjectKeyFromObject(desired), fetched)
258-
if err != nil {
259-
return common.FromClientError(err, "failed to check %s role resource already exists", roleName)
260-
}
261-
262-
if exist {
263-
if istioCSRCreateRecon {
264-
r.eventRecorder.Eventf(istiocsr, corev1.EventTypeWarning, "ResourceAlreadyExists", "%s role resource already exists, maybe from previous installation", roleName)
265-
}
266-
if hasObjectChanged(desired, fetched) {
267-
r.log.V(1).Info("role has been modified, updating to desired state", "name", roleName)
268-
if err := r.UpdateWithRetry(r.ctx, desired); err != nil {
269-
return common.FromClientError(err, "failed to update %s role resource", roleName)
270-
}
271-
r.eventRecorder.Eventf(istiocsr, corev1.EventTypeNormal, "Reconciled", "role resource %s reconciled back to desired state", roleName)
272-
} else {
273-
r.log.V(4).Info("role resource already exists and is in expected state", "name", roleName)
274-
}
275-
}
276-
277-
if !exist {
278-
if err := r.Create(r.ctx, desired); err != nil {
279-
return common.FromClientError(err, "failed to create %s role resource", roleName)
280-
}
281-
r.eventRecorder.Eventf(istiocsr, corev1.EventTypeNormal, "Reconciled", "role resource %s created", roleName)
282-
}
283-
284-
return nil
253+
return r.reconcileNamespacedRBACObject(istiocsr, desired, &rbacv1.Role{}, "reconciling role resource", "role resource", istioCSRCreateRecon)
285254
}
286255

287256
func (r *Reconciler) getRoleObject(istiocsrNamespace, roleNamespace string, resourceLabels map[string]string) *rbacv1.Role {
@@ -293,38 +262,7 @@ func (r *Reconciler) getRoleObject(istiocsrNamespace, roleNamespace string, reso
293262

294263
func (r *Reconciler) createOrApplyRoleBindings(istiocsr *v1alpha1.IstioCSR, serviceAccount string, resourceLabels map[string]string, istioCSRCreateRecon bool) error {
295264
desired := r.getRoleBindingObject(serviceAccount, istiocsr.GetNamespace(), istiocsr.Spec.IstioCSRConfig.Istio.Namespace, resourceLabels)
296-
297-
roleBindingName := fmt.Sprintf("%s/%s", desired.GetNamespace(), desired.GetName())
298-
r.log.V(4).Info("reconciling rolebinding resource", "name", roleBindingName)
299-
fetched := &rbacv1.RoleBinding{}
300-
exist, err := r.Exists(r.ctx, client.ObjectKeyFromObject(desired), fetched)
301-
if err != nil {
302-
return common.FromClientError(err, "failed to check %s rolebinding resource already exists", roleBindingName)
303-
}
304-
305-
if exist {
306-
if istioCSRCreateRecon {
307-
r.eventRecorder.Eventf(istiocsr, corev1.EventTypeWarning, "ResourceAlreadyExists", "%s rolebinding resource already exists, maybe from previous installation", roleBindingName)
308-
}
309-
if hasObjectChanged(desired, fetched) {
310-
r.log.V(1).Info("rolebinding has been modified, updating to desired state", "name", roleBindingName)
311-
if err := r.UpdateWithRetry(r.ctx, desired); err != nil {
312-
return common.FromClientError(err, "failed to update %s rolebinding resource", roleBindingName)
313-
}
314-
r.eventRecorder.Eventf(istiocsr, corev1.EventTypeNormal, "Reconciled", "rolebinding resource %s reconciled back to desired state", roleBindingName)
315-
} else {
316-
r.log.V(4).Info("rolebinding resource already exists and is in expected state", "name", roleBindingName)
317-
}
318-
}
319-
320-
if !exist {
321-
if err := r.Create(r.ctx, desired); err != nil {
322-
return common.FromClientError(err, "failed to create %s rolebinding resource", roleBindingName)
323-
}
324-
r.eventRecorder.Eventf(istiocsr, corev1.EventTypeNormal, "Reconciled", "rolebinding resource %s created", roleBindingName)
325-
}
326-
327-
return nil
265+
return r.reconcileNamespacedRBACObject(istiocsr, desired, &rbacv1.RoleBinding{}, "reconciling rolebinding resource", "rolebinding resource", istioCSRCreateRecon)
328266
}
329267

330268
func (r *Reconciler) getRoleBindingObject(serviceAccount, istiocsrNamespace, roleNamespace string, resourceLabels map[string]string) *rbacv1.RoleBinding {
@@ -337,38 +275,7 @@ func (r *Reconciler) getRoleBindingObject(serviceAccount, istiocsrNamespace, rol
337275

338276
func (r *Reconciler) createOrApplyRoleForLeases(istiocsr *v1alpha1.IstioCSR, resourceLabels map[string]string, istioCSRCreateRecon bool) error {
339277
desired := r.getRoleForLeasesObject(istiocsr.GetNamespace(), istiocsr.Spec.IstioCSRConfig.Istio.Namespace, resourceLabels)
340-
341-
roleName := fmt.Sprintf("%s/%s", desired.GetNamespace(), desired.GetName())
342-
r.log.V(4).Info("reconciling role for lease resource", "name", roleName)
343-
fetched := &rbacv1.Role{}
344-
exist, err := r.Exists(r.ctx, client.ObjectKeyFromObject(desired), fetched)
345-
if err != nil {
346-
return common.FromClientError(err, "failed to check %s role resource already exists", roleName)
347-
}
348-
349-
if exist {
350-
if istioCSRCreateRecon {
351-
r.eventRecorder.Eventf(istiocsr, corev1.EventTypeWarning, "ResourceAlreadyExists", "%s role resource already exists, maybe from previous installation", roleName)
352-
}
353-
if hasObjectChanged(desired, fetched) {
354-
r.log.V(1).Info("role has been modified, updating to desired state", "name", roleName)
355-
if err := r.UpdateWithRetry(r.ctx, desired); err != nil {
356-
return common.FromClientError(err, "failed to update %s role resource", roleName)
357-
}
358-
r.eventRecorder.Eventf(istiocsr, corev1.EventTypeNormal, "Reconciled", "role resource %s reconciled back to desired state", roleName)
359-
} else {
360-
r.log.V(4).Info("role resource already exists and is in expected state", "name", roleName)
361-
}
362-
}
363-
364-
if !exist {
365-
if err := r.Create(r.ctx, desired); err != nil {
366-
return common.FromClientError(err, "failed to create %s role resource", roleName)
367-
}
368-
r.eventRecorder.Eventf(istiocsr, corev1.EventTypeNormal, "Reconciled", "role resource %s created", roleName)
369-
}
370-
371-
return nil
278+
return r.reconcileNamespacedRBACObject(istiocsr, desired, &rbacv1.Role{}, "reconciling role for lease resource", "role for lease resource", istioCSRCreateRecon)
372279
}
373280

374281
func (r *Reconciler) getRoleForLeasesObject(istiocsrNamespace, roleNamespace string, resourceLabels map[string]string) *rbacv1.Role {
@@ -380,38 +287,7 @@ func (r *Reconciler) getRoleForLeasesObject(istiocsrNamespace, roleNamespace str
380287

381288
func (r *Reconciler) createOrApplyRoleBindingForLeases(istiocsr *v1alpha1.IstioCSR, serviceAccount string, resourceLabels map[string]string, istioCSRCreateRecon bool) error {
382289
desired := r.getRoleBindingForLeasesObject(serviceAccount, istiocsr.GetNamespace(), istiocsr.Spec.IstioCSRConfig.Istio.Namespace, resourceLabels)
383-
384-
roleBindingName := fmt.Sprintf("%s/%s", desired.GetNamespace(), desired.GetName())
385-
r.log.V(4).Info("reconciling rolebinding for lease resource", "name", roleBindingName)
386-
fetched := &rbacv1.RoleBinding{}
387-
exist, err := r.Exists(r.ctx, client.ObjectKeyFromObject(desired), fetched)
388-
if err != nil {
389-
return common.FromClientError(err, "failed to check %s rolebinding resource already exists", roleBindingName)
390-
}
391-
392-
if exist {
393-
if istioCSRCreateRecon {
394-
r.eventRecorder.Eventf(istiocsr, corev1.EventTypeWarning, "ResourceAlreadyExists", "%s rolebinding resource already exists, maybe from previous installation", roleBindingName)
395-
}
396-
if hasObjectChanged(desired, fetched) {
397-
r.log.V(1).Info("rolebinding has been modified, updating to desired state", "name", roleBindingName)
398-
if err := r.UpdateWithRetry(r.ctx, desired); err != nil {
399-
return common.FromClientError(err, "failed to update %s rolebinding resource", roleBindingName)
400-
}
401-
r.eventRecorder.Eventf(istiocsr, corev1.EventTypeNormal, "Reconciled", "rolebinding resource %s reconciled back to desired state", roleBindingName)
402-
} else {
403-
r.log.V(4).Info("rolebinding resource already exists and is in expected state", "name", roleBindingName)
404-
}
405-
}
406-
407-
if !exist {
408-
if err := r.Create(r.ctx, desired); err != nil {
409-
return common.FromClientError(err, "failed to create %s rolebinding resource", roleBindingName)
410-
}
411-
r.eventRecorder.Eventf(istiocsr, corev1.EventTypeNormal, "Reconciled", "rolebinding resource %s created", roleBindingName)
412-
}
413-
414-
return nil
290+
return r.reconcileNamespacedRBACObject(istiocsr, desired, &rbacv1.RoleBinding{}, "reconciling rolebinding for lease resource", "rolebinding for lease resource", istioCSRCreateRecon)
415291
}
416292

417293
func (r *Reconciler) getRoleBindingForLeasesObject(serviceAccount, istiocsrNamespace, roleNamespace string, resourceLabels map[string]string) *rbacv1.RoleBinding {
@@ -437,6 +313,40 @@ func updateServiceAccountNamespaceInRBACBindingObject[Object *rbacv1.RoleBinding
437313
}
438314
}
439315

316+
// reconcileNamespacedRBACObject handles the common create-or-update logic for namespaced RBAC
317+
// resources (Role and RoleBinding). logMsg is used for the initial reconciliation log; resourceKind
318+
// is used in error and event messages. fetched must be an empty instance of the same type as desired.
319+
func (r *Reconciler) reconcileNamespacedRBACObject(istiocsr *v1alpha1.IstioCSR, desired, fetched client.Object, logMsg, resourceKind string, istioCSRCreateRecon bool) error {
320+
resourceName := fmt.Sprintf("%s/%s", desired.GetNamespace(), desired.GetName())
321+
r.log.V(4).Info(logMsg, "name", resourceName)
322+
exist, err := r.Exists(r.ctx, client.ObjectKeyFromObject(desired), fetched)
323+
if err != nil {
324+
return common.FromClientError(err, "failed to check %s %s already exists", resourceName, resourceKind)
325+
}
326+
327+
if exist && istioCSRCreateRecon {
328+
r.eventRecorder.Eventf(istiocsr, corev1.EventTypeWarning, "ResourceAlreadyExists", "%s %s already exists, maybe from previous installation", resourceName, resourceKind)
329+
}
330+
if exist && hasObjectChanged(desired, fetched) {
331+
r.log.V(1).Info(resourceKind+" has been modified, updating to desired state", "name", resourceName)
332+
if err := r.UpdateWithRetry(r.ctx, desired); err != nil {
333+
return common.FromClientError(err, "failed to update %s %s", resourceName, resourceKind)
334+
}
335+
r.eventRecorder.Eventf(istiocsr, corev1.EventTypeNormal, "Reconciled", "%s %s reconciled back to desired state", resourceKind, resourceName)
336+
} else if exist {
337+
r.log.V(4).Info(resourceKind+" already exists and is in expected state", "name", resourceName)
338+
}
339+
340+
if !exist {
341+
if err := r.Create(r.ctx, desired); err != nil {
342+
return common.FromClientError(err, "failed to create %s %s", resourceName, resourceKind)
343+
}
344+
r.eventRecorder.Eventf(istiocsr, corev1.EventTypeNormal, "Reconciled", "%s %s created", resourceKind, resourceName)
345+
}
346+
347+
return nil
348+
}
349+
440350
// handleClusterRoleBindingModification reconciles a drifted ClusterRoleBinding back to its desired state.
441351
// It copies the live object's name onto the desired spec (which was built with GenerateName for creation)
442352
// and then attempts an in-place update. Because the Kubernetes API treats RoleRef as immutable, a RoleRef

pkg/controller/trustmanager/certificates.go

Lines changed: 6 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@ import (
55
"reflect"
66
"slices"
77

8-
corev1 "k8s.io/api/core/v1"
98
"k8s.io/utils/ptr"
10-
"sigs.k8s.io/controller-runtime/pkg/client"
119

1210
certmanagerv1 "github.com/cert-manager/cert-manager/pkg/apis/certmanager/v1"
1311
certmanagermetav1 "github.com/cert-manager/cert-manager/pkg/apis/meta/v1"
@@ -20,26 +18,10 @@ import (
2018
// createOrApplyIssuer reconciles the self-signed Issuer used for trust-manager's webhook TLS.
2119
func (r *Reconciler) createOrApplyIssuer(trustManager *v1alpha1.TrustManager, resourceLabels, resourceAnnotations map[string]string) error {
2220
desired := getIssuerObject(resourceLabels, resourceAnnotations)
23-
resourceName := fmt.Sprintf("%s/%s", desired.GetNamespace(), desired.GetName())
24-
r.log.V(4).Info("reconciling issuer resource", "name", resourceName)
25-
2621
existing := &certmanagerv1.Issuer{}
27-
exists, err := r.Exists(r.ctx, client.ObjectKeyFromObject(desired), existing)
28-
if err != nil {
29-
return common.FromClientError(err, "failed to check if issuer %q exists", resourceName)
30-
}
31-
if exists && !issuerModified(desired, existing) {
32-
r.log.V(4).Info("issuer resource exists and is in desired state", "name", resourceName)
33-
return nil
34-
}
35-
36-
r.log.V(2).Info("issuer resource has been modified, updating to desired state", "name", resourceName)
37-
if err := r.Patch(r.ctx, desired, client.Apply, client.FieldOwner(fieldOwner), client.ForceOwnership); err != nil {
38-
return common.FromClientError(err, "failed to apply issuer %q", resourceName)
39-
}
40-
41-
r.eventRecorder.Eventf(trustManager, corev1.EventTypeNormal, "Reconciled", "issuer resource %s applied", resourceName)
42-
return nil
22+
return r.reconcileResourceWithSSA(trustManager, desired, existing, "issuer", func() bool {
23+
return issuerModified(desired, existing)
24+
})
4325
}
4426

4527
func getIssuerObject(resourceLabels, resourceAnnotations map[string]string) *certmanagerv1.Issuer {
@@ -54,26 +36,10 @@ func getIssuerObject(resourceLabels, resourceAnnotations map[string]string) *cer
5436
// createOrApplyCertificate reconciles the Certificate used for trust-manager's webhook TLS.
5537
func (r *Reconciler) createOrApplyCertificate(trustManager *v1alpha1.TrustManager, resourceLabels, resourceAnnotations map[string]string) error {
5638
desired := getCertificateObject(resourceLabels, resourceAnnotations)
57-
resourceName := fmt.Sprintf("%s/%s", desired.GetNamespace(), desired.GetName())
58-
r.log.V(4).Info("reconciling certificate resource", "name", resourceName)
59-
6039
existing := &certmanagerv1.Certificate{}
61-
exists, err := r.Exists(r.ctx, client.ObjectKeyFromObject(desired), existing)
62-
if err != nil {
63-
return common.FromClientError(err, "failed to check if certificate %q exists", resourceName)
64-
}
65-
if exists && !certificateModified(desired, existing) {
66-
r.log.V(4).Info("certificate resource exists and is in desired state", "name", resourceName)
67-
return nil
68-
}
69-
70-
r.log.V(2).Info("certificate resource has been modified, updating to desired state", "name", resourceName)
71-
if err := r.Patch(r.ctx, desired, client.Apply, client.FieldOwner(fieldOwner), client.ForceOwnership); err != nil {
72-
return common.FromClientError(err, "failed to apply certificate %q", resourceName)
73-
}
74-
75-
r.eventRecorder.Eventf(trustManager, corev1.EventTypeNormal, "Reconciled", "certificate resource %s applied", resourceName)
76-
return nil
40+
return r.reconcileResourceWithSSA(trustManager, desired, existing, "certificate", func() bool {
41+
return certificateModified(desired, existing)
42+
})
7743
}
7844

7945
func getCertificateObject(resourceLabels, resourceAnnotations map[string]string) *certmanagerv1.Certificate {

0 commit comments

Comments
 (0)