conversion.go 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  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. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  17. "k8s.io/apimachinery/pkg/conversion"
  18. "k8s.io/apimachinery/pkg/runtime"
  19. "k8s.io/apimachinery/pkg/util/intstr"
  20. "k8s.io/client-go/pkg/api"
  21. "k8s.io/client-go/pkg/api/v1"
  22. "k8s.io/client-go/pkg/apis/apps"
  23. "k8s.io/client-go/pkg/apis/extensions"
  24. )
  25. func addConversionFuncs(scheme *runtime.Scheme) error {
  26. // Add non-generated conversion functions to handle the *int32 -> int32
  27. // conversion. A pointer is useful in the versioned type so we can default
  28. // it, but a plain int32 is more convenient in the internal type. These
  29. // functions are the same as the autogenerated ones in every other way.
  30. err := scheme.AddConversionFuncs(
  31. Convert_v1beta1_StatefulSetSpec_To_apps_StatefulSetSpec,
  32. Convert_apps_StatefulSetSpec_To_v1beta1_StatefulSetSpec,
  33. // extensions
  34. // TODO: below conversions should be dropped in favor of auto-generated
  35. // ones, see https://github.com/kubernetes/kubernetextensionsssues/39865
  36. Convert_v1beta1_ScaleStatus_To_extensions_ScaleStatus,
  37. Convert_extensions_ScaleStatus_To_v1beta1_ScaleStatus,
  38. Convert_v1beta1_DeploymentSpec_To_extensions_DeploymentSpec,
  39. Convert_extensions_DeploymentSpec_To_v1beta1_DeploymentSpec,
  40. Convert_v1beta1_DeploymentStrategy_To_extensions_DeploymentStrategy,
  41. Convert_extensions_DeploymentStrategy_To_v1beta1_DeploymentStrategy,
  42. Convert_v1beta1_RollingUpdateDeployment_To_extensions_RollingUpdateDeployment,
  43. Convert_extensions_RollingUpdateDeployment_To_v1beta1_RollingUpdateDeployment,
  44. )
  45. if err != nil {
  46. return err
  47. }
  48. // Add field label conversions for kinds having selectable nothing but ObjectMeta fields.
  49. err = scheme.AddFieldLabelConversionFunc("apps/v1beta1", "StatefulSet",
  50. func(label, value string) (string, string, error) {
  51. switch label {
  52. case "metadata.name", "metadata.namespace", "status.successful":
  53. return label, value, nil
  54. default:
  55. return "", "", fmt.Errorf("field label not supported for StatefulSet: %s", label)
  56. }
  57. })
  58. if err != nil {
  59. return err
  60. }
  61. err = api.Scheme.AddFieldLabelConversionFunc("apps/v1beta1", "Deployment",
  62. func(label, value string) (string, string, error) {
  63. switch label {
  64. case "metadata.name", "metadata.namespace":
  65. return label, value, nil
  66. default:
  67. return "", "", fmt.Errorf("field label %q not supported for Deployment", label)
  68. }
  69. })
  70. if err != nil {
  71. return err
  72. }
  73. return nil
  74. }
  75. func Convert_v1beta1_StatefulSetSpec_To_apps_StatefulSetSpec(in *StatefulSetSpec, out *apps.StatefulSetSpec, s conversion.Scope) error {
  76. if in.Replicas != nil {
  77. out.Replicas = *in.Replicas
  78. }
  79. if in.Selector != nil {
  80. in, out := &in.Selector, &out.Selector
  81. *out = new(metav1.LabelSelector)
  82. if err := s.Convert(*in, *out, 0); err != nil {
  83. return err
  84. }
  85. } else {
  86. out.Selector = nil
  87. }
  88. if err := s.Convert(&in.Template, &out.Template, 0); err != nil {
  89. return err
  90. }
  91. if in.VolumeClaimTemplates != nil {
  92. in, out := &in.VolumeClaimTemplates, &out.VolumeClaimTemplates
  93. *out = make([]api.PersistentVolumeClaim, len(*in))
  94. for i := range *in {
  95. if err := s.Convert(&(*in)[i], &(*out)[i], 0); err != nil {
  96. return err
  97. }
  98. }
  99. } else {
  100. out.VolumeClaimTemplates = nil
  101. }
  102. out.ServiceName = in.ServiceName
  103. return nil
  104. }
  105. func Convert_apps_StatefulSetSpec_To_v1beta1_StatefulSetSpec(in *apps.StatefulSetSpec, out *StatefulSetSpec, s conversion.Scope) error {
  106. out.Replicas = new(int32)
  107. *out.Replicas = in.Replicas
  108. if in.Selector != nil {
  109. in, out := &in.Selector, &out.Selector
  110. *out = new(metav1.LabelSelector)
  111. if err := s.Convert(*in, *out, 0); err != nil {
  112. return err
  113. }
  114. } else {
  115. out.Selector = nil
  116. }
  117. if err := s.Convert(&in.Template, &out.Template, 0); err != nil {
  118. return err
  119. }
  120. if in.VolumeClaimTemplates != nil {
  121. in, out := &in.VolumeClaimTemplates, &out.VolumeClaimTemplates
  122. *out = make([]v1.PersistentVolumeClaim, len(*in))
  123. for i := range *in {
  124. if err := s.Convert(&(*in)[i], &(*out)[i], 0); err != nil {
  125. return err
  126. }
  127. }
  128. } else {
  129. out.VolumeClaimTemplates = nil
  130. }
  131. out.ServiceName = in.ServiceName
  132. return nil
  133. }
  134. func Convert_extensions_ScaleStatus_To_v1beta1_ScaleStatus(in *extensions.ScaleStatus, out *ScaleStatus, s conversion.Scope) error {
  135. out.Replicas = int32(in.Replicas)
  136. out.Selector = nil
  137. out.TargetSelector = ""
  138. if in.Selector != nil {
  139. if in.Selector.MatchExpressions == nil || len(in.Selector.MatchExpressions) == 0 {
  140. out.Selector = in.Selector.MatchLabels
  141. }
  142. selector, err := metav1.LabelSelectorAsSelector(in.Selector)
  143. if err != nil {
  144. return fmt.Errorf("invalid label selector: %v", err)
  145. }
  146. out.TargetSelector = selector.String()
  147. }
  148. return nil
  149. }
  150. func Convert_v1beta1_ScaleStatus_To_extensions_ScaleStatus(in *ScaleStatus, out *extensions.ScaleStatus, s conversion.Scope) error {
  151. out.Replicas = in.Replicas
  152. // Normally when 2 fields map to the same internal value we favor the old field, since
  153. // old clients can't be expected to know about new fields but clients that know about the
  154. // new field can be expected to know about the old field (though that's not quite true, due
  155. // to kubectl apply). However, these fields are readonly, so any non-nil value should work.
  156. if in.TargetSelector != "" {
  157. labelSelector, err := metav1.ParseToLabelSelector(in.TargetSelector)
  158. if err != nil {
  159. out.Selector = nil
  160. return fmt.Errorf("failed to parse target selector: %v", err)
  161. }
  162. out.Selector = labelSelector
  163. } else if in.Selector != nil {
  164. out.Selector = new(metav1.LabelSelector)
  165. selector := make(map[string]string)
  166. for key, val := range in.Selector {
  167. selector[key] = val
  168. }
  169. out.Selector.MatchLabels = selector
  170. } else {
  171. out.Selector = nil
  172. }
  173. return nil
  174. }
  175. func Convert_v1beta1_DeploymentSpec_To_extensions_DeploymentSpec(in *DeploymentSpec, out *extensions.DeploymentSpec, s conversion.Scope) error {
  176. if in.Replicas != nil {
  177. out.Replicas = *in.Replicas
  178. }
  179. out.Selector = in.Selector
  180. if err := v1.Convert_v1_PodTemplateSpec_To_api_PodTemplateSpec(&in.Template, &out.Template, s); err != nil {
  181. return err
  182. }
  183. if err := Convert_v1beta1_DeploymentStrategy_To_extensions_DeploymentStrategy(&in.Strategy, &out.Strategy, s); err != nil {
  184. return err
  185. }
  186. out.RevisionHistoryLimit = in.RevisionHistoryLimit
  187. out.MinReadySeconds = in.MinReadySeconds
  188. out.Paused = in.Paused
  189. if in.RollbackTo != nil {
  190. out.RollbackTo = new(extensions.RollbackConfig)
  191. out.RollbackTo.Revision = in.RollbackTo.Revision
  192. } else {
  193. out.RollbackTo = nil
  194. }
  195. if in.ProgressDeadlineSeconds != nil {
  196. out.ProgressDeadlineSeconds = new(int32)
  197. *out.ProgressDeadlineSeconds = *in.ProgressDeadlineSeconds
  198. }
  199. return nil
  200. }
  201. func Convert_extensions_DeploymentSpec_To_v1beta1_DeploymentSpec(in *extensions.DeploymentSpec, out *DeploymentSpec, s conversion.Scope) error {
  202. out.Replicas = &in.Replicas
  203. out.Selector = in.Selector
  204. if err := v1.Convert_api_PodTemplateSpec_To_v1_PodTemplateSpec(&in.Template, &out.Template, s); err != nil {
  205. return err
  206. }
  207. if err := Convert_extensions_DeploymentStrategy_To_v1beta1_DeploymentStrategy(&in.Strategy, &out.Strategy, s); err != nil {
  208. return err
  209. }
  210. if in.RevisionHistoryLimit != nil {
  211. out.RevisionHistoryLimit = new(int32)
  212. *out.RevisionHistoryLimit = int32(*in.RevisionHistoryLimit)
  213. }
  214. out.MinReadySeconds = int32(in.MinReadySeconds)
  215. out.Paused = in.Paused
  216. if in.RollbackTo != nil {
  217. out.RollbackTo = new(RollbackConfig)
  218. out.RollbackTo.Revision = int64(in.RollbackTo.Revision)
  219. } else {
  220. out.RollbackTo = nil
  221. }
  222. if in.ProgressDeadlineSeconds != nil {
  223. out.ProgressDeadlineSeconds = new(int32)
  224. *out.ProgressDeadlineSeconds = *in.ProgressDeadlineSeconds
  225. }
  226. return nil
  227. }
  228. func Convert_extensions_DeploymentStrategy_To_v1beta1_DeploymentStrategy(in *extensions.DeploymentStrategy, out *DeploymentStrategy, s conversion.Scope) error {
  229. out.Type = DeploymentStrategyType(in.Type)
  230. if in.RollingUpdate != nil {
  231. out.RollingUpdate = new(RollingUpdateDeployment)
  232. if err := Convert_extensions_RollingUpdateDeployment_To_v1beta1_RollingUpdateDeployment(in.RollingUpdate, out.RollingUpdate, s); err != nil {
  233. return err
  234. }
  235. } else {
  236. out.RollingUpdate = nil
  237. }
  238. return nil
  239. }
  240. func Convert_v1beta1_DeploymentStrategy_To_extensions_DeploymentStrategy(in *DeploymentStrategy, out *extensions.DeploymentStrategy, s conversion.Scope) error {
  241. out.Type = extensions.DeploymentStrategyType(in.Type)
  242. if in.RollingUpdate != nil {
  243. out.RollingUpdate = new(extensions.RollingUpdateDeployment)
  244. if err := Convert_v1beta1_RollingUpdateDeployment_To_extensions_RollingUpdateDeployment(in.RollingUpdate, out.RollingUpdate, s); err != nil {
  245. return err
  246. }
  247. } else {
  248. out.RollingUpdate = nil
  249. }
  250. return nil
  251. }
  252. func Convert_v1beta1_RollingUpdateDeployment_To_extensions_RollingUpdateDeployment(in *RollingUpdateDeployment, out *extensions.RollingUpdateDeployment, s conversion.Scope) error {
  253. if err := s.Convert(in.MaxUnavailable, &out.MaxUnavailable, 0); err != nil {
  254. return err
  255. }
  256. if err := s.Convert(in.MaxSurge, &out.MaxSurge, 0); err != nil {
  257. return err
  258. }
  259. return nil
  260. }
  261. func Convert_extensions_RollingUpdateDeployment_To_v1beta1_RollingUpdateDeployment(in *extensions.RollingUpdateDeployment, out *RollingUpdateDeployment, s conversion.Scope) error {
  262. if out.MaxUnavailable == nil {
  263. out.MaxUnavailable = &intstr.IntOrString{}
  264. }
  265. if err := s.Convert(&in.MaxUnavailable, out.MaxUnavailable, 0); err != nil {
  266. return err
  267. }
  268. if out.MaxSurge == nil {
  269. out.MaxSurge = &intstr.IntOrString{}
  270. }
  271. if err := s.Convert(&in.MaxSurge, out.MaxSurge, 0); err != nil {
  272. return err
  273. }
  274. return nil
  275. }