2016-09-24 23:25:31 -04:00
/ *
2016-09-25 12:09:52 -04:00
Copyright 2016 The Kubernetes Authors .
2016-09-24 23:25:31 -04:00
Licensed under the Apache License , Version 2.0 ( the "License" ) ;
you may not use this file except in compliance with the License .
You may obtain a copy of the License at
http : //www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing , software
distributed under the License is distributed on an "AS IS" BASIS ,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
See the License for the specific language governing permissions and
limitations under the License .
* /
2017-10-09 09:53:03 -04:00
package testing
2016-09-24 23:25:31 -04:00
import (
"math/rand"
"reflect"
"sort"
"testing"
2021-03-17 05:35:21 -04:00
"github.com/google/go-cmp/cmp"
2025-02-20 12:45:22 -05:00
"sigs.k8s.io/randfill"
2016-09-24 23:25:31 -04:00
2017-04-21 13:35:43 -04:00
apiv1 "k8s.io/api/core/v1"
extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
2019-05-30 18:28:21 -04:00
"k8s.io/apimachinery/pkg/api/apitesting/roundtrip"
2017-01-11 09:09:48 -05:00
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
2017-10-16 07:41:50 -04:00
"k8s.io/kubernetes/pkg/api/legacyscheme"
2016-09-24 23:25:31 -04:00
)
2016-11-20 21:55:31 -05:00
type orderedGroupVersionKinds [ ] schema . GroupVersionKind
2016-09-24 23:25:31 -04:00
func ( o orderedGroupVersionKinds ) Len ( ) int { return len ( o ) }
func ( o orderedGroupVersionKinds ) Swap ( i , j int ) { o [ i ] , o [ j ] = o [ j ] , o [ i ] }
func ( o orderedGroupVersionKinds ) Less ( i , j int ) bool {
return o [ i ] . String ( ) < o [ j ] . String ( )
}
2016-09-25 12:09:52 -04:00
// TODO: add a reflexive test that verifies that all SetDefaults functions are registered
2016-09-24 23:25:31 -04:00
func TestDefaulting ( t * testing . T ) {
2016-09-25 12:09:52 -04:00
// these are the known types with defaulters - you must add to this list if you add a top level defaulter
2016-11-20 21:55:31 -05:00
typesWithDefaulting := map [ schema . GroupVersionKind ] struct { } {
2022-10-04 00:46:55 -04:00
{ Group : "" , Version : "v1" , Kind : "ConfigMap" } : { } ,
{ Group : "" , Version : "v1" , Kind : "ConfigMapList" } : { } ,
{ Group : "" , Version : "v1" , Kind : "Endpoints" } : { } ,
{ Group : "" , Version : "v1" , Kind : "EndpointsList" } : { } ,
{ Group : "" , Version : "v1" , Kind : "EphemeralContainers" } : { } ,
{ Group : "" , Version : "v1" , Kind : "Namespace" } : { } ,
{ Group : "" , Version : "v1" , Kind : "NamespaceList" } : { } ,
{ Group : "" , Version : "v1" , Kind : "Node" } : { } ,
{ Group : "" , Version : "v1" , Kind : "NodeList" } : { } ,
{ Group : "" , Version : "v1" , Kind : "PersistentVolume" } : { } ,
{ Group : "" , Version : "v1" , Kind : "PersistentVolumeList" } : { } ,
{ Group : "" , Version : "v1" , Kind : "PersistentVolumeClaim" } : { } ,
{ Group : "" , Version : "v1" , Kind : "PersistentVolumeClaimList" } : { } ,
{ Group : "" , Version : "v1" , Kind : "Pod" } : { } ,
{ Group : "" , Version : "v1" , Kind : "PodList" } : { } ,
{ Group : "" , Version : "v1" , Kind : "PodTemplate" } : { } ,
{ Group : "" , Version : "v1" , Kind : "PodTemplateList" } : { } ,
{ Group : "" , Version : "v1" , Kind : "ReplicationController" } : { } ,
{ Group : "" , Version : "v1" , Kind : "ReplicationControllerList" } : { } ,
{ Group : "" , Version : "v1" , Kind : "Secret" } : { } ,
{ Group : "" , Version : "v1" , Kind : "SecretList" } : { } ,
{ Group : "" , Version : "v1" , Kind : "Service" } : { } ,
{ Group : "" , Version : "v1" , Kind : "ServiceList" } : { } ,
{ Group : "apps" , Version : "v1beta1" , Kind : "StatefulSet" } : { } ,
{ Group : "apps" , Version : "v1beta1" , Kind : "StatefulSetList" } : { } ,
{ Group : "apps" , Version : "v1beta2" , Kind : "StatefulSet" } : { } ,
{ Group : "apps" , Version : "v1beta2" , Kind : "StatefulSetList" } : { } ,
{ Group : "apps" , Version : "v1" , Kind : "StatefulSet" } : { } ,
{ Group : "apps" , Version : "v1" , Kind : "StatefulSetList" } : { } ,
{ Group : "autoscaling" , Version : "v1" , Kind : "HorizontalPodAutoscaler" } : { } ,
{ Group : "autoscaling" , Version : "v1" , Kind : "HorizontalPodAutoscalerList" } : { } ,
{ Group : "autoscaling" , Version : "v2" , Kind : "HorizontalPodAutoscaler" } : { } ,
{ Group : "autoscaling" , Version : "v2" , Kind : "HorizontalPodAutoscalerList" } : { } ,
{ Group : "autoscaling" , Version : "v2beta1" , Kind : "HorizontalPodAutoscaler" } : { } ,
{ Group : "autoscaling" , Version : "v2beta1" , Kind : "HorizontalPodAutoscalerList" } : { } ,
{ Group : "autoscaling" , Version : "v2beta2" , Kind : "HorizontalPodAutoscaler" } : { } ,
{ Group : "autoscaling" , Version : "v2beta2" , Kind : "HorizontalPodAutoscalerList" } : { } ,
{ Group : "batch" , Version : "v1" , Kind : "CronJob" } : { } ,
{ Group : "batch" , Version : "v1" , Kind : "CronJobList" } : { } ,
{ Group : "batch" , Version : "v1" , Kind : "Job" } : { } ,
{ Group : "batch" , Version : "v1" , Kind : "JobList" } : { } ,
{ Group : "batch" , Version : "v1beta1" , Kind : "CronJob" } : { } ,
{ Group : "batch" , Version : "v1beta1" , Kind : "CronJobList" } : { } ,
{ Group : "batch" , Version : "v1beta1" , Kind : "JobTemplate" } : { } ,
{ Group : "batch" , Version : "v2alpha1" , Kind : "CronJob" } : { } ,
{ Group : "batch" , Version : "v2alpha1" , Kind : "CronJobList" } : { } ,
{ Group : "batch" , Version : "v2alpha1" , Kind : "JobTemplate" } : { } ,
2025-09-16 16:24:07 -04:00
{ Group : "certificates.k8s.io" , Version : "v1beta1" , Kind : "PodCertificateRequest" } : { } ,
{ Group : "certificates.k8s.io" , Version : "v1beta1" , Kind : "PodCertificateRequestList" } : { } ,
2022-10-04 00:46:55 -04:00
{ Group : "certificates.k8s.io" , Version : "v1beta1" , Kind : "CertificateSigningRequest" } : { } ,
{ Group : "certificates.k8s.io" , Version : "v1beta1" , Kind : "CertificateSigningRequestList" } : { } ,
{ Group : "discovery.k8s.io" , Version : "v1" , Kind : "EndpointSlice" } : { } ,
{ Group : "discovery.k8s.io" , Version : "v1" , Kind : "EndpointSliceList" } : { } ,
{ Group : "discovery.k8s.io" , Version : "v1beta1" , Kind : "EndpointSlice" } : { } ,
{ Group : "discovery.k8s.io" , Version : "v1beta1" , Kind : "EndpointSliceList" } : { } ,
{ Group : "extensions" , Version : "v1beta1" , Kind : "DaemonSet" } : { } ,
{ Group : "extensions" , Version : "v1beta1" , Kind : "DaemonSetList" } : { } ,
{ Group : "apps" , Version : "v1beta2" , Kind : "DaemonSet" } : { } ,
{ Group : "apps" , Version : "v1beta2" , Kind : "DaemonSetList" } : { } ,
{ Group : "apps" , Version : "v1" , Kind : "DaemonSet" } : { } ,
{ Group : "apps" , Version : "v1" , Kind : "DaemonSetList" } : { } ,
{ Group : "extensions" , Version : "v1beta1" , Kind : "Deployment" } : { } ,
{ Group : "extensions" , Version : "v1beta1" , Kind : "DeploymentList" } : { } ,
{ Group : "apps" , Version : "v1beta1" , Kind : "Deployment" } : { } ,
{ Group : "apps" , Version : "v1beta1" , Kind : "DeploymentList" } : { } ,
{ Group : "apps" , Version : "v1beta2" , Kind : "Deployment" } : { } ,
{ Group : "apps" , Version : "v1beta2" , Kind : "DeploymentList" } : { } ,
{ Group : "apps" , Version : "v1" , Kind : "Deployment" } : { } ,
{ Group : "apps" , Version : "v1" , Kind : "DeploymentList" } : { } ,
{ Group : "extensions" , Version : "v1beta1" , Kind : "Ingress" } : { } ,
{ Group : "extensions" , Version : "v1beta1" , Kind : "IngressList" } : { } ,
{ Group : "apps" , Version : "v1beta2" , Kind : "ReplicaSet" } : { } ,
{ Group : "apps" , Version : "v1beta2" , Kind : "ReplicaSetList" } : { } ,
{ Group : "apps" , Version : "v1" , Kind : "ReplicaSet" } : { } ,
{ Group : "apps" , Version : "v1" , Kind : "ReplicaSetList" } : { } ,
{ Group : "extensions" , Version : "v1beta1" , Kind : "ReplicaSet" } : { } ,
{ Group : "extensions" , Version : "v1beta1" , Kind : "ReplicaSetList" } : { } ,
{ Group : "extensions" , Version : "v1beta1" , Kind : "NetworkPolicy" } : { } ,
{ Group : "extensions" , Version : "v1beta1" , Kind : "NetworkPolicyList" } : { } ,
{ Group : "rbac.authorization.k8s.io" , Version : "v1alpha1" , Kind : "ClusterRoleBinding" } : { } ,
{ Group : "rbac.authorization.k8s.io" , Version : "v1alpha1" , Kind : "ClusterRoleBindingList" } : { } ,
{ Group : "rbac.authorization.k8s.io" , Version : "v1alpha1" , Kind : "RoleBinding" } : { } ,
{ Group : "rbac.authorization.k8s.io" , Version : "v1alpha1" , Kind : "RoleBindingList" } : { } ,
{ Group : "rbac.authorization.k8s.io" , Version : "v1beta1" , Kind : "ClusterRoleBinding" } : { } ,
{ Group : "rbac.authorization.k8s.io" , Version : "v1beta1" , Kind : "ClusterRoleBindingList" } : { } ,
{ Group : "rbac.authorization.k8s.io" , Version : "v1beta1" , Kind : "RoleBinding" } : { } ,
{ Group : "rbac.authorization.k8s.io" , Version : "v1beta1" , Kind : "RoleBindingList" } : { } ,
{ Group : "rbac.authorization.k8s.io" , Version : "v1" , Kind : "ClusterRoleBinding" } : { } ,
{ Group : "rbac.authorization.k8s.io" , Version : "v1" , Kind : "ClusterRoleBindingList" } : { } ,
{ Group : "rbac.authorization.k8s.io" , Version : "v1" , Kind : "RoleBinding" } : { } ,
{ Group : "rbac.authorization.k8s.io" , Version : "v1" , Kind : "RoleBindingList" } : { } ,
2025-03-07 08:46:52 -05:00
{ Group : "resource.k8s.io" , Version : "v1alpha3" , Kind : "DeviceTaintRule" } : { } ,
{ Group : "resource.k8s.io" , Version : "v1alpha3" , Kind : "DeviceTaintRuleList" } : { } ,
2024-06-18 11:47:29 -04:00
{ Group : "resource.k8s.io" , Version : "v1alpha3" , Kind : "ResourceClaim" } : { } ,
{ Group : "resource.k8s.io" , Version : "v1alpha3" , Kind : "ResourceClaimList" } : { } ,
{ Group : "resource.k8s.io" , Version : "v1alpha3" , Kind : "ResourceClaimTemplate" } : { } ,
{ Group : "resource.k8s.io" , Version : "v1alpha3" , Kind : "ResourceClaimTemplateList" } : { } ,
2025-03-07 08:46:52 -05:00
{ Group : "resource.k8s.io" , Version : "v1alpha3" , Kind : "ResourceSlice" } : { } ,
{ Group : "resource.k8s.io" , Version : "v1alpha3" , Kind : "ResourceSliceList" } : { } ,
2024-09-26 04:34:41 -04:00
{ Group : "resource.k8s.io" , Version : "v1beta1" , Kind : "ResourceClaim" } : { } ,
{ Group : "resource.k8s.io" , Version : "v1beta1" , Kind : "ResourceClaimList" } : { } ,
{ Group : "resource.k8s.io" , Version : "v1beta1" , Kind : "ResourceClaimTemplate" } : { } ,
{ Group : "resource.k8s.io" , Version : "v1beta1" , Kind : "ResourceClaimTemplateList" } : { } ,
2025-03-07 08:46:52 -05:00
{ Group : "resource.k8s.io" , Version : "v1beta1" , Kind : "ResourceSlice" } : { } ,
{ Group : "resource.k8s.io" , Version : "v1beta1" , Kind : "ResourceSliceList" } : { } ,
2025-03-20 03:04:41 -04:00
{ Group : "resource.k8s.io" , Version : "v1beta2" , Kind : "ResourceClaim" } : { } ,
{ Group : "resource.k8s.io" , Version : "v1beta2" , Kind : "ResourceClaimList" } : { } ,
{ Group : "resource.k8s.io" , Version : "v1beta2" , Kind : "ResourceClaimTemplate" } : { } ,
{ Group : "resource.k8s.io" , Version : "v1beta2" , Kind : "ResourceClaimTemplateList" } : { } ,
{ Group : "resource.k8s.io" , Version : "v1beta2" , Kind : "ResourceSlice" } : { } ,
{ Group : "resource.k8s.io" , Version : "v1beta2" , Kind : "ResourceSliceList" } : { } ,
2025-07-03 09:17:35 -04:00
{ Group : "resource.k8s.io" , Version : "v1" , Kind : "ResourceClaim" } : { } ,
{ Group : "resource.k8s.io" , Version : "v1" , Kind : "ResourceClaimList" } : { } ,
{ Group : "resource.k8s.io" , Version : "v1" , Kind : "ResourceClaimTemplate" } : { } ,
{ Group : "resource.k8s.io" , Version : "v1" , Kind : "ResourceClaimTemplateList" } : { } ,
{ Group : "resource.k8s.io" , Version : "v1" , Kind : "ResourceSlice" } : { } ,
{ Group : "resource.k8s.io" , Version : "v1" , Kind : "ResourceSliceList" } : { } ,
2022-10-04 00:46:55 -04:00
{ Group : "admissionregistration.k8s.io" , Version : "v1alpha1" , Kind : "ValidatingAdmissionPolicy" } : { } ,
{ Group : "admissionregistration.k8s.io" , Version : "v1alpha1" , Kind : "ValidatingAdmissionPolicyList" } : { } ,
{ Group : "admissionregistration.k8s.io" , Version : "v1alpha1" , Kind : "ValidatingAdmissionPolicyBinding" } : { } ,
{ Group : "admissionregistration.k8s.io" , Version : "v1alpha1" , Kind : "ValidatingAdmissionPolicyBindingList" } : { } ,
2024-10-25 13:25:46 -04:00
{ Group : "admissionregistration.k8s.io" , Version : "v1alpha1" , Kind : "MutatingAdmissionPolicy" } : { } ,
{ Group : "admissionregistration.k8s.io" , Version : "v1alpha1" , Kind : "MutatingAdmissionPolicyList" } : { } ,
{ Group : "admissionregistration.k8s.io" , Version : "v1alpha1" , Kind : "MutatingAdmissionPolicyBinding" } : { } ,
{ Group : "admissionregistration.k8s.io" , Version : "v1alpha1" , Kind : "MutatingAdmissionPolicyBindingList" } : { } ,
2022-10-04 00:46:55 -04:00
{ Group : "admissionregistration.k8s.io" , Version : "v1beta1" , Kind : "ValidatingWebhookConfiguration" } : { } ,
{ Group : "admissionregistration.k8s.io" , Version : "v1beta1" , Kind : "ValidatingWebhookConfigurationList" } : { } ,
{ Group : "admissionregistration.k8s.io" , Version : "v1beta1" , Kind : "MutatingWebhookConfiguration" } : { } ,
{ Group : "admissionregistration.k8s.io" , Version : "v1beta1" , Kind : "MutatingWebhookConfigurationList" } : { } ,
2023-07-10 15:49:57 -04:00
{ Group : "admissionregistration.k8s.io" , Version : "v1beta1" , Kind : "ValidatingAdmissionPolicy" } : { } ,
{ Group : "admissionregistration.k8s.io" , Version : "v1beta1" , Kind : "ValidatingAdmissionPolicyList" } : { } ,
{ Group : "admissionregistration.k8s.io" , Version : "v1beta1" , Kind : "ValidatingAdmissionPolicyBinding" } : { } ,
{ Group : "admissionregistration.k8s.io" , Version : "v1beta1" , Kind : "ValidatingAdmissionPolicyBindingList" } : { } ,
2025-07-08 09:30:06 -04:00
{ Group : "admissionregistration.k8s.io" , Version : "v1beta1" , Kind : "MutatingAdmissionPolicy" } : { } ,
{ Group : "admissionregistration.k8s.io" , Version : "v1beta1" , Kind : "MutatingAdmissionPolicyList" } : { } ,
{ Group : "admissionregistration.k8s.io" , Version : "v1beta1" , Kind : "MutatingAdmissionPolicyBinding" } : { } ,
{ Group : "admissionregistration.k8s.io" , Version : "v1beta1" , Kind : "MutatingAdmissionPolicyBindingList" } : { } ,
2024-01-23 17:10:40 -05:00
{ Group : "admissionregistration.k8s.io" , Version : "v1" , Kind : "ValidatingAdmissionPolicy" } : { } ,
{ Group : "admissionregistration.k8s.io" , Version : "v1" , Kind : "ValidatingAdmissionPolicyList" } : { } ,
{ Group : "admissionregistration.k8s.io" , Version : "v1" , Kind : "ValidatingAdmissionPolicyBinding" } : { } ,
{ Group : "admissionregistration.k8s.io" , Version : "v1" , Kind : "ValidatingAdmissionPolicyBindingList" } : { } ,
2022-10-04 00:46:55 -04:00
{ Group : "admissionregistration.k8s.io" , Version : "v1" , Kind : "ValidatingWebhookConfiguration" } : { } ,
{ Group : "admissionregistration.k8s.io" , Version : "v1" , Kind : "ValidatingWebhookConfigurationList" } : { } ,
{ Group : "admissionregistration.k8s.io" , Version : "v1" , Kind : "MutatingWebhookConfiguration" } : { } ,
{ Group : "admissionregistration.k8s.io" , Version : "v1" , Kind : "MutatingWebhookConfigurationList" } : { } ,
{ Group : "networking.k8s.io" , Version : "v1" , Kind : "NetworkPolicy" } : { } ,
{ Group : "networking.k8s.io" , Version : "v1" , Kind : "NetworkPolicyList" } : { } ,
{ Group : "networking.k8s.io" , Version : "v1beta1" , Kind : "Ingress" } : { } ,
{ Group : "networking.k8s.io" , Version : "v1beta1" , Kind : "IngressList" } : { } ,
{ Group : "networking.k8s.io" , Version : "v1" , Kind : "IngressClass" } : { } ,
{ Group : "networking.k8s.io" , Version : "v1" , Kind : "IngressClassList" } : { } ,
{ Group : "storage.k8s.io" , Version : "v1beta1" , Kind : "StorageClass" } : { } ,
{ Group : "storage.k8s.io" , Version : "v1beta1" , Kind : "StorageClassList" } : { } ,
{ Group : "storage.k8s.io" , Version : "v1beta1" , Kind : "CSIDriver" } : { } ,
{ Group : "storage.k8s.io" , Version : "v1beta1" , Kind : "CSIDriverList" } : { } ,
{ Group : "storage.k8s.io" , Version : "v1" , Kind : "StorageClass" } : { } ,
{ Group : "storage.k8s.io" , Version : "v1" , Kind : "StorageClassList" } : { } ,
{ Group : "storage.k8s.io" , Version : "v1" , Kind : "VolumeAttachment" } : { } ,
{ Group : "storage.k8s.io" , Version : "v1" , Kind : "VolumeAttachmentList" } : { } ,
{ Group : "storage.k8s.io" , Version : "v1" , Kind : "CSIDriver" } : { } ,
{ Group : "storage.k8s.io" , Version : "v1" , Kind : "CSIDriverList" } : { } ,
{ Group : "storage.k8s.io" , Version : "v1beta1" , Kind : "VolumeAttachment" } : { } ,
{ Group : "storage.k8s.io" , Version : "v1beta1" , Kind : "VolumeAttachmentList" } : { } ,
{ Group : "authentication.k8s.io" , Version : "v1" , Kind : "TokenRequest" } : { } ,
{ Group : "scheduling.k8s.io" , Version : "v1alpha1" , Kind : "PriorityClass" } : { } ,
{ Group : "scheduling.k8s.io" , Version : "v1beta1" , Kind : "PriorityClass" } : { } ,
{ Group : "scheduling.k8s.io" , Version : "v1" , Kind : "PriorityClass" } : { } ,
{ Group : "scheduling.k8s.io" , Version : "v1alpha1" , Kind : "PriorityClassList" } : { } ,
{ Group : "scheduling.k8s.io" , Version : "v1beta1" , Kind : "PriorityClassList" } : { } ,
{ Group : "scheduling.k8s.io" , Version : "v1" , Kind : "PriorityClassList" } : { } ,
2022-10-17 16:27:51 -04:00
{ Group : "flowcontrol.apiserver.k8s.io" , Version : "v1alpha1" , Kind : "PriorityLevelConfiguration" } : { } ,
{ Group : "flowcontrol.apiserver.k8s.io" , Version : "v1alpha1" , Kind : "PriorityLevelConfigurationList" } : { } ,
{ Group : "flowcontrol.apiserver.k8s.io" , Version : "v1beta1" , Kind : "PriorityLevelConfiguration" } : { } ,
{ Group : "flowcontrol.apiserver.k8s.io" , Version : "v1beta1" , Kind : "PriorityLevelConfigurationList" } : { } ,
{ Group : "flowcontrol.apiserver.k8s.io" , Version : "v1beta2" , Kind : "PriorityLevelConfiguration" } : { } ,
{ Group : "flowcontrol.apiserver.k8s.io" , Version : "v1beta2" , Kind : "PriorityLevelConfigurationList" } : { } ,
{ Group : "flowcontrol.apiserver.k8s.io" , Version : "v1beta3" , Kind : "PriorityLevelConfiguration" } : { } ,
{ Group : "flowcontrol.apiserver.k8s.io" , Version : "v1beta3" , Kind : "PriorityLevelConfigurationList" } : { } ,
2023-10-11 14:03:42 -04:00
{ Group : "flowcontrol.apiserver.k8s.io" , Version : "v1" , Kind : "PriorityLevelConfiguration" } : { } ,
{ Group : "flowcontrol.apiserver.k8s.io" , Version : "v1" , Kind : "PriorityLevelConfigurationList" } : { } ,
2016-09-25 12:09:52 -04:00
}
2017-10-16 07:41:50 -04:00
scheme := legacyscheme . Scheme
2016-09-24 23:25:31 -04:00
var testTypes orderedGroupVersionKinds
for gvk := range scheme . AllKnownTypes ( ) {
if gvk . Version == runtime . APIVersionInternal {
continue
}
testTypes = append ( testTypes , gvk )
}
sort . Sort ( testTypes )
for _ , gvk := range testTypes {
2024-07-11 07:50:09 -04:00
gvk := gvk
t . Run ( gvk . String ( ) , func ( t * testing . T ) {
// Each sub-tests gets its own fuzzer instance to make running it independent
// from what other tests ran before.
2025-02-20 12:45:22 -05:00
f := randfill . New ( ) . NilChance ( .5 ) . NumElements ( 1 , 1 ) . RandSource ( rand . NewSource ( 1 ) )
2024-07-11 07:50:09 -04:00
f . Funcs (
2025-02-20 12:45:22 -05:00
func ( s * runtime . RawExtension , c randfill . Continue ) { } ,
func ( s * metav1 . LabelSelector , c randfill . Continue ) {
c . FillNoCustom ( s )
2024-07-11 07:50:09 -04:00
s . MatchExpressions = nil // need to fuzz this specially
} ,
2025-02-20 12:45:22 -05:00
func ( s * metav1 . ListOptions , c randfill . Continue ) {
c . FillNoCustom ( s )
2024-07-11 07:50:09 -04:00
s . LabelSelector = "" // need to fuzz requirement strings specially
s . FieldSelector = "" // need to fuzz requirement strings specially
} ,
2025-02-20 12:45:22 -05:00
func ( s * extensionsv1beta1 . ScaleStatus , c randfill . Continue ) {
c . FillNoCustom ( s )
2024-07-11 07:50:09 -04:00
s . TargetSelector = "" // need to fuzz requirement strings specially
} ,
)
_ , expectedChanged := typesWithDefaulting [ gvk ]
iter := 0
changedOnce := false
for {
if iter > * roundtrip . FuzzIters {
if ! expectedChanged || changedOnce {
break
}
// This uses to be 300, but for ResourceClaimList that was not high enough
// because depending on the starting conditions, the fuzzer never created the
// one combination where defaulting kicked in (empty string in non-empty slice
// in another non-empty slice).
if iter > 3000 {
t . Errorf ( "expected %s to trigger defaulting due to fuzzing" , gvk )
break
}
// if we expected defaulting, continue looping until the fuzzer gives us one
// at worst, we will timeout
2016-09-25 12:09:52 -04:00
}
2024-07-11 07:50:09 -04:00
iter ++
2016-09-25 12:09:52 -04:00
2024-07-11 07:50:09 -04:00
src , err := scheme . New ( gvk )
if err != nil {
t . Fatal ( err )
}
2025-02-20 12:45:22 -05:00
f . Fill ( src )
2016-09-24 23:25:31 -04:00
2024-07-11 07:50:09 -04:00
src . GetObjectKind ( ) . SetGroupVersionKind ( schema . GroupVersionKind { } )
2016-09-24 23:25:31 -04:00
2024-07-11 07:50:09 -04:00
original := src . DeepCopyObject ( )
2016-09-24 23:25:31 -04:00
2024-07-11 07:50:09 -04:00
// get internal
withDefaults := src . DeepCopyObject ( )
scheme . Default ( withDefaults )
2016-09-25 12:09:52 -04:00
2024-07-11 07:50:09 -04:00
if ! reflect . DeepEqual ( original , withDefaults ) {
diff := cmp . Diff ( original , withDefaults )
if ! changedOnce {
t . Logf ( "got diff (-fuzzed, +with defaults):\n%s" , diff )
changedOnce = true
}
if ! expectedChanged {
t . Errorf ( "{Group: \"%s\", Version: \"%s\", Kind: \"%s\"} did not expect defaults to be set - update expected or check defaulter registering: %s" , gvk . Group , gvk . Version , gvk . Kind , diff )
}
2016-09-25 12:09:52 -04:00
}
2016-09-24 23:25:31 -04:00
}
2024-07-11 07:50:09 -04:00
} )
2016-09-25 12:09:52 -04:00
}
2024-07-11 07:50:09 -04:00
2016-09-25 12:09:52 -04:00
}
2016-09-24 23:25:31 -04:00
2016-09-25 12:09:52 -04:00
func BenchmarkPodDefaulting ( b * testing . B ) {
2025-02-20 12:45:22 -05:00
f := randfill . New ( ) . NilChance ( .5 ) . NumElements ( 1 , 1 ) . RandSource ( rand . NewSource ( 1 ) )
2016-09-25 12:09:52 -04:00
items := make ( [ ] apiv1 . Pod , 100 )
for i := range items {
2025-02-20 12:45:22 -05:00
f . Fill ( & items [ i ] )
2016-09-25 12:09:52 -04:00
}
2016-09-24 23:25:31 -04:00
2017-10-16 07:41:50 -04:00
scheme := legacyscheme . Scheme
2016-09-25 12:09:52 -04:00
b . ResetTimer ( )
for i := 0 ; i < b . N ; i ++ {
pod := & items [ i % len ( items ) ]
scheme . Default ( pod )
2016-09-24 23:25:31 -04:00
}
2016-09-25 12:09:52 -04:00
b . StopTimer ( )
2016-09-24 23:25:31 -04:00
}