conversion.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. /*
  2. Copyright 2016 The Kubernetes Authors.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package v1beta1
  14. import (
  15. "fmt"
  16. appsv1beta1 "k8s.io/api/apps/v1beta1"
  17. "k8s.io/api/core/v1"
  18. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  19. "k8s.io/apimachinery/pkg/conversion"
  20. "k8s.io/apimachinery/pkg/labels"
  21. "k8s.io/apimachinery/pkg/runtime"
  22. "k8s.io/apimachinery/pkg/util/intstr"
  23. "k8s.io/kubernetes/pkg/apis/apps"
  24. "k8s.io/kubernetes/pkg/apis/autoscaling"
  25. api "k8s.io/kubernetes/pkg/apis/core"
  26. k8s_api_v1 "k8s.io/kubernetes/pkg/apis/core/v1"
  27. )
  28. func addConversionFuncs(scheme *runtime.Scheme) error {
  29. // Add non-generated conversion functions to handle the *int32 -> int32
  30. // conversion. A pointer is useful in the versioned type so we can default
  31. // it, but a plain int32 is more convenient in the internal type. These
  32. // functions are the same as the autogenerated ones in every other way.
  33. err := scheme.AddConversionFuncs(
  34. Convert_v1beta1_StatefulSetSpec_To_apps_StatefulSetSpec,
  35. Convert_apps_StatefulSetSpec_To_v1beta1_StatefulSetSpec,
  36. Convert_v1beta1_StatefulSetUpdateStrategy_To_apps_StatefulSetUpdateStrategy,
  37. Convert_apps_StatefulSetUpdateStrategy_To_v1beta1_StatefulSetUpdateStrategy,
  38. // extensions
  39. // TODO: below conversions should be dropped in favor of auto-generated
  40. // ones, see https://github.com/kubernetes/kubernetes/issues/39865
  41. Convert_v1beta1_ScaleStatus_To_autoscaling_ScaleStatus,
  42. Convert_autoscaling_ScaleStatus_To_v1beta1_ScaleStatus,
  43. Convert_v1beta1_DeploymentSpec_To_apps_DeploymentSpec,
  44. Convert_apps_DeploymentSpec_To_v1beta1_DeploymentSpec,
  45. Convert_v1beta1_DeploymentStrategy_To_apps_DeploymentStrategy,
  46. Convert_apps_DeploymentStrategy_To_v1beta1_DeploymentStrategy,
  47. Convert_v1beta1_RollingUpdateDeployment_To_apps_RollingUpdateDeployment,
  48. Convert_apps_RollingUpdateDeployment_To_v1beta1_RollingUpdateDeployment,
  49. )
  50. if err != nil {
  51. return err
  52. }
  53. // Add field label conversions for kinds having selectable nothing but ObjectMeta fields.
  54. err = scheme.AddFieldLabelConversionFunc(SchemeGroupVersion.WithKind("StatefulSet"),
  55. func(label, value string) (string, string, error) {
  56. switch label {
  57. case "metadata.name", "metadata.namespace", "status.successful":
  58. return label, value, nil
  59. default:
  60. return "", "", fmt.Errorf("field label not supported for appsv1beta1.StatefulSet: %s", label)
  61. }
  62. })
  63. if err != nil {
  64. return err
  65. }
  66. return nil
  67. }
  68. func Convert_v1beta1_StatefulSetSpec_To_apps_StatefulSetSpec(in *appsv1beta1.StatefulSetSpec, out *apps.StatefulSetSpec, s conversion.Scope) error {
  69. if in.Replicas != nil {
  70. out.Replicas = *in.Replicas
  71. }
  72. if in.Selector != nil {
  73. in, out := &in.Selector, &out.Selector
  74. *out = new(metav1.LabelSelector)
  75. if err := s.Convert(*in, *out, 0); err != nil {
  76. return err
  77. }
  78. } else {
  79. out.Selector = nil
  80. }
  81. if err := k8s_api_v1.Convert_v1_PodTemplateSpec_To_core_PodTemplateSpec(&in.Template, &out.Template, s); err != nil {
  82. return err
  83. }
  84. if in.VolumeClaimTemplates != nil {
  85. in, out := &in.VolumeClaimTemplates, &out.VolumeClaimTemplates
  86. *out = make([]api.PersistentVolumeClaim, len(*in))
  87. for i := range *in {
  88. if err := s.Convert(&(*in)[i], &(*out)[i], 0); err != nil {
  89. return err
  90. }
  91. }
  92. } else {
  93. out.VolumeClaimTemplates = nil
  94. }
  95. if err := Convert_v1beta1_StatefulSetUpdateStrategy_To_apps_StatefulSetUpdateStrategy(&in.UpdateStrategy, &out.UpdateStrategy, s); err != nil {
  96. return err
  97. }
  98. if in.RevisionHistoryLimit != nil {
  99. out.RevisionHistoryLimit = new(int32)
  100. *out.RevisionHistoryLimit = *in.RevisionHistoryLimit
  101. } else {
  102. out.RevisionHistoryLimit = nil
  103. }
  104. out.ServiceName = in.ServiceName
  105. out.PodManagementPolicy = apps.PodManagementPolicyType(in.PodManagementPolicy)
  106. return nil
  107. }
  108. func Convert_apps_StatefulSetSpec_To_v1beta1_StatefulSetSpec(in *apps.StatefulSetSpec, out *appsv1beta1.StatefulSetSpec, s conversion.Scope) error {
  109. out.Replicas = new(int32)
  110. *out.Replicas = in.Replicas
  111. if in.Selector != nil {
  112. in, out := &in.Selector, &out.Selector
  113. *out = new(metav1.LabelSelector)
  114. if err := s.Convert(*in, *out, 0); err != nil {
  115. return err
  116. }
  117. } else {
  118. out.Selector = nil
  119. }
  120. if err := k8s_api_v1.Convert_core_PodTemplateSpec_To_v1_PodTemplateSpec(&in.Template, &out.Template, s); err != nil {
  121. return err
  122. }
  123. if in.VolumeClaimTemplates != nil {
  124. in, out := &in.VolumeClaimTemplates, &out.VolumeClaimTemplates
  125. *out = make([]v1.PersistentVolumeClaim, len(*in))
  126. for i := range *in {
  127. if err := s.Convert(&(*in)[i], &(*out)[i], 0); err != nil {
  128. return err
  129. }
  130. }
  131. } else {
  132. out.VolumeClaimTemplates = nil
  133. }
  134. if in.RevisionHistoryLimit != nil {
  135. out.RevisionHistoryLimit = new(int32)
  136. *out.RevisionHistoryLimit = *in.RevisionHistoryLimit
  137. } else {
  138. out.RevisionHistoryLimit = nil
  139. }
  140. out.ServiceName = in.ServiceName
  141. out.PodManagementPolicy = appsv1beta1.PodManagementPolicyType(in.PodManagementPolicy)
  142. if err := Convert_apps_StatefulSetUpdateStrategy_To_v1beta1_StatefulSetUpdateStrategy(&in.UpdateStrategy, &out.UpdateStrategy, s); err != nil {
  143. return err
  144. }
  145. return nil
  146. }
  147. func Convert_v1beta1_StatefulSetUpdateStrategy_To_apps_StatefulSetUpdateStrategy(in *appsv1beta1.StatefulSetUpdateStrategy, out *apps.StatefulSetUpdateStrategy, s conversion.Scope) error {
  148. out.Type = apps.StatefulSetUpdateStrategyType(in.Type)
  149. if in.RollingUpdate != nil {
  150. out.RollingUpdate = new(apps.RollingUpdateStatefulSetStrategy)
  151. out.RollingUpdate.Partition = *in.RollingUpdate.Partition
  152. } else {
  153. out.RollingUpdate = nil
  154. }
  155. return nil
  156. }
  157. func Convert_apps_StatefulSetUpdateStrategy_To_v1beta1_StatefulSetUpdateStrategy(in *apps.StatefulSetUpdateStrategy, out *appsv1beta1.StatefulSetUpdateStrategy, s conversion.Scope) error {
  158. out.Type = appsv1beta1.StatefulSetUpdateStrategyType(in.Type)
  159. if in.RollingUpdate != nil {
  160. out.RollingUpdate = new(appsv1beta1.RollingUpdateStatefulSetStrategy)
  161. out.RollingUpdate.Partition = new(int32)
  162. *out.RollingUpdate.Partition = in.RollingUpdate.Partition
  163. } else {
  164. out.RollingUpdate = nil
  165. }
  166. return nil
  167. }
  168. func Convert_autoscaling_ScaleStatus_To_v1beta1_ScaleStatus(in *autoscaling.ScaleStatus, out *appsv1beta1.ScaleStatus, s conversion.Scope) error {
  169. out.Replicas = int32(in.Replicas)
  170. out.TargetSelector = in.Selector
  171. out.Selector = nil
  172. selector, err := metav1.ParseToLabelSelector(in.Selector)
  173. if err != nil {
  174. return fmt.Errorf("failed to parse selector: %v", err)
  175. }
  176. if len(selector.MatchExpressions) == 0 {
  177. out.Selector = selector.MatchLabels
  178. }
  179. return nil
  180. }
  181. func Convert_v1beta1_ScaleStatus_To_autoscaling_ScaleStatus(in *appsv1beta1.ScaleStatus, out *autoscaling.ScaleStatus, s conversion.Scope) error {
  182. out.Replicas = in.Replicas
  183. if in.TargetSelector != "" {
  184. out.Selector = in.TargetSelector
  185. } else if in.Selector != nil {
  186. set := labels.Set{}
  187. for key, val := range in.Selector {
  188. set[key] = val
  189. }
  190. out.Selector = labels.SelectorFromSet(set).String()
  191. } else {
  192. out.Selector = ""
  193. }
  194. return nil
  195. }
  196. func Convert_v1beta1_DeploymentSpec_To_apps_DeploymentSpec(in *appsv1beta1.DeploymentSpec, out *apps.DeploymentSpec, s conversion.Scope) error {
  197. if in.Replicas != nil {
  198. out.Replicas = *in.Replicas
  199. }
  200. out.Selector = in.Selector
  201. if err := k8s_api_v1.Convert_v1_PodTemplateSpec_To_core_PodTemplateSpec(&in.Template, &out.Template, s); err != nil {
  202. return err
  203. }
  204. if err := Convert_v1beta1_DeploymentStrategy_To_apps_DeploymentStrategy(&in.Strategy, &out.Strategy, s); err != nil {
  205. return err
  206. }
  207. out.RevisionHistoryLimit = in.RevisionHistoryLimit
  208. out.MinReadySeconds = in.MinReadySeconds
  209. out.Paused = in.Paused
  210. if in.RollbackTo != nil {
  211. out.RollbackTo = new(apps.RollbackConfig)
  212. out.RollbackTo.Revision = in.RollbackTo.Revision
  213. } else {
  214. out.RollbackTo = nil
  215. }
  216. if in.ProgressDeadlineSeconds != nil {
  217. out.ProgressDeadlineSeconds = new(int32)
  218. *out.ProgressDeadlineSeconds = *in.ProgressDeadlineSeconds
  219. }
  220. return nil
  221. }
  222. func Convert_apps_DeploymentSpec_To_v1beta1_DeploymentSpec(in *apps.DeploymentSpec, out *appsv1beta1.DeploymentSpec, s conversion.Scope) error {
  223. out.Replicas = &in.Replicas
  224. out.Selector = in.Selector
  225. if err := k8s_api_v1.Convert_core_PodTemplateSpec_To_v1_PodTemplateSpec(&in.Template, &out.Template, s); err != nil {
  226. return err
  227. }
  228. if err := Convert_apps_DeploymentStrategy_To_v1beta1_DeploymentStrategy(&in.Strategy, &out.Strategy, s); err != nil {
  229. return err
  230. }
  231. if in.RevisionHistoryLimit != nil {
  232. out.RevisionHistoryLimit = new(int32)
  233. *out.RevisionHistoryLimit = int32(*in.RevisionHistoryLimit)
  234. }
  235. out.MinReadySeconds = int32(in.MinReadySeconds)
  236. out.Paused = in.Paused
  237. if in.RollbackTo != nil {
  238. out.RollbackTo = new(appsv1beta1.RollbackConfig)
  239. out.RollbackTo.Revision = int64(in.RollbackTo.Revision)
  240. } else {
  241. out.RollbackTo = nil
  242. }
  243. if in.ProgressDeadlineSeconds != nil {
  244. out.ProgressDeadlineSeconds = new(int32)
  245. *out.ProgressDeadlineSeconds = *in.ProgressDeadlineSeconds
  246. }
  247. return nil
  248. }
  249. func Convert_apps_DeploymentStrategy_To_v1beta1_DeploymentStrategy(in *apps.DeploymentStrategy, out *appsv1beta1.DeploymentStrategy, s conversion.Scope) error {
  250. out.Type = appsv1beta1.DeploymentStrategyType(in.Type)
  251. if in.RollingUpdate != nil {
  252. out.RollingUpdate = new(appsv1beta1.RollingUpdateDeployment)
  253. if err := Convert_apps_RollingUpdateDeployment_To_v1beta1_RollingUpdateDeployment(in.RollingUpdate, out.RollingUpdate, s); err != nil {
  254. return err
  255. }
  256. } else {
  257. out.RollingUpdate = nil
  258. }
  259. return nil
  260. }
  261. func Convert_v1beta1_DeploymentStrategy_To_apps_DeploymentStrategy(in *appsv1beta1.DeploymentStrategy, out *apps.DeploymentStrategy, s conversion.Scope) error {
  262. out.Type = apps.DeploymentStrategyType(in.Type)
  263. if in.RollingUpdate != nil {
  264. out.RollingUpdate = new(apps.RollingUpdateDeployment)
  265. if err := Convert_v1beta1_RollingUpdateDeployment_To_apps_RollingUpdateDeployment(in.RollingUpdate, out.RollingUpdate, s); err != nil {
  266. return err
  267. }
  268. } else {
  269. out.RollingUpdate = nil
  270. }
  271. return nil
  272. }
  273. func Convert_v1beta1_RollingUpdateDeployment_To_apps_RollingUpdateDeployment(in *appsv1beta1.RollingUpdateDeployment, out *apps.RollingUpdateDeployment, s conversion.Scope) error {
  274. if err := s.Convert(in.MaxUnavailable, &out.MaxUnavailable, 0); err != nil {
  275. return err
  276. }
  277. if err := s.Convert(in.MaxSurge, &out.MaxSurge, 0); err != nil {
  278. return err
  279. }
  280. return nil
  281. }
  282. func Convert_apps_RollingUpdateDeployment_To_v1beta1_RollingUpdateDeployment(in *apps.RollingUpdateDeployment, out *appsv1beta1.RollingUpdateDeployment, s conversion.Scope) error {
  283. if out.MaxUnavailable == nil {
  284. out.MaxUnavailable = &intstr.IntOrString{}
  285. }
  286. if err := s.Convert(&in.MaxUnavailable, out.MaxUnavailable, 0); err != nil {
  287. return err
  288. }
  289. if out.MaxSurge == nil {
  290. out.MaxSurge = &intstr.IntOrString{}
  291. }
  292. if err := s.Convert(&in.MaxSurge, out.MaxSurge, 0); err != nil {
  293. return err
  294. }
  295. return nil
  296. }