k8s.io/kubernetes@v1.29.3/pkg/apis/apps/v1beta2/conversion.go (about) 1 /* 2 Copyright 2016 The Kubernetes Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package v1beta2 18 19 import ( 20 "fmt" 21 "strconv" 22 23 appsv1beta2 "k8s.io/api/apps/v1beta2" 24 corev1 "k8s.io/api/core/v1" 25 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 26 "k8s.io/apimachinery/pkg/conversion" 27 "k8s.io/apimachinery/pkg/labels" 28 "k8s.io/apimachinery/pkg/runtime" 29 "k8s.io/kubernetes/pkg/apis/apps" 30 autoscaling "k8s.io/kubernetes/pkg/apis/autoscaling" 31 "k8s.io/kubernetes/pkg/apis/core" 32 ) 33 34 func addConversionFuncs(scheme *runtime.Scheme) error { 35 // Add field label conversions for kinds having selectable nothing but ObjectMeta fields. 36 if err := scheme.AddFieldLabelConversionFunc(SchemeGroupVersion.WithKind("StatefulSet"), 37 func(label, value string) (string, string, error) { 38 switch label { 39 case "metadata.name", "metadata.namespace", "status.successful": 40 return label, value, nil 41 default: 42 return "", "", fmt.Errorf("field label not supported for appsv1beta2.StatefulSet: %s", label) 43 } 44 }); err != nil { 45 return err 46 } 47 48 return nil 49 } 50 51 func Convert_autoscaling_ScaleStatus_To_v1beta2_ScaleStatus(in *autoscaling.ScaleStatus, out *appsv1beta2.ScaleStatus, s conversion.Scope) error { 52 out.Replicas = int32(in.Replicas) 53 out.TargetSelector = in.Selector 54 55 out.Selector = nil 56 selector, err := metav1.ParseToLabelSelector(in.Selector) 57 if err != nil { 58 return fmt.Errorf("failed to parse selector: %v", err) 59 } 60 if len(selector.MatchExpressions) == 0 { 61 out.Selector = selector.MatchLabels 62 } 63 64 return nil 65 } 66 67 func Convert_v1beta2_ScaleStatus_To_autoscaling_ScaleStatus(in *appsv1beta2.ScaleStatus, out *autoscaling.ScaleStatus, s conversion.Scope) error { 68 out.Replicas = in.Replicas 69 70 // Normally when 2 fields map to the same internal value we favor the old field, since 71 // old clients can't be expected to know about new fields but clients that know about the 72 // new field can be expected to know about the old field (though that's not quite true, due 73 // to kubectl apply). However, these fields are readonly, so any non-nil value should work. 74 if in.TargetSelector != "" { 75 out.Selector = in.TargetSelector 76 } else if in.Selector != nil { 77 set := labels.Set{} 78 for key, val := range in.Selector { 79 set[key] = val 80 } 81 out.Selector = labels.SelectorFromSet(set).String() 82 } else { 83 out.Selector = "" 84 } 85 return nil 86 } 87 88 // Convert_apps_DeploymentSpec_To_v1beta2_DeploymentSpec is defined here, because public 89 // conversion is not auto-generated due to existing warnings. 90 func Convert_apps_DeploymentSpec_To_v1beta2_DeploymentSpec(in *apps.DeploymentSpec, out *appsv1beta2.DeploymentSpec, s conversion.Scope) error { 91 if err := autoConvert_apps_DeploymentSpec_To_v1beta2_DeploymentSpec(in, out, s); err != nil { 92 return err 93 } 94 return nil 95 } 96 97 func Convert_v1beta2_Deployment_To_apps_Deployment(in *appsv1beta2.Deployment, out *apps.Deployment, s conversion.Scope) error { 98 if err := autoConvert_v1beta2_Deployment_To_apps_Deployment(in, out, s); err != nil { 99 return err 100 } 101 102 // Copy annotation to deprecated rollbackTo field for roundtrip 103 // TODO: remove this conversion after we delete extensions/v1beta1 and apps/v1beta1 Deployment 104 if revision := in.Annotations[appsv1beta2.DeprecatedRollbackTo]; revision != "" { 105 if revision64, err := strconv.ParseInt(revision, 10, 64); err != nil { 106 return fmt.Errorf("failed to parse annotation[%s]=%s as int64: %v", appsv1beta2.DeprecatedRollbackTo, revision, err) 107 } else { 108 out.Spec.RollbackTo = new(apps.RollbackConfig) 109 out.Spec.RollbackTo.Revision = revision64 110 } 111 out.Annotations = deepCopyStringMap(out.Annotations) 112 delete(out.Annotations, appsv1beta2.DeprecatedRollbackTo) 113 } else { 114 out.Spec.RollbackTo = nil 115 } 116 117 return nil 118 } 119 120 func Convert_apps_Deployment_To_v1beta2_Deployment(in *apps.Deployment, out *appsv1beta2.Deployment, s conversion.Scope) error { 121 if err := autoConvert_apps_Deployment_To_v1beta2_Deployment(in, out, s); err != nil { 122 return err 123 } 124 125 out.Annotations = deepCopyStringMap(out.Annotations) // deep copy because we modify annotations below 126 // Copy deprecated rollbackTo field to annotation for roundtrip 127 // TODO: remove this conversion after we delete extensions/v1beta1 and apps/v1beta1 Deployment 128 if in.Spec.RollbackTo != nil { 129 if out.Annotations == nil { 130 out.Annotations = make(map[string]string) 131 } 132 out.Annotations[appsv1beta2.DeprecatedRollbackTo] = strconv.FormatInt(in.Spec.RollbackTo.Revision, 10) 133 } else { 134 delete(out.Annotations, appsv1beta2.DeprecatedRollbackTo) 135 } 136 137 return nil 138 } 139 140 func Convert_apps_DaemonSet_To_v1beta2_DaemonSet(in *apps.DaemonSet, out *appsv1beta2.DaemonSet, s conversion.Scope) error { 141 if err := autoConvert_apps_DaemonSet_To_v1beta2_DaemonSet(in, out, s); err != nil { 142 return err 143 } 144 145 out.Annotations = deepCopyStringMap(out.Annotations) 146 out.Annotations[appsv1beta2.DeprecatedTemplateGeneration] = strconv.FormatInt(in.Spec.TemplateGeneration, 10) 147 return nil 148 } 149 150 // Convert_apps_DaemonSetSpec_To_v1beta2_DaemonSetSpec is defined here, because public 151 // conversion is not auto-generated due to existing warnings. 152 func Convert_apps_DaemonSetSpec_To_v1beta2_DaemonSetSpec(in *apps.DaemonSetSpec, out *appsv1beta2.DaemonSetSpec, s conversion.Scope) error { 153 if err := autoConvert_apps_DaemonSetSpec_To_v1beta2_DaemonSetSpec(in, out, s); err != nil { 154 return err 155 } 156 return nil 157 } 158 159 func Convert_v1beta2_DaemonSet_To_apps_DaemonSet(in *appsv1beta2.DaemonSet, out *apps.DaemonSet, s conversion.Scope) error { 160 if err := autoConvert_v1beta2_DaemonSet_To_apps_DaemonSet(in, out, s); err != nil { 161 return err 162 } 163 164 if value, ok := in.Annotations[appsv1beta2.DeprecatedTemplateGeneration]; ok { 165 if value64, err := strconv.ParseInt(value, 10, 64); err != nil { 166 return err 167 } else { 168 out.Spec.TemplateGeneration = value64 169 out.Annotations = deepCopyStringMap(out.Annotations) 170 delete(out.Annotations, appsv1beta2.DeprecatedTemplateGeneration) 171 } 172 } 173 174 return nil 175 } 176 177 func deepCopyStringMap(m map[string]string) map[string]string { 178 ret := make(map[string]string, len(m)) 179 for k, v := range m { 180 ret[k] = v 181 } 182 return ret 183 } 184 185 // Convert_v1beta2_StatefulSetSpec_To_apps_StatefulSetSpec augments auto-conversion to preserve < 1.17 behavior 186 // setting apiVersion/kind in nested persistent volume claim objects. 187 func Convert_v1beta2_StatefulSetSpec_To_apps_StatefulSetSpec(in *appsv1beta2.StatefulSetSpec, out *apps.StatefulSetSpec, s conversion.Scope) error { 188 if err := autoConvert_v1beta2_StatefulSetSpec_To_apps_StatefulSetSpec(in, out, s); err != nil { 189 return err 190 } 191 // set APIVersion/Kind to behave the same as reflective conversion < 1.17. 192 // see https://issue.k8s.io/87583 193 if out.VolumeClaimTemplates != nil { 194 // copy so we don't modify the input 195 templatesCopy := make([]core.PersistentVolumeClaim, len(out.VolumeClaimTemplates)) 196 copy(templatesCopy, out.VolumeClaimTemplates) 197 out.VolumeClaimTemplates = templatesCopy 198 for i := range out.VolumeClaimTemplates { 199 out.VolumeClaimTemplates[i].APIVersion = "" 200 out.VolumeClaimTemplates[i].Kind = "" 201 } 202 } 203 return nil 204 } 205 206 // Convert_apps_StatefulSetSpec_To_v1beta2_StatefulSetSpec augments auto-conversion to preserve < 1.17 behavior 207 // setting apiVersion/kind in nested persistent volume claim objects. 208 func Convert_apps_StatefulSetSpec_To_v1beta2_StatefulSetSpec(in *apps.StatefulSetSpec, out *appsv1beta2.StatefulSetSpec, s conversion.Scope) error { 209 if err := autoConvert_apps_StatefulSetSpec_To_v1beta2_StatefulSetSpec(in, out, s); err != nil { 210 return err 211 } 212 // set APIVersion/Kind to behave the same as reflective conversion < 1.17. 213 // see https://issue.k8s.io/87583 214 if out.VolumeClaimTemplates != nil { 215 // copy so we don't modify the input 216 templatesCopy := make([]corev1.PersistentVolumeClaim, len(out.VolumeClaimTemplates)) 217 copy(templatesCopy, out.VolumeClaimTemplates) 218 out.VolumeClaimTemplates = templatesCopy 219 for i := range out.VolumeClaimTemplates { 220 out.VolumeClaimTemplates[i].APIVersion = "v1" 221 out.VolumeClaimTemplates[i].Kind = "PersistentVolumeClaim" 222 } 223 } 224 return nil 225 }