Skip to content

Commit 88f97b2

Browse files
committed
Address review comments
Signed-off-by: chiragkyal <ckyal@redhat.com>
1 parent 4f3c5f7 commit 88f97b2

18 files changed

Lines changed: 308 additions & 113 deletions

pkg/controller/istiocsr/core_validation_helpers_duplication.go renamed to pkg/controller/common/core_validation_helpers.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package istiocsr
1+
package common
22

33
import (
44
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -13,6 +13,7 @@ import (
1313
* Methods here are the replicates of the methods defined in k8s.io/kubernetes/pkg/apis/core/validation package, which
1414
* is done just because of the lack of better alternative to use private methods.
1515
* TODO: Remove this source file when validateAffinity method is made public.
16+
* Upstream tracker: https://github.com/kubernetes/kubernetes/issues/136422
1617
*/
1718

1819
// validateAffinity checks if given affinities are valid.
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package common
2+
3+
import (
4+
"unsafe"
5+
6+
corev1 "k8s.io/api/core/v1"
7+
apivalidation "k8s.io/apimachinery/pkg/api/validation"
8+
metav1validation "k8s.io/apimachinery/pkg/apis/meta/v1/validation"
9+
"k8s.io/apimachinery/pkg/util/validation/field"
10+
"k8s.io/kubernetes/pkg/apis/core"
11+
corevalidation "k8s.io/kubernetes/pkg/apis/core/validation"
12+
)
13+
14+
// ValidateNodeSelectorConfig validates the NodeSelector configuration using
15+
// the Kubernetes label validation rules.
16+
func ValidateNodeSelectorConfig(nodeSelector map[string]string, fldPath *field.Path) error {
17+
return metav1validation.ValidateLabels(nodeSelector, fldPath.Child("nodeSelector")).ToAggregate()
18+
}
19+
20+
// ValidateTolerationsConfig validates the Tolerations configuration using
21+
// the Kubernetes core toleration validation rules.
22+
func ValidateTolerationsConfig(tolerations []corev1.Toleration, fldPath *field.Path) error {
23+
// convert corev1.Tolerations to core.Tolerations, required for validation.
24+
convTolerations := *(*[]core.Toleration)(unsafe.Pointer(&tolerations))
25+
return corevalidation.ValidateTolerations(convTolerations, fldPath.Child("tolerations")).ToAggregate()
26+
}
27+
28+
// ValidateResourceRequirements validates the ResourceRequirements configuration
29+
// using the Kubernetes core resource requirements validation rules.
30+
func ValidateResourceRequirements(requirements corev1.ResourceRequirements, fldPath *field.Path) error {
31+
// convert corev1.ResourceRequirements to core.ResourceRequirements, required for validation.
32+
convRequirements := *(*core.ResourceRequirements)(unsafe.Pointer(&requirements))
33+
return corevalidation.ValidateContainerResourceRequirements(&convRequirements, nil, fldPath.Child("resources"), corevalidation.PodValidationOptions{}).ToAggregate()
34+
}
35+
36+
// ValidateAffinityRules validates the Affinity configuration using
37+
// the Kubernetes core affinity validation rules.
38+
func ValidateAffinityRules(affinity *corev1.Affinity, fldPath *field.Path) error {
39+
// convert corev1.Affinity to core.Affinity, required for validation.
40+
convAffinity := (*core.Affinity)(unsafe.Pointer(affinity))
41+
return validateAffinity(convAffinity, corevalidation.PodValidationOptions{}, fldPath.Child("affinity")).ToAggregate()
42+
}
43+
44+
// ValidateLabelsConfig validates label keys and values using the Kubernetes
45+
// metadata validation rules.
46+
func ValidateLabelsConfig(labels map[string]string, fldPath *field.Path) error {
47+
return metav1validation.ValidateLabels(labels, fldPath.Child("labels")).ToAggregate()
48+
}
49+
50+
// ValidateAnnotationsConfig validates annotation keys and sizes using the
51+
// Kubernetes metadata validation rules.
52+
func ValidateAnnotationsConfig(annotations map[string]string, fldPath *field.Path) error {
53+
return apivalidation.ValidateAnnotations(annotations, fldPath.Child("annotations")).ToAggregate()
54+
}

pkg/controller/istiocsr/deployments.go

Lines changed: 4 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,12 @@ import (
77
"os"
88
"reflect"
99
"strings"
10-
"unsafe"
1110

1211
appsv1 "k8s.io/api/apps/v1"
1312
corev1 "k8s.io/api/core/v1"
1413
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
15-
metav1validation "k8s.io/apimachinery/pkg/apis/meta/v1/validation"
1614
"k8s.io/apimachinery/pkg/types"
1715
"k8s.io/apimachinery/pkg/util/validation/field"
18-
"k8s.io/kubernetes/pkg/apis/core"
19-
corevalidation "k8s.io/kubernetes/pkg/apis/core/validation"
2016
"sigs.k8s.io/controller-runtime/pkg/client"
2117

2218
certmanagerv1 "github.com/cert-manager/cert-manager/pkg/apis/certmanager/v1"
@@ -188,7 +184,7 @@ func updateResourceRequirement(deployment *appsv1.Deployment, istiocsr *v1alpha1
188184
if reflect.ValueOf(istiocsr.Spec.IstioCSRConfig.Resources).IsZero() {
189185
return nil
190186
}
191-
if err := validateResourceRequirements(istiocsr.Spec.IstioCSRConfig.Resources,
187+
if err := common.ValidateResourceRequirements(istiocsr.Spec.IstioCSRConfig.Resources,
192188
field.NewPath("spec", "istioCSRConfig")); err != nil {
193189
return err
194190
}
@@ -202,7 +198,7 @@ func updateAffinityRules(deployment *appsv1.Deployment, istiocsr *v1alpha1.Istio
202198
if istiocsr.Spec.IstioCSRConfig.Affinity == nil {
203199
return nil
204200
}
205-
if err := validateAffinityRules(istiocsr.Spec.IstioCSRConfig.Affinity,
201+
if err := common.ValidateAffinityRules(istiocsr.Spec.IstioCSRConfig.Affinity,
206202
field.NewPath("spec", "istioCSRConfig")); err != nil {
207203
return err
208204
}
@@ -214,7 +210,7 @@ func updatePodTolerations(deployment *appsv1.Deployment, istiocsr *v1alpha1.Isti
214210
if istiocsr.Spec.IstioCSRConfig.Tolerations == nil {
215211
return nil
216212
}
217-
if err := validateTolerationsConfig(istiocsr.Spec.IstioCSRConfig.Tolerations,
213+
if err := common.ValidateTolerationsConfig(istiocsr.Spec.IstioCSRConfig.Tolerations,
218214
field.NewPath("spec", "istioCSRConfig")); err != nil {
219215
return err
220216
}
@@ -226,7 +222,7 @@ func updateNodeSelector(deployment *appsv1.Deployment, istiocsr *v1alpha1.IstioC
226222
if istiocsr.Spec.IstioCSRConfig.NodeSelector == nil {
227223
return nil
228224
}
229-
if err := validateNodeSelectorConfig(istiocsr.Spec.IstioCSRConfig.NodeSelector,
225+
if err := common.ValidateNodeSelectorConfig(istiocsr.Spec.IstioCSRConfig.NodeSelector,
230226
field.NewPath("spec", "istioCSRConfig")); err != nil {
231227
return err
232228
}
@@ -642,25 +638,3 @@ func (r *Reconciler) updateWatchLabel(obj client.Object, istiocsr *v1alpha1.Isti
642638
return nil
643639
}
644640

645-
// validateNodeSelectorConfig validates the NodeSelector configuration.
646-
func validateNodeSelectorConfig(nodeSelector map[string]string, fldPath *field.Path) error {
647-
return metav1validation.ValidateLabels(nodeSelector, fldPath.Child("nodeSelector")).ToAggregate()
648-
}
649-
650-
func validateTolerationsConfig(tolerations []corev1.Toleration, fldPath *field.Path) error {
651-
// convert corev1.Tolerations to core.Tolerations, required for validation.
652-
convTolerations := *(*[]core.Toleration)(unsafe.Pointer(&tolerations))
653-
return corevalidation.ValidateTolerations(convTolerations, fldPath.Child("tolerations")).ToAggregate()
654-
}
655-
656-
func validateResourceRequirements(requirements corev1.ResourceRequirements, fldPath *field.Path) error {
657-
// convert corev1.ResourceRequirements to core.ResourceRequirements, required for validation.
658-
convRequirements := *(*core.ResourceRequirements)(unsafe.Pointer(&requirements))
659-
return corevalidation.ValidateContainerResourceRequirements(&convRequirements, nil, fldPath.Child("resources"), corevalidation.PodValidationOptions{}).ToAggregate()
660-
}
661-
662-
func validateAffinityRules(affinity *corev1.Affinity, fldPath *field.Path) error {
663-
// convert corev1.Affinity to core.Affinity, required for validation.
664-
convAffinity := (*core.Affinity)(unsafe.Pointer(affinity))
665-
return validateAffinity(convAffinity, corevalidation.PodValidationOptions{}, fldPath.Child("affinity")).ToAggregate()
666-
}

pkg/controller/trustmanager/certificates.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,16 @@ func (r *Reconciler) createOrApplyIssuer(trustManager *v1alpha1.TrustManager, re
2929
return common.FromClientError(err, "failed to check if issuer %q exists", resourceName)
3030
}
3131
if exists && !issuerModified(desired, existing) {
32-
r.log.V(4).Info("issuer already matches desired state, skipping apply", "name", resourceName)
32+
r.log.V(4).Info("issuer resource exists and is in desired state", "name", resourceName)
3333
return nil
3434
}
3535

36+
r.log.V(2).Info("issuer resource has been modified, updating to desired state", "name", resourceName)
3637
if err := r.Patch(r.ctx, desired, client.Apply, client.FieldOwner(fieldOwner), client.ForceOwnership); err != nil {
3738
return common.FromClientError(err, "failed to apply issuer %q", resourceName)
3839
}
3940

4041
r.eventRecorder.Eventf(trustManager, corev1.EventTypeNormal, "Reconciled", "issuer resource %s applied", resourceName)
41-
r.log.V(2).Info("applied issuer", "name", resourceName)
4242
return nil
4343
}
4444

@@ -63,16 +63,16 @@ func (r *Reconciler) createOrApplyCertificate(trustManager *v1alpha1.TrustManage
6363
return common.FromClientError(err, "failed to check if certificate %q exists", resourceName)
6464
}
6565
if exists && !certificateModified(desired, existing) {
66-
r.log.V(4).Info("certificate already matches desired state, skipping apply", "name", resourceName)
66+
r.log.V(4).Info("certificate resource exists and is in desired state", "name", resourceName)
6767
return nil
6868
}
6969

70+
r.log.V(2).Info("certificate resource has been modified, updating to desired state", "name", resourceName)
7071
if err := r.Patch(r.ctx, desired, client.Apply, client.FieldOwner(fieldOwner), client.ForceOwnership); err != nil {
7172
return common.FromClientError(err, "failed to apply certificate %q", resourceName)
7273
}
7374

7475
r.eventRecorder.Eventf(trustManager, corev1.EventTypeNormal, "Reconciled", "certificate resource %s applied", resourceName)
75-
r.log.V(2).Info("applied certificate", "name", resourceName)
7676
return nil
7777
}
7878

pkg/controller/trustmanager/constants.go

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package trustmanager
33
import (
44
"os"
55
"time"
6+
7+
"k8s.io/apimachinery/pkg/util/validation/field"
68
)
79

810
const (
@@ -12,10 +14,6 @@ const (
1214
// ControllerName is the name of the controller used in logs and events.
1315
ControllerName = trustManagerCommonName + "-controller"
1416

15-
// controllerProcessedAnnotation is the annotation added to trustmanager resource once after
16-
// successful reconciliation by the controller.
17-
controllerProcessedAnnotation = "operator.openshift.io/trust-manager-processed"
18-
1917
// finalizer name for trustmanager.openshift.operator.io resource.
2018
finalizer = "trustmanager.openshift.operator.io/" + ControllerName
2119

@@ -55,29 +53,33 @@ const (
5553
// These must be set explicitly on each resource's .metadata.name and on every
5654
// field in other resources that references them.
5755
const (
58-
trustManagerServiceAccountName = "trust-manager"
59-
trustManagerDeploymentName = "trust-manager"
56+
trustManagerCommonResourceName = "trust-manager"
57+
58+
trustManagerServiceAccountName = trustManagerCommonResourceName
59+
trustManagerDeploymentName = trustManagerCommonResourceName
6060

61-
trustManagerServiceName = "trust-manager"
62-
trustManagerMetricsServiceName = "trust-manager-metrics"
61+
trustManagerServiceName = trustManagerCommonResourceName
62+
trustManagerMetricsServiceName = trustManagerCommonResourceName + "-metrics"
6363

64-
trustManagerClusterRoleName = "trust-manager"
65-
trustManagerClusterRoleBindingName = "trust-manager"
64+
trustManagerClusterRoleName = trustManagerCommonResourceName
65+
trustManagerClusterRoleBindingName = trustManagerCommonResourceName
6666

67-
trustManagerRoleName = "trust-manager"
68-
trustManagerRoleBindingName = "trust-manager"
67+
trustManagerRoleName = trustManagerCommonResourceName
68+
trustManagerRoleBindingName = trustManagerCommonResourceName
6969

70-
trustManagerLeaderElectionRoleName = "trust-manager:leaderelection"
71-
trustManagerLeaderElectionRoleBindingName = "trust-manager:leaderelection"
70+
trustManagerLeaderElectionRoleName = trustManagerCommonResourceName + ":leaderelection"
71+
trustManagerLeaderElectionRoleBindingName = trustManagerCommonResourceName + ":leaderelection"
7272

73-
trustManagerIssuerName = "trust-manager"
74-
trustManagerCertificateName = "trust-manager"
75-
trustManagerTLSSecretName = "trust-manager-tls"
73+
trustManagerIssuerName = trustManagerCommonResourceName
74+
trustManagerCertificateName = trustManagerCommonResourceName
75+
trustManagerTLSSecretName = trustManagerCommonResourceName + "-tls"
7676

77-
trustManagerWebhookConfigName = "trust-manager"
77+
trustManagerWebhookConfigName = trustManagerCommonResourceName
7878
)
7979

8080
var (
81+
trustManagerConfigFieldPath = field.NewPath("spec", "trustManagerConfig")
82+
controllerConfigFieldPath = field.NewPath("spec", "controllerConfig")
8183
controllerDefaultResourceLabels = map[string]string{
8284
"app": trustManagerCommonName,
8385
"app.kubernetes.io/name": trustManagerCommonName,

pkg/controller/trustmanager/controller.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package trustmanager
33
import (
44
"context"
55
"fmt"
6-
"reflect"
76

87
admissionregistrationv1 "k8s.io/api/admissionregistration/v1"
98
appsv1 "k8s.io/api/apps/v1"
@@ -178,10 +177,6 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu
178177
}
179178

180179
func (r *Reconciler) processReconcileRequest(trustManager *v1alpha1.TrustManager, req types.NamespacedName) (ctrl.Result, error) {
181-
if !containsProcessedAnnotation(trustManager) && reflect.DeepEqual(trustManager.Status, v1alpha1.TrustManagerStatus{}) {
182-
r.log.V(1).Info("starting reconciliation of newly created trustmanager", "name", trustManager.GetName())
183-
}
184-
185180
reconcileErr := r.reconcileTrustManagerDeployment(trustManager)
186181
if reconcileErr != nil {
187182
r.log.Error(reconcileErr, "failed to reconcile TrustManager deployment", "request", req)

pkg/controller/trustmanager/deployments.go

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,16 @@ func (r *Reconciler) createOrApplyDeployment(trustManager *v1alpha1.TrustManager
3232
return common.FromClientError(err, "failed to check if deployment %q exists", deploymentName)
3333
}
3434
if exists && !deploymentModified(desired, existing) {
35-
r.log.V(4).Info("deployment already matches desired state, skipping apply", "name", deploymentName)
35+
r.log.V(4).Info("deployment resource exists and is in desired state", "name", deploymentName)
3636
return nil
3737
}
3838

39+
r.log.V(2).Info("deployment resource has been modified, updating to desired state", "name", deploymentName)
3940
if err := r.Patch(r.ctx, desired, client.Apply, client.FieldOwner(fieldOwner), client.ForceOwnership); err != nil {
4041
return common.FromClientError(err, "failed to apply deployment %q", deploymentName)
4142
}
4243

4344
r.eventRecorder.Eventf(trustManager, corev1.EventTypeNormal, "Reconciled", "deployment resource %s applied", deploymentName)
44-
r.log.V(2).Info("applied deployment", "name", deploymentName)
4545
return nil
4646
}
4747

@@ -66,10 +66,18 @@ func (r *Reconciler) getDeploymentObject(trustManager *v1alpha1.TrustManager, re
6666
return nil, common.NewIrrecoverableError(err, "failed to update trust-manager image")
6767
}
6868

69-
updateResourceRequirements(deployment, trustManager)
70-
updateAffinityRules(deployment, trustManager)
71-
updatePodTolerations(deployment, trustManager)
72-
updateNodeSelector(deployment, trustManager)
69+
if err := updateResourceRequirements(deployment, trustManager); err != nil {
70+
return nil, err
71+
}
72+
if err := updateAffinityRules(deployment, trustManager); err != nil {
73+
return nil, err
74+
}
75+
if err := updatePodTolerations(deployment, trustManager); err != nil {
76+
return nil, err
77+
}
78+
if err := updateNodeSelector(deployment, trustManager); err != nil {
79+
return nil, err
80+
}
7381

7482
return deployment, nil
7583
}
@@ -146,35 +154,50 @@ func updateImage(deployment *appsv1.Deployment) error {
146154
return nil
147155
}
148156

149-
func updateResourceRequirements(deployment *appsv1.Deployment, trustManager *v1alpha1.TrustManager) {
157+
func updateResourceRequirements(deployment *appsv1.Deployment, trustManager *v1alpha1.TrustManager) error {
150158
resources := trustManager.Spec.TrustManagerConfig.Resources
151159
if len(resources.Limits) == 0 && len(resources.Requests) == 0 {
152-
return
160+
return nil
161+
}
162+
if err := common.ValidateResourceRequirements(resources, trustManagerConfigFieldPath); err != nil {
163+
return err
153164
}
154165
for i := range deployment.Spec.Template.Spec.Containers {
155166
if deployment.Spec.Template.Spec.Containers[i].Name == trustManagerContainerName {
156167
deployment.Spec.Template.Spec.Containers[i].Resources = resources
157168
}
158169
}
170+
return nil
159171
}
160172

161-
func updateAffinityRules(deployment *appsv1.Deployment, trustManager *v1alpha1.TrustManager) {
173+
func updateAffinityRules(deployment *appsv1.Deployment, trustManager *v1alpha1.TrustManager) error {
162174
if trustManager.Spec.TrustManagerConfig.Affinity == nil {
163-
return
175+
return nil
176+
}
177+
if err := common.ValidateAffinityRules(trustManager.Spec.TrustManagerConfig.Affinity, trustManagerConfigFieldPath); err != nil {
178+
return err
164179
}
165180
deployment.Spec.Template.Spec.Affinity = trustManager.Spec.TrustManagerConfig.Affinity
181+
return nil
166182
}
167183

168-
func updatePodTolerations(deployment *appsv1.Deployment, trustManager *v1alpha1.TrustManager) {
184+
func updatePodTolerations(deployment *appsv1.Deployment, trustManager *v1alpha1.TrustManager) error {
169185
if trustManager.Spec.TrustManagerConfig.Tolerations == nil {
170-
return
186+
return nil
187+
}
188+
if err := common.ValidateTolerationsConfig(trustManager.Spec.TrustManagerConfig.Tolerations, trustManagerConfigFieldPath); err != nil {
189+
return err
171190
}
172191
deployment.Spec.Template.Spec.Tolerations = trustManager.Spec.TrustManagerConfig.Tolerations
192+
return nil
173193
}
174194

175-
func updateNodeSelector(deployment *appsv1.Deployment, trustManager *v1alpha1.TrustManager) {
195+
func updateNodeSelector(deployment *appsv1.Deployment, trustManager *v1alpha1.TrustManager) error {
176196
if trustManager.Spec.TrustManagerConfig.NodeSelector == nil {
177-
return
197+
return nil
198+
}
199+
if err := common.ValidateNodeSelectorConfig(trustManager.Spec.TrustManagerConfig.NodeSelector, trustManagerConfigFieldPath); err != nil {
200+
return err
178201
}
179202
if deployment.Spec.Template.Spec.NodeSelector == nil {
180203
deployment.Spec.Template.Spec.NodeSelector = make(map[string]string)
@@ -184,6 +207,7 @@ func updateNodeSelector(deployment *appsv1.Deployment, trustManager *v1alpha1.Tr
184207
for k, v := range trustManager.Spec.TrustManagerConfig.NodeSelector {
185208
deployment.Spec.Template.Spec.NodeSelector[k] = v
186209
}
210+
return nil
187211
}
188212

189213
func updateServiceAccountName(deployment *appsv1.Deployment) {

0 commit comments

Comments
 (0)