conversion.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401
  1. /*
  2. Copyright 2015 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. "k8s.io/kubernetes/pkg/api"
  17. "k8s.io/kubernetes/pkg/api/unversioned"
  18. v1 "k8s.io/kubernetes/pkg/api/v1"
  19. "k8s.io/kubernetes/pkg/apis/autoscaling"
  20. "k8s.io/kubernetes/pkg/apis/batch"
  21. "k8s.io/kubernetes/pkg/apis/extensions"
  22. "k8s.io/kubernetes/pkg/conversion"
  23. "k8s.io/kubernetes/pkg/runtime"
  24. "k8s.io/kubernetes/pkg/util/intstr"
  25. )
  26. func addConversionFuncs(scheme *runtime.Scheme) error {
  27. // Add non-generated conversion functions
  28. err := scheme.AddConversionFuncs(
  29. Convert_extensions_ScaleStatus_To_v1beta1_ScaleStatus,
  30. Convert_v1beta1_ScaleStatus_To_extensions_ScaleStatus,
  31. Convert_extensions_DeploymentSpec_To_v1beta1_DeploymentSpec,
  32. Convert_v1beta1_DeploymentSpec_To_extensions_DeploymentSpec,
  33. Convert_extensions_DeploymentStrategy_To_v1beta1_DeploymentStrategy,
  34. Convert_v1beta1_DeploymentStrategy_To_extensions_DeploymentStrategy,
  35. Convert_extensions_RollingUpdateDeployment_To_v1beta1_RollingUpdateDeployment,
  36. Convert_v1beta1_RollingUpdateDeployment_To_extensions_RollingUpdateDeployment,
  37. Convert_extensions_ReplicaSetSpec_To_v1beta1_ReplicaSetSpec,
  38. Convert_v1beta1_ReplicaSetSpec_To_extensions_ReplicaSetSpec,
  39. // autoscaling
  40. Convert_autoscaling_CrossVersionObjectReference_To_v1beta1_SubresourceReference,
  41. Convert_v1beta1_SubresourceReference_To_autoscaling_CrossVersionObjectReference,
  42. Convert_autoscaling_HorizontalPodAutoscalerSpec_To_v1beta1_HorizontalPodAutoscalerSpec,
  43. Convert_v1beta1_HorizontalPodAutoscalerSpec_To_autoscaling_HorizontalPodAutoscalerSpec,
  44. // batch
  45. Convert_batch_JobSpec_To_v1beta1_JobSpec,
  46. Convert_v1beta1_JobSpec_To_batch_JobSpec,
  47. )
  48. if err != nil {
  49. return err
  50. }
  51. // Add field label conversions for kinds having selectable nothing but ObjectMeta fields.
  52. for _, k := range []string{"DaemonSet", "Deployment", "Ingress"} {
  53. kind := k // don't close over range variables
  54. err = api.Scheme.AddFieldLabelConversionFunc("extensions/v1beta1", kind,
  55. func(label, value string) (string, string, error) {
  56. switch label {
  57. case "metadata.name", "metadata.namespace":
  58. return label, value, nil
  59. default:
  60. return "", "", fmt.Errorf("field label %q not supported for %q", label, kind)
  61. }
  62. },
  63. )
  64. if err != nil {
  65. return err
  66. }
  67. }
  68. return api.Scheme.AddFieldLabelConversionFunc("extensions/v1beta1", "Job",
  69. func(label, value string) (string, string, error) {
  70. switch label {
  71. case "metadata.name", "metadata.namespace", "status.successful":
  72. return label, value, nil
  73. default:
  74. return "", "", fmt.Errorf("field label not supported: %s", label)
  75. }
  76. },
  77. )
  78. }
  79. func Convert_extensions_ScaleStatus_To_v1beta1_ScaleStatus(in *extensions.ScaleStatus, out *ScaleStatus, s conversion.Scope) error {
  80. out.Replicas = int32(in.Replicas)
  81. out.Selector = nil
  82. out.TargetSelector = ""
  83. if in.Selector != nil {
  84. if in.Selector.MatchExpressions == nil || len(in.Selector.MatchExpressions) == 0 {
  85. out.Selector = in.Selector.MatchLabels
  86. }
  87. selector, err := unversioned.LabelSelectorAsSelector(in.Selector)
  88. if err != nil {
  89. return fmt.Errorf("invalid label selector: %v", err)
  90. }
  91. out.TargetSelector = selector.String()
  92. }
  93. return nil
  94. }
  95. func Convert_v1beta1_ScaleStatus_To_extensions_ScaleStatus(in *ScaleStatus, out *extensions.ScaleStatus, s conversion.Scope) error {
  96. out.Replicas = in.Replicas
  97. // Normally when 2 fields map to the same internal value we favor the old field, since
  98. // old clients can't be expected to know about new fields but clients that know about the
  99. // new field can be expected to know about the old field (though that's not quite true, due
  100. // to kubectl apply). However, these fields are readonly, so any non-nil value should work.
  101. if in.TargetSelector != "" {
  102. labelSelector, err := unversioned.ParseToLabelSelector(in.TargetSelector)
  103. if err != nil {
  104. out.Selector = nil
  105. return fmt.Errorf("failed to parse target selector: %v", err)
  106. }
  107. out.Selector = labelSelector
  108. } else if in.Selector != nil {
  109. out.Selector = new(unversioned.LabelSelector)
  110. selector := make(map[string]string)
  111. for key, val := range in.Selector {
  112. selector[key] = val
  113. }
  114. out.Selector.MatchLabels = selector
  115. } else {
  116. out.Selector = nil
  117. }
  118. return nil
  119. }
  120. func Convert_extensions_DeploymentSpec_To_v1beta1_DeploymentSpec(in *extensions.DeploymentSpec, out *DeploymentSpec, s conversion.Scope) error {
  121. out.Replicas = &in.Replicas
  122. if in.Selector != nil {
  123. out.Selector = new(LabelSelector)
  124. if err := Convert_unversioned_LabelSelector_To_v1beta1_LabelSelector(in.Selector, out.Selector, s); err != nil {
  125. return err
  126. }
  127. } else {
  128. out.Selector = nil
  129. }
  130. if err := v1.Convert_api_PodTemplateSpec_To_v1_PodTemplateSpec(&in.Template, &out.Template, s); err != nil {
  131. return err
  132. }
  133. if err := Convert_extensions_DeploymentStrategy_To_v1beta1_DeploymentStrategy(&in.Strategy, &out.Strategy, s); err != nil {
  134. return err
  135. }
  136. if in.RevisionHistoryLimit != nil {
  137. out.RevisionHistoryLimit = new(int32)
  138. *out.RevisionHistoryLimit = int32(*in.RevisionHistoryLimit)
  139. }
  140. out.MinReadySeconds = int32(in.MinReadySeconds)
  141. out.Paused = in.Paused
  142. if in.RollbackTo != nil {
  143. out.RollbackTo = new(RollbackConfig)
  144. out.RollbackTo.Revision = int64(in.RollbackTo.Revision)
  145. } else {
  146. out.RollbackTo = nil
  147. }
  148. return nil
  149. }
  150. func Convert_v1beta1_DeploymentSpec_To_extensions_DeploymentSpec(in *DeploymentSpec, out *extensions.DeploymentSpec, s conversion.Scope) error {
  151. if in.Replicas != nil {
  152. out.Replicas = *in.Replicas
  153. }
  154. if in.Selector != nil {
  155. out.Selector = new(unversioned.LabelSelector)
  156. if err := Convert_v1beta1_LabelSelector_To_unversioned_LabelSelector(in.Selector, out.Selector, s); err != nil {
  157. return err
  158. }
  159. } else {
  160. out.Selector = nil
  161. }
  162. if err := v1.Convert_v1_PodTemplateSpec_To_api_PodTemplateSpec(&in.Template, &out.Template, s); err != nil {
  163. return err
  164. }
  165. if err := Convert_v1beta1_DeploymentStrategy_To_extensions_DeploymentStrategy(&in.Strategy, &out.Strategy, s); err != nil {
  166. return err
  167. }
  168. out.RevisionHistoryLimit = in.RevisionHistoryLimit
  169. out.MinReadySeconds = in.MinReadySeconds
  170. out.Paused = in.Paused
  171. if in.RollbackTo != nil {
  172. out.RollbackTo = new(extensions.RollbackConfig)
  173. out.RollbackTo.Revision = in.RollbackTo.Revision
  174. } else {
  175. out.RollbackTo = nil
  176. }
  177. return nil
  178. }
  179. func Convert_extensions_DeploymentStrategy_To_v1beta1_DeploymentStrategy(in *extensions.DeploymentStrategy, out *DeploymentStrategy, s conversion.Scope) error {
  180. out.Type = DeploymentStrategyType(in.Type)
  181. if in.RollingUpdate != nil {
  182. out.RollingUpdate = new(RollingUpdateDeployment)
  183. if err := Convert_extensions_RollingUpdateDeployment_To_v1beta1_RollingUpdateDeployment(in.RollingUpdate, out.RollingUpdate, s); err != nil {
  184. return err
  185. }
  186. } else {
  187. out.RollingUpdate = nil
  188. }
  189. return nil
  190. }
  191. func Convert_v1beta1_DeploymentStrategy_To_extensions_DeploymentStrategy(in *DeploymentStrategy, out *extensions.DeploymentStrategy, s conversion.Scope) error {
  192. out.Type = extensions.DeploymentStrategyType(in.Type)
  193. if in.RollingUpdate != nil {
  194. out.RollingUpdate = new(extensions.RollingUpdateDeployment)
  195. if err := Convert_v1beta1_RollingUpdateDeployment_To_extensions_RollingUpdateDeployment(in.RollingUpdate, out.RollingUpdate, s); err != nil {
  196. return err
  197. }
  198. } else {
  199. out.RollingUpdate = nil
  200. }
  201. return nil
  202. }
  203. func Convert_extensions_RollingUpdateDeployment_To_v1beta1_RollingUpdateDeployment(in *extensions.RollingUpdateDeployment, out *RollingUpdateDeployment, s conversion.Scope) error {
  204. if out.MaxUnavailable == nil {
  205. out.MaxUnavailable = &intstr.IntOrString{}
  206. }
  207. if err := s.Convert(&in.MaxUnavailable, out.MaxUnavailable, 0); err != nil {
  208. return err
  209. }
  210. if out.MaxSurge == nil {
  211. out.MaxSurge = &intstr.IntOrString{}
  212. }
  213. if err := s.Convert(&in.MaxSurge, out.MaxSurge, 0); err != nil {
  214. return err
  215. }
  216. return nil
  217. }
  218. func Convert_v1beta1_RollingUpdateDeployment_To_extensions_RollingUpdateDeployment(in *RollingUpdateDeployment, out *extensions.RollingUpdateDeployment, s conversion.Scope) error {
  219. if err := s.Convert(in.MaxUnavailable, &out.MaxUnavailable, 0); err != nil {
  220. return err
  221. }
  222. if err := s.Convert(in.MaxSurge, &out.MaxSurge, 0); err != nil {
  223. return err
  224. }
  225. return nil
  226. }
  227. func Convert_extensions_ReplicaSetSpec_To_v1beta1_ReplicaSetSpec(in *extensions.ReplicaSetSpec, out *ReplicaSetSpec, s conversion.Scope) error {
  228. out.Replicas = new(int32)
  229. *out.Replicas = int32(in.Replicas)
  230. if in.Selector != nil {
  231. out.Selector = new(LabelSelector)
  232. if err := Convert_unversioned_LabelSelector_To_v1beta1_LabelSelector(in.Selector, out.Selector, s); err != nil {
  233. return err
  234. }
  235. } else {
  236. out.Selector = nil
  237. }
  238. if err := v1.Convert_api_PodTemplateSpec_To_v1_PodTemplateSpec(&in.Template, &out.Template, s); err != nil {
  239. return err
  240. }
  241. return nil
  242. }
  243. func Convert_v1beta1_ReplicaSetSpec_To_extensions_ReplicaSetSpec(in *ReplicaSetSpec, out *extensions.ReplicaSetSpec, s conversion.Scope) error {
  244. if in.Replicas != nil {
  245. out.Replicas = *in.Replicas
  246. }
  247. if in.Selector != nil {
  248. out.Selector = new(unversioned.LabelSelector)
  249. if err := Convert_v1beta1_LabelSelector_To_unversioned_LabelSelector(in.Selector, out.Selector, s); err != nil {
  250. return err
  251. }
  252. } else {
  253. out.Selector = nil
  254. }
  255. if err := v1.Convert_v1_PodTemplateSpec_To_api_PodTemplateSpec(&in.Template, &out.Template, s); err != nil {
  256. return err
  257. }
  258. return nil
  259. }
  260. func Convert_batch_JobSpec_To_v1beta1_JobSpec(in *batch.JobSpec, out *JobSpec, s conversion.Scope) error {
  261. out.Parallelism = in.Parallelism
  262. out.Completions = in.Completions
  263. out.ActiveDeadlineSeconds = in.ActiveDeadlineSeconds
  264. // unable to generate simple pointer conversion for unversioned.LabelSelector -> v1beta1.LabelSelector
  265. if in.Selector != nil {
  266. out.Selector = new(LabelSelector)
  267. if err := Convert_unversioned_LabelSelector_To_v1beta1_LabelSelector(in.Selector, out.Selector, s); err != nil {
  268. return err
  269. }
  270. } else {
  271. out.Selector = nil
  272. }
  273. // BEGIN non-standard conversion
  274. // autoSelector has opposite meaning as manualSelector.
  275. // in both cases, unset means false, and unset is always preferred to false.
  276. // unset vs set-false distinction is not preserved.
  277. manualSelector := in.ManualSelector != nil && *in.ManualSelector
  278. autoSelector := !manualSelector
  279. if autoSelector {
  280. out.AutoSelector = new(bool)
  281. *out.AutoSelector = true
  282. } else {
  283. out.AutoSelector = nil
  284. }
  285. // END non-standard conversion
  286. if err := v1.Convert_api_PodTemplateSpec_To_v1_PodTemplateSpec(&in.Template, &out.Template, s); err != nil {
  287. return err
  288. }
  289. return nil
  290. }
  291. func Convert_v1beta1_JobSpec_To_batch_JobSpec(in *JobSpec, out *batch.JobSpec, s conversion.Scope) error {
  292. out.Parallelism = in.Parallelism
  293. out.Completions = in.Completions
  294. out.ActiveDeadlineSeconds = in.ActiveDeadlineSeconds
  295. // unable to generate simple pointer conversion for v1beta1.LabelSelector -> unversioned.LabelSelector
  296. if in.Selector != nil {
  297. out.Selector = new(unversioned.LabelSelector)
  298. if err := Convert_v1beta1_LabelSelector_To_unversioned_LabelSelector(in.Selector, out.Selector, s); err != nil {
  299. return err
  300. }
  301. } else {
  302. out.Selector = nil
  303. }
  304. // BEGIN non-standard conversion
  305. // autoSelector has opposite meaning as manualSelector.
  306. // in both cases, unset means false, and unset is always preferred to false.
  307. // unset vs set-false distinction is not preserved.
  308. autoSelector := bool(in.AutoSelector != nil && *in.AutoSelector)
  309. manualSelector := !autoSelector
  310. if manualSelector {
  311. out.ManualSelector = new(bool)
  312. *out.ManualSelector = true
  313. } else {
  314. out.ManualSelector = nil
  315. }
  316. // END non-standard conversion
  317. if err := v1.Convert_v1_PodTemplateSpec_To_api_PodTemplateSpec(&in.Template, &out.Template, s); err != nil {
  318. return err
  319. }
  320. return nil
  321. }
  322. func Convert_autoscaling_CrossVersionObjectReference_To_v1beta1_SubresourceReference(in *autoscaling.CrossVersionObjectReference, out *SubresourceReference, s conversion.Scope) error {
  323. out.Kind = in.Kind
  324. out.Name = in.Name
  325. out.APIVersion = in.APIVersion
  326. out.Subresource = "scale"
  327. return nil
  328. }
  329. func Convert_v1beta1_SubresourceReference_To_autoscaling_CrossVersionObjectReference(in *SubresourceReference, out *autoscaling.CrossVersionObjectReference, s conversion.Scope) error {
  330. out.Kind = in.Kind
  331. out.Name = in.Name
  332. out.APIVersion = in.APIVersion
  333. return nil
  334. }
  335. func Convert_autoscaling_HorizontalPodAutoscalerSpec_To_v1beta1_HorizontalPodAutoscalerSpec(in *autoscaling.HorizontalPodAutoscalerSpec, out *HorizontalPodAutoscalerSpec, s conversion.Scope) error {
  336. if err := Convert_autoscaling_CrossVersionObjectReference_To_v1beta1_SubresourceReference(&in.ScaleTargetRef, &out.ScaleRef, s); err != nil {
  337. return err
  338. }
  339. if in.MinReplicas != nil {
  340. out.MinReplicas = new(int32)
  341. *out.MinReplicas = *in.MinReplicas
  342. } else {
  343. out.MinReplicas = nil
  344. }
  345. out.MaxReplicas = in.MaxReplicas
  346. if in.TargetCPUUtilizationPercentage != nil {
  347. out.CPUUtilization = &CPUTargetUtilization{TargetPercentage: *in.TargetCPUUtilizationPercentage}
  348. }
  349. return nil
  350. }
  351. func Convert_v1beta1_HorizontalPodAutoscalerSpec_To_autoscaling_HorizontalPodAutoscalerSpec(in *HorizontalPodAutoscalerSpec, out *autoscaling.HorizontalPodAutoscalerSpec, s conversion.Scope) error {
  352. if err := Convert_v1beta1_SubresourceReference_To_autoscaling_CrossVersionObjectReference(&in.ScaleRef, &out.ScaleTargetRef, s); err != nil {
  353. return err
  354. }
  355. if in.MinReplicas != nil {
  356. out.MinReplicas = new(int32)
  357. *out.MinReplicas = int32(*in.MinReplicas)
  358. } else {
  359. out.MinReplicas = nil
  360. }
  361. out.MaxReplicas = int32(in.MaxReplicas)
  362. if in.CPUUtilization != nil {
  363. out.TargetCPUUtilizationPercentage = new(int32)
  364. *out.TargetCPUUtilizationPercentage = int32(in.CPUUtilization.TargetPercentage)
  365. }
  366. return nil
  367. }