conversion.go 6.2 KB

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