k8s.io/kubernetes@v1.29.3/pkg/apis/apps/v1/conversion.go (about) 1 /* 2 Copyright 2017 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 v1 18 19 import ( 20 "fmt" 21 "strconv" 22 23 appsv1 "k8s.io/api/apps/v1" 24 corev1 "k8s.io/api/core/v1" 25 "k8s.io/apimachinery/pkg/conversion" 26 "k8s.io/kubernetes/pkg/apis/apps" 27 "k8s.io/kubernetes/pkg/apis/core" 28 ) 29 30 // Convert_apps_DeploymentSpec_To_v1_DeploymentSpec is defined here, because public 31 // conversion is not auto-generated due to existing warnings. 32 func Convert_apps_DeploymentSpec_To_v1_DeploymentSpec(in *apps.DeploymentSpec, out *appsv1.DeploymentSpec, s conversion.Scope) error { 33 if err := autoConvert_apps_DeploymentSpec_To_v1_DeploymentSpec(in, out, s); err != nil { 34 return err 35 } 36 return nil 37 } 38 39 func Convert_v1_Deployment_To_apps_Deployment(in *appsv1.Deployment, out *apps.Deployment, s conversion.Scope) error { 40 if err := autoConvert_v1_Deployment_To_apps_Deployment(in, out, s); err != nil { 41 return err 42 } 43 44 // Copy annotation to deprecated rollbackTo field for roundtrip 45 // TODO: remove this conversion after we delete extensions/v1beta1 and apps/v1beta1 Deployment 46 if revision := in.Annotations[appsv1.DeprecatedRollbackTo]; revision != "" { 47 if revision64, err := strconv.ParseInt(revision, 10, 64); err != nil { 48 return fmt.Errorf("failed to parse annotation[%s]=%s as int64: %v", appsv1.DeprecatedRollbackTo, revision, err) 49 } else { 50 out.Spec.RollbackTo = new(apps.RollbackConfig) 51 out.Spec.RollbackTo.Revision = revision64 52 } 53 out.Annotations = deepCopyStringMap(out.Annotations) 54 delete(out.Annotations, appsv1.DeprecatedRollbackTo) 55 } else { 56 out.Spec.RollbackTo = nil 57 } 58 59 return nil 60 } 61 62 func Convert_apps_Deployment_To_v1_Deployment(in *apps.Deployment, out *appsv1.Deployment, s conversion.Scope) error { 63 if err := autoConvert_apps_Deployment_To_v1_Deployment(in, out, s); err != nil { 64 return err 65 } 66 67 out.Annotations = deepCopyStringMap(out.Annotations) // deep copy because we modify it below 68 69 // Copy deprecated rollbackTo field to annotation for roundtrip 70 // TODO: remove this conversion after we delete extensions/v1beta1 and apps/v1beta1 Deployment 71 if in.Spec.RollbackTo != nil { 72 if out.Annotations == nil { 73 out.Annotations = make(map[string]string) 74 } 75 out.Annotations[appsv1.DeprecatedRollbackTo] = strconv.FormatInt(in.Spec.RollbackTo.Revision, 10) 76 } else { 77 delete(out.Annotations, appsv1.DeprecatedRollbackTo) 78 } 79 80 return nil 81 } 82 83 func Convert_apps_DaemonSet_To_v1_DaemonSet(in *apps.DaemonSet, out *appsv1.DaemonSet, s conversion.Scope) error { 84 if err := autoConvert_apps_DaemonSet_To_v1_DaemonSet(in, out, s); err != nil { 85 return err 86 } 87 88 out.Annotations = deepCopyStringMap(out.Annotations) // deep copy annotations because we change them below 89 out.Annotations[appsv1.DeprecatedTemplateGeneration] = strconv.FormatInt(in.Spec.TemplateGeneration, 10) 90 return nil 91 } 92 93 // Convert_apps_DaemonSetSpec_To_v1_DaemonSetSpec is defined here, because public 94 // conversion is not auto-generated due to existing warnings. 95 func Convert_apps_DaemonSetSpec_To_v1_DaemonSetSpec(in *apps.DaemonSetSpec, out *appsv1.DaemonSetSpec, s conversion.Scope) error { 96 if err := autoConvert_apps_DaemonSetSpec_To_v1_DaemonSetSpec(in, out, s); err != nil { 97 return err 98 } 99 return nil 100 } 101 102 func Convert_v1_DaemonSet_To_apps_DaemonSet(in *appsv1.DaemonSet, out *apps.DaemonSet, s conversion.Scope) error { 103 if err := autoConvert_v1_DaemonSet_To_apps_DaemonSet(in, out, s); err != nil { 104 return err 105 } 106 if value, ok := in.Annotations[appsv1.DeprecatedTemplateGeneration]; ok { 107 if value64, err := strconv.ParseInt(value, 10, 64); err != nil { 108 return err 109 } else { 110 out.Spec.TemplateGeneration = value64 111 out.Annotations = deepCopyStringMap(out.Annotations) 112 delete(out.Annotations, appsv1.DeprecatedTemplateGeneration) 113 } 114 } 115 return nil 116 } 117 118 func deepCopyStringMap(m map[string]string) map[string]string { 119 ret := make(map[string]string, len(m)) 120 for k, v := range m { 121 ret[k] = v 122 } 123 return ret 124 } 125 126 // Convert_apps_StatefulSetSpec_To_v1_StatefulSetSpec augments auto-conversion to preserve < 1.17 behavior 127 // setting apiVersion/kind in nested persistent volume claim objects. 128 func Convert_v1_StatefulSetSpec_To_apps_StatefulSetSpec(in *appsv1.StatefulSetSpec, out *apps.StatefulSetSpec, s conversion.Scope) error { 129 if err := autoConvert_v1_StatefulSetSpec_To_apps_StatefulSetSpec(in, out, s); err != nil { 130 return err 131 } 132 // set APIVersion/Kind to behave the same as reflective conversion < 1.17. 133 // see https://issue.k8s.io/87583 134 if out.VolumeClaimTemplates != nil { 135 // copy so we don't modify the input 136 templatesCopy := make([]core.PersistentVolumeClaim, len(out.VolumeClaimTemplates)) 137 copy(templatesCopy, out.VolumeClaimTemplates) 138 out.VolumeClaimTemplates = templatesCopy 139 for i := range out.VolumeClaimTemplates { 140 out.VolumeClaimTemplates[i].APIVersion = "" 141 out.VolumeClaimTemplates[i].Kind = "" 142 } 143 } 144 return nil 145 } 146 147 // Convert_apps_StatefulSetSpec_To_v1_StatefulSetSpec augments auto-conversion to preserve < 1.17 behavior 148 // setting apiVersion/kind in nested persistent volume claim objects. 149 func Convert_apps_StatefulSetSpec_To_v1_StatefulSetSpec(in *apps.StatefulSetSpec, out *appsv1.StatefulSetSpec, s conversion.Scope) error { 150 if err := autoConvert_apps_StatefulSetSpec_To_v1_StatefulSetSpec(in, out, s); err != nil { 151 return err 152 } 153 // set APIVersion/Kind to behave the same as reflective conversion < 1.17. 154 // see https://issue.k8s.io/87583 155 if out.VolumeClaimTemplates != nil { 156 // copy so we don't modify the input 157 templatesCopy := make([]corev1.PersistentVolumeClaim, len(out.VolumeClaimTemplates)) 158 copy(templatesCopy, out.VolumeClaimTemplates) 159 out.VolumeClaimTemplates = templatesCopy 160 for i := range out.VolumeClaimTemplates { 161 out.VolumeClaimTemplates[i].APIVersion = "v1" 162 out.VolumeClaimTemplates[i].Kind = "PersistentVolumeClaim" 163 } 164 } 165 return nil 166 }