Skip to content

Commit 2904b5e

Browse files
committed
CM-1113: Replace unsafe.Pointer casts with Kubernetes conversion functions
Replace raw unsafe.Pointer casts between corev1 and core types with the auto-generated conversion functions from k8s.io/kubernetes/pkg/apis/core/v1. This removes all unsafe imports from validation and deployment helper code while delegating type conversion to upstream-maintained functions.
1 parent db88f80 commit 2904b5e

3 files changed

Lines changed: 35 additions & 27 deletions

File tree

pkg/controller/certmanager/deployment_helper.go

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,13 @@ import (
44
"fmt"
55
"sort"
66
"strings"
7-
"unsafe"
87

98
corev1 "k8s.io/api/core/v1"
109
"k8s.io/apimachinery/pkg/labels"
11-
"k8s.io/kubernetes/pkg/apis/core"
1210
"k8s.io/kubernetes/pkg/util/tolerations"
1311

1412
"github.com/openshift/cert-manager-operator/api/operator/v1alpha1"
13+
"github.com/openshift/cert-manager-operator/pkg/controller/common"
1514
certmanagerinformer "github.com/openshift/cert-manager-operator/pkg/operator/informers/externalversions/operator/v1alpha1"
1615
)
1716

@@ -116,15 +115,11 @@ func mergePodScheduling(sourceScheduling v1alpha1.CertManagerScheduling, overrid
116115
// Merge the source and override NodeSelector.
117116
mergedNodeSelector := labels.Merge(sourceScheduling.NodeSelector, overrideScheduling.NodeSelector)
118117

119-
// Convert corev1.Tolerations to core.Tolerations.
120-
sourceTolerations := *(*[]core.Toleration)(unsafe.Pointer(&sourceScheduling.Tolerations))
121-
overridingTolerations := *(*[]core.Toleration)(unsafe.Pointer(&overrideScheduling.Tolerations))
122-
123-
// Merge the source and override Tolerations.
124-
mergedCoreTolerations := tolerations.MergeTolerations(sourceTolerations, overridingTolerations)
125-
126-
// Convert core.Tolerations to corev1.Tolerations.
127-
mergedCorev1Tolerations := *(*[]corev1.Toleration)(unsafe.Pointer(&mergedCoreTolerations))
118+
mergedCoreTolerations := tolerations.MergeTolerations(
119+
common.ToCoreTolerations(sourceScheduling.Tolerations),
120+
common.ToCoreTolerations(overrideScheduling.Tolerations),
121+
)
122+
mergedCorev1Tolerations := common.ToV1Tolerations(mergedCoreTolerations)
128123

129124
return v1alpha1.CertManagerScheduling{
130125
NodeSelector: mergedNodeSelector,

pkg/controller/certmanager/deployment_overrides_validation.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,19 @@ package certmanager
22

33
import (
44
"fmt"
5-
"unsafe"
65

76
appsv1 "k8s.io/api/apps/v1"
87
corev1 "k8s.io/api/core/v1"
98
metav1validation "k8s.io/apimachinery/pkg/apis/meta/v1/validation"
109
utilerrors "k8s.io/apimachinery/pkg/util/errors"
1110
"k8s.io/apimachinery/pkg/util/validation/field"
12-
"k8s.io/kubernetes/pkg/apis/core"
1311
corevalidation "k8s.io/kubernetes/pkg/apis/core/validation"
1412
"k8s.io/utils/strings/slices"
1513

1614
operatorv1 "github.com/openshift/api/operator/v1"
1715

1816
"github.com/openshift/cert-manager-operator/api/operator/v1alpha1"
17+
"github.com/openshift/cert-manager-operator/pkg/controller/common"
1918
certmanagerinformer "github.com/openshift/cert-manager-operator/pkg/operator/informers/externalversions/operator/v1alpha1"
2019
)
2120

@@ -300,10 +299,7 @@ func withPodSchedulingValidateHook(certmanagerinformer certmanagerinformer.CertM
300299
func validateScheduling(scheduling v1alpha1.CertManagerScheduling, fldPath *field.Path) error {
301300
errs := metav1validation.ValidateLabels(scheduling.NodeSelector, fldPath.Child("nodeSelector"))
302301

303-
// Convert corev1.Tolerations to core.Tolerations.
304-
tolerations := *(*[]core.Toleration)(unsafe.Pointer(&scheduling.Tolerations))
305-
306-
errs = append(errs, corevalidation.ValidateTolerations(tolerations, fldPath.Child("tolerations"))...)
302+
errs = append(errs, corevalidation.ValidateTolerations(common.ToCoreTolerations(scheduling.Tolerations), fldPath.Child("tolerations"))...)
307303

308304
return errs.ToAggregate()
309305
}

pkg/controller/common/validation.go

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
package common
22

33
import (
4-
"unsafe"
5-
64
corev1 "k8s.io/api/core/v1"
75
apivalidation "k8s.io/apimachinery/pkg/api/validation"
86
metav1validation "k8s.io/apimachinery/pkg/apis/meta/v1/validation"
97
"k8s.io/apimachinery/pkg/util/validation/field"
108
"k8s.io/kubernetes/pkg/apis/core"
9+
corev1conversion "k8s.io/kubernetes/pkg/apis/core/v1"
1110
corevalidation "k8s.io/kubernetes/pkg/apis/core/validation"
1211
)
1312

@@ -20,25 +19,23 @@ func ValidateNodeSelectorConfig(nodeSelector map[string]string, fldPath *field.P
2019
// ValidateTolerationsConfig validates the Tolerations configuration using
2120
// the Kubernetes core toleration validation rules.
2221
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()
22+
return corevalidation.ValidateTolerations(ToCoreTolerations(tolerations), fldPath.Child("tolerations")).ToAggregate()
2623
}
2724

2825
// ValidateResourceRequirements validates the ResourceRequirements configuration
2926
// using the Kubernetes core resource requirements validation rules.
3027
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))
28+
var convRequirements core.ResourceRequirements
29+
_ = corev1conversion.Convert_v1_ResourceRequirements_To_core_ResourceRequirements(&requirements, &convRequirements, nil)
3330
return corevalidation.ValidateContainerResourceRequirements(&convRequirements, nil, fldPath.Child("resources"), corevalidation.PodValidationOptions{}).ToAggregate()
3431
}
3532

3633
// ValidateAffinityRules validates the Affinity configuration using
3734
// the Kubernetes core affinity validation rules.
3835
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()
36+
var convAffinity core.Affinity
37+
_ = corev1conversion.Convert_v1_Affinity_To_core_Affinity(affinity, &convAffinity, nil)
38+
return validateAffinity(&convAffinity, corevalidation.PodValidationOptions{}, fldPath.Child("affinity")).ToAggregate()
4239
}
4340

4441
// ValidateLabelsConfig validates label keys and values using the Kubernetes
@@ -52,3 +49,23 @@ func ValidateLabelsConfig(labels map[string]string, fldPath *field.Path) error {
5249
func ValidateAnnotationsConfig(annotations map[string]string, fldPath *field.Path) error {
5350
return apivalidation.ValidateAnnotations(annotations, fldPath.Child("annotations")).ToAggregate()
5451
}
52+
53+
// ToCoreTolerations converts a slice of corev1.Toleration to core.Toleration
54+
// using Kubernetes' auto-generated conversion functions.
55+
func ToCoreTolerations(in []corev1.Toleration) []core.Toleration {
56+
out := make([]core.Toleration, len(in))
57+
for i := range in {
58+
_ = corev1conversion.Convert_v1_Toleration_To_core_Toleration(&in[i], &out[i], nil)
59+
}
60+
return out
61+
}
62+
63+
// ToV1Tolerations converts a slice of core.Toleration to corev1.Toleration
64+
// using Kubernetes' auto-generated conversion functions.
65+
func ToV1Tolerations(in []core.Toleration) []corev1.Toleration {
66+
out := make([]corev1.Toleration, len(in))
67+
for i := range in {
68+
_ = corev1conversion.Convert_core_Toleration_To_v1_Toleration(&in[i], &out[i], nil)
69+
}
70+
return out
71+
}

0 commit comments

Comments
 (0)