conversion.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527
  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 v1
  14. import (
  15. "encoding/json"
  16. autoscalingv1 "k8s.io/api/autoscaling/v1"
  17. v1 "k8s.io/api/core/v1"
  18. "k8s.io/apimachinery/pkg/conversion"
  19. "k8s.io/apimachinery/pkg/runtime"
  20. "k8s.io/kubernetes/pkg/apis/autoscaling"
  21. "k8s.io/kubernetes/pkg/apis/core"
  22. )
  23. func addConversionFuncs(scheme *runtime.Scheme) error {
  24. // Add non-generated conversion functions
  25. err := scheme.AddConversionFuncs(
  26. Convert_autoscaling_HorizontalPodAutoscaler_To_v1_HorizontalPodAutoscaler,
  27. Convert_v1_HorizontalPodAutoscaler_To_autoscaling_HorizontalPodAutoscaler,
  28. Convert_autoscaling_HorizontalPodAutoscalerSpec_To_v1_HorizontalPodAutoscalerSpec,
  29. Convert_v1_HorizontalPodAutoscalerSpec_To_autoscaling_HorizontalPodAutoscalerSpec,
  30. Convert_autoscaling_HorizontalPodAutoscalerStatus_To_v1_HorizontalPodAutoscalerStatus,
  31. Convert_v1_HorizontalPodAutoscalerStatus_To_autoscaling_HorizontalPodAutoscalerStatus,
  32. Convert_autoscaling_ExternalMetricSource_To_v1_ExternalMetricSource,
  33. Convert_v1_ExternalMetricSource_To_autoscaling_ExternalMetricSource,
  34. Convert_autoscaling_ObjectMetricSource_To_v1_ObjectMetricSource,
  35. Convert_v1_ObjectMetricSource_To_autoscaling_ObjectMetricSource,
  36. Convert_autoscaling_PodsMetricSource_To_v1_PodsMetricSource,
  37. Convert_v1_PodsMetricSource_To_autoscaling_PodsMetricSource,
  38. Convert_autoscaling_ExternalMetricStatus_To_v1_ExternalMetricStatus,
  39. Convert_v1_ExternalMetricStatus_To_autoscaling_ExternalMetricStatus,
  40. Convert_autoscaling_ObjectMetricStatus_To_v1_ObjectMetricStatus,
  41. Convert_v1_ObjectMetricStatus_To_autoscaling_ObjectMetricStatus,
  42. Convert_autoscaling_PodsMetricStatus_To_v1_PodsMetricStatus,
  43. Convert_v1_PodsMetricStatus_To_autoscaling_PodsMetricStatus,
  44. Convert_autoscaling_MetricTarget_To_v1_CrossVersionObjectReference,
  45. Convert_v1_CrossVersionObjectReference_To_autoscaling_MetricTarget,
  46. Convert_autoscaling_ResourceMetricStatus_To_v1_ResourceMetricStatus,
  47. Convert_v1_ResourceMetricStatus_To_autoscaling_ResourceMetricStatus,
  48. )
  49. if err != nil {
  50. return err
  51. }
  52. return nil
  53. }
  54. func Convert_autoscaling_MetricTarget_To_v1_CrossVersionObjectReference(in *autoscaling.MetricTarget, out *autoscalingv1.CrossVersionObjectReference, s conversion.Scope) error {
  55. return nil
  56. }
  57. func Convert_v1_CrossVersionObjectReference_To_autoscaling_MetricTarget(in *autoscalingv1.CrossVersionObjectReference, out *autoscaling.MetricTarget, s conversion.Scope) error {
  58. return nil
  59. }
  60. func Convert_autoscaling_ExternalMetricSource_To_v1_ExternalMetricSource(in *autoscaling.ExternalMetricSource, out *autoscalingv1.ExternalMetricSource, s conversion.Scope) error {
  61. out.MetricName = in.Metric.Name
  62. out.TargetValue = in.Target.Value
  63. out.TargetAverageValue = in.Target.AverageValue
  64. out.MetricSelector = in.Metric.Selector
  65. return nil
  66. }
  67. func Convert_v1_ExternalMetricSource_To_autoscaling_ExternalMetricSource(in *autoscalingv1.ExternalMetricSource, out *autoscaling.ExternalMetricSource, s conversion.Scope) error {
  68. value := in.TargetValue
  69. averageValue := in.TargetAverageValue
  70. var metricType autoscaling.MetricTargetType
  71. if value == nil {
  72. metricType = autoscaling.AverageValueMetricType
  73. } else {
  74. metricType = autoscaling.ValueMetricType
  75. }
  76. out.Target = autoscaling.MetricTarget{
  77. Type: metricType,
  78. Value: value,
  79. AverageValue: averageValue,
  80. }
  81. out.Metric = autoscaling.MetricIdentifier{
  82. Name: in.MetricName,
  83. Selector: in.MetricSelector,
  84. }
  85. return nil
  86. }
  87. func Convert_autoscaling_ObjectMetricSource_To_v1_ObjectMetricSource(in *autoscaling.ObjectMetricSource, out *autoscalingv1.ObjectMetricSource, s conversion.Scope) error {
  88. if in.Target.Value != nil {
  89. out.TargetValue = *in.Target.Value
  90. }
  91. out.AverageValue = in.Target.AverageValue
  92. out.Target = autoscalingv1.CrossVersionObjectReference{
  93. Kind: in.DescribedObject.Kind,
  94. Name: in.DescribedObject.Name,
  95. APIVersion: in.DescribedObject.APIVersion,
  96. }
  97. out.MetricName = in.Metric.Name
  98. out.Selector = in.Metric.Selector
  99. return nil
  100. }
  101. func Convert_v1_ObjectMetricSource_To_autoscaling_ObjectMetricSource(in *autoscalingv1.ObjectMetricSource, out *autoscaling.ObjectMetricSource, s conversion.Scope) error {
  102. var metricType autoscaling.MetricTargetType
  103. if in.AverageValue == nil {
  104. metricType = autoscaling.ValueMetricType
  105. } else {
  106. metricType = autoscaling.AverageValueMetricType
  107. }
  108. out.Target = autoscaling.MetricTarget{
  109. Type: metricType,
  110. Value: &in.TargetValue,
  111. AverageValue: in.AverageValue,
  112. }
  113. out.DescribedObject = autoscaling.CrossVersionObjectReference{
  114. Kind: in.Target.Kind,
  115. Name: in.Target.Name,
  116. APIVersion: in.Target.APIVersion,
  117. }
  118. out.Metric = autoscaling.MetricIdentifier{
  119. Name: in.MetricName,
  120. Selector: in.Selector,
  121. }
  122. return nil
  123. }
  124. func Convert_autoscaling_PodsMetricSource_To_v1_PodsMetricSource(in *autoscaling.PodsMetricSource, out *autoscalingv1.PodsMetricSource, s conversion.Scope) error {
  125. if in.Target.AverageValue != nil {
  126. out.TargetAverageValue = *in.Target.AverageValue
  127. }
  128. out.MetricName = in.Metric.Name
  129. out.Selector = in.Metric.Selector
  130. return nil
  131. }
  132. func Convert_v1_PodsMetricSource_To_autoscaling_PodsMetricSource(in *autoscalingv1.PodsMetricSource, out *autoscaling.PodsMetricSource, s conversion.Scope) error {
  133. metricType := autoscaling.AverageValueMetricType
  134. out.Target = autoscaling.MetricTarget{
  135. Type: metricType,
  136. AverageValue: &in.TargetAverageValue,
  137. }
  138. out.Metric = autoscaling.MetricIdentifier{
  139. Name: in.MetricName,
  140. Selector: in.Selector,
  141. }
  142. return nil
  143. }
  144. func Convert_autoscaling_ExternalMetricStatus_To_v1_ExternalMetricStatus(in *autoscaling.ExternalMetricStatus, out *autoscalingv1.ExternalMetricStatus, s conversion.Scope) error {
  145. out.MetricName = in.Metric.Name
  146. if in.Current.Value != nil {
  147. out.CurrentValue = *in.Current.Value
  148. }
  149. if in.Current.AverageValue != nil {
  150. out.CurrentAverageValue = in.Current.AverageValue
  151. }
  152. out.MetricSelector = in.Metric.Selector
  153. return nil
  154. }
  155. func Convert_v1_ExternalMetricStatus_To_autoscaling_ExternalMetricStatus(in *autoscalingv1.ExternalMetricStatus, out *autoscaling.ExternalMetricStatus, s conversion.Scope) error {
  156. value := in.CurrentValue
  157. averageValue := in.CurrentAverageValue
  158. out.Current = autoscaling.MetricValueStatus{
  159. Value: &value,
  160. AverageValue: averageValue,
  161. }
  162. out.Metric = autoscaling.MetricIdentifier{
  163. Name: in.MetricName,
  164. Selector: in.MetricSelector,
  165. }
  166. return nil
  167. }
  168. func Convert_autoscaling_ObjectMetricStatus_To_v1_ObjectMetricStatus(in *autoscaling.ObjectMetricStatus, out *autoscalingv1.ObjectMetricStatus, s conversion.Scope) error {
  169. if in.Current.Value != nil {
  170. out.CurrentValue = *in.Current.Value
  171. }
  172. if in.Current.AverageValue != nil {
  173. currentAverageValue := *in.Current.AverageValue
  174. out.AverageValue = &currentAverageValue
  175. }
  176. out.Target = autoscalingv1.CrossVersionObjectReference{
  177. Kind: in.DescribedObject.Kind,
  178. Name: in.DescribedObject.Name,
  179. APIVersion: in.DescribedObject.APIVersion,
  180. }
  181. out.MetricName = in.Metric.Name
  182. out.Selector = in.Metric.Selector
  183. return nil
  184. }
  185. func Convert_v1_ObjectMetricStatus_To_autoscaling_ObjectMetricStatus(in *autoscalingv1.ObjectMetricStatus, out *autoscaling.ObjectMetricStatus, s conversion.Scope) error {
  186. out.Current = autoscaling.MetricValueStatus{
  187. Value: &in.CurrentValue,
  188. AverageValue: in.AverageValue,
  189. }
  190. out.DescribedObject = autoscaling.CrossVersionObjectReference{
  191. Kind: in.Target.Kind,
  192. Name: in.Target.Name,
  193. APIVersion: in.Target.APIVersion,
  194. }
  195. out.Metric = autoscaling.MetricIdentifier{
  196. Name: in.MetricName,
  197. Selector: in.Selector,
  198. }
  199. return nil
  200. }
  201. func Convert_autoscaling_PodsMetricStatus_To_v1_PodsMetricStatus(in *autoscaling.PodsMetricStatus, out *autoscalingv1.PodsMetricStatus, s conversion.Scope) error {
  202. if in.Current.AverageValue != nil {
  203. out.CurrentAverageValue = *in.Current.AverageValue
  204. }
  205. out.MetricName = in.Metric.Name
  206. out.Selector = in.Metric.Selector
  207. return nil
  208. }
  209. func Convert_v1_PodsMetricStatus_To_autoscaling_PodsMetricStatus(in *autoscalingv1.PodsMetricStatus, out *autoscaling.PodsMetricStatus, s conversion.Scope) error {
  210. out.Current = autoscaling.MetricValueStatus{
  211. AverageValue: &in.CurrentAverageValue,
  212. }
  213. out.Metric = autoscaling.MetricIdentifier{
  214. Name: in.MetricName,
  215. Selector: in.Selector,
  216. }
  217. return nil
  218. }
  219. func Convert_v1_ResourceMetricSource_To_autoscaling_ResourceMetricSource(in *autoscalingv1.ResourceMetricSource, out *autoscaling.ResourceMetricSource, s conversion.Scope) error {
  220. out.Name = core.ResourceName(in.Name)
  221. utilization := in.TargetAverageUtilization
  222. averageValue := in.TargetAverageValue
  223. var metricType autoscaling.MetricTargetType
  224. if utilization == nil {
  225. metricType = autoscaling.AverageValueMetricType
  226. } else {
  227. metricType = autoscaling.UtilizationMetricType
  228. }
  229. out.Target = autoscaling.MetricTarget{
  230. Type: metricType,
  231. AverageValue: averageValue,
  232. AverageUtilization: utilization,
  233. }
  234. return nil
  235. }
  236. func Convert_autoscaling_ResourceMetricSource_To_v1_ResourceMetricSource(in *autoscaling.ResourceMetricSource, out *autoscalingv1.ResourceMetricSource, s conversion.Scope) error {
  237. out.Name = v1.ResourceName(in.Name)
  238. out.TargetAverageUtilization = in.Target.AverageUtilization
  239. out.TargetAverageValue = in.Target.AverageValue
  240. return nil
  241. }
  242. func Convert_v1_ResourceMetricStatus_To_autoscaling_ResourceMetricStatus(in *autoscalingv1.ResourceMetricStatus, out *autoscaling.ResourceMetricStatus, s conversion.Scope) error {
  243. out.Name = core.ResourceName(in.Name)
  244. utilization := in.CurrentAverageUtilization
  245. averageValue := &in.CurrentAverageValue
  246. out.Current = autoscaling.MetricValueStatus{
  247. AverageValue: averageValue,
  248. AverageUtilization: utilization,
  249. }
  250. return nil
  251. }
  252. func Convert_autoscaling_ResourceMetricStatus_To_v1_ResourceMetricStatus(in *autoscaling.ResourceMetricStatus, out *autoscalingv1.ResourceMetricStatus, s conversion.Scope) error {
  253. out.Name = v1.ResourceName(in.Name)
  254. out.CurrentAverageUtilization = in.Current.AverageUtilization
  255. if in.Current.AverageValue != nil {
  256. out.CurrentAverageValue = *in.Current.AverageValue
  257. }
  258. return nil
  259. }
  260. func Convert_autoscaling_HorizontalPodAutoscaler_To_v1_HorizontalPodAutoscaler(in *autoscaling.HorizontalPodAutoscaler, out *autoscalingv1.HorizontalPodAutoscaler, s conversion.Scope) error {
  261. if err := autoConvert_autoscaling_HorizontalPodAutoscaler_To_v1_HorizontalPodAutoscaler(in, out, s); err != nil {
  262. return err
  263. }
  264. otherMetrics := make([]autoscalingv1.MetricSpec, 0, len(in.Spec.Metrics))
  265. for _, metric := range in.Spec.Metrics {
  266. if metric.Type == autoscaling.ResourceMetricSourceType && metric.Resource != nil && metric.Resource.Name == core.ResourceCPU && metric.Resource.Target.AverageUtilization != nil {
  267. continue
  268. }
  269. convMetric := autoscalingv1.MetricSpec{}
  270. if err := Convert_autoscaling_MetricSpec_To_v1_MetricSpec(&metric, &convMetric, s); err != nil {
  271. return err
  272. }
  273. otherMetrics = append(otherMetrics, convMetric)
  274. }
  275. // NB: we need to save the status even if it maps to a CPU utilization status in order to save the raw value as well
  276. currentMetrics := make([]autoscalingv1.MetricStatus, len(in.Status.CurrentMetrics))
  277. for i, currentMetric := range in.Status.CurrentMetrics {
  278. if err := Convert_autoscaling_MetricStatus_To_v1_MetricStatus(&currentMetric, &currentMetrics[i], s); err != nil {
  279. return err
  280. }
  281. }
  282. // store HPA conditions in an annotation
  283. currentConditions := make([]autoscalingv1.HorizontalPodAutoscalerCondition, len(in.Status.Conditions))
  284. for i, currentCondition := range in.Status.Conditions {
  285. if err := Convert_autoscaling_HorizontalPodAutoscalerCondition_To_v1_HorizontalPodAutoscalerCondition(&currentCondition, &currentConditions[i], s); err != nil {
  286. return err
  287. }
  288. }
  289. if len(otherMetrics) > 0 || len(in.Status.CurrentMetrics) > 0 || len(currentConditions) > 0 {
  290. old := out.Annotations
  291. out.Annotations = make(map[string]string, len(old)+3)
  292. for k, v := range old {
  293. out.Annotations[k] = v
  294. }
  295. }
  296. if len(otherMetrics) > 0 {
  297. otherMetricsEnc, err := json.Marshal(otherMetrics)
  298. if err != nil {
  299. return err
  300. }
  301. out.Annotations[autoscaling.MetricSpecsAnnotation] = string(otherMetricsEnc)
  302. }
  303. if len(in.Status.CurrentMetrics) > 0 {
  304. currentMetricsEnc, err := json.Marshal(currentMetrics)
  305. if err != nil {
  306. return err
  307. }
  308. out.Annotations[autoscaling.MetricStatusesAnnotation] = string(currentMetricsEnc)
  309. }
  310. if len(in.Status.Conditions) > 0 {
  311. currentConditionsEnc, err := json.Marshal(currentConditions)
  312. if err != nil {
  313. return err
  314. }
  315. out.Annotations[autoscaling.HorizontalPodAutoscalerConditionsAnnotation] = string(currentConditionsEnc)
  316. }
  317. return nil
  318. }
  319. func Convert_v1_HorizontalPodAutoscaler_To_autoscaling_HorizontalPodAutoscaler(in *autoscalingv1.HorizontalPodAutoscaler, out *autoscaling.HorizontalPodAutoscaler, s conversion.Scope) error {
  320. if err := autoConvert_v1_HorizontalPodAutoscaler_To_autoscaling_HorizontalPodAutoscaler(in, out, s); err != nil {
  321. return err
  322. }
  323. if otherMetricsEnc, hasOtherMetrics := out.Annotations[autoscaling.MetricSpecsAnnotation]; hasOtherMetrics {
  324. var otherMetrics []autoscalingv1.MetricSpec
  325. if err := json.Unmarshal([]byte(otherMetricsEnc), &otherMetrics); err != nil {
  326. return err
  327. }
  328. // the normal Spec conversion could have populated out.Spec.Metrics with a single element, so deal with that
  329. outMetrics := make([]autoscaling.MetricSpec, len(otherMetrics)+len(out.Spec.Metrics))
  330. for i, metric := range otherMetrics {
  331. if err := Convert_v1_MetricSpec_To_autoscaling_MetricSpec(&metric, &outMetrics[i], s); err != nil {
  332. return err
  333. }
  334. }
  335. if out.Spec.Metrics != nil {
  336. outMetrics[len(otherMetrics)] = out.Spec.Metrics[0]
  337. }
  338. out.Spec.Metrics = outMetrics
  339. delete(out.Annotations, autoscaling.MetricSpecsAnnotation)
  340. }
  341. if currentMetricsEnc, hasCurrentMetrics := out.Annotations[autoscaling.MetricStatusesAnnotation]; hasCurrentMetrics {
  342. // ignore any existing status values -- the ones here have more information
  343. var currentMetrics []autoscalingv1.MetricStatus
  344. if err := json.Unmarshal([]byte(currentMetricsEnc), &currentMetrics); err != nil {
  345. return err
  346. }
  347. out.Status.CurrentMetrics = make([]autoscaling.MetricStatus, len(currentMetrics))
  348. for i, currentMetric := range currentMetrics {
  349. if err := Convert_v1_MetricStatus_To_autoscaling_MetricStatus(&currentMetric, &out.Status.CurrentMetrics[i], s); err != nil {
  350. return err
  351. }
  352. }
  353. delete(out.Annotations, autoscaling.MetricStatusesAnnotation)
  354. }
  355. // autoscaling/v1 formerly had an implicit default applied in the controller. In v2beta1, we apply it explicitly.
  356. // We apply it here, explicitly, since we have access to the full set of metrics from the annotation.
  357. if len(out.Spec.Metrics) == 0 {
  358. // no other metrics, no explicit CPU value set
  359. out.Spec.Metrics = []autoscaling.MetricSpec{
  360. {
  361. Type: autoscaling.ResourceMetricSourceType,
  362. Resource: &autoscaling.ResourceMetricSource{
  363. Name: core.ResourceCPU,
  364. Target: autoscaling.MetricTarget{
  365. Type: autoscaling.UtilizationMetricType,
  366. },
  367. },
  368. },
  369. }
  370. out.Spec.Metrics[0].Resource.Target.AverageUtilization = new(int32)
  371. *out.Spec.Metrics[0].Resource.Target.AverageUtilization = autoscaling.DefaultCPUUtilization
  372. }
  373. if currentConditionsEnc, hasCurrentConditions := out.Annotations[autoscaling.HorizontalPodAutoscalerConditionsAnnotation]; hasCurrentConditions {
  374. var currentConditions []autoscalingv1.HorizontalPodAutoscalerCondition
  375. if err := json.Unmarshal([]byte(currentConditionsEnc), &currentConditions); err != nil {
  376. return err
  377. }
  378. out.Status.Conditions = make([]autoscaling.HorizontalPodAutoscalerCondition, len(currentConditions))
  379. for i, currentCondition := range currentConditions {
  380. if err := Convert_v1_HorizontalPodAutoscalerCondition_To_autoscaling_HorizontalPodAutoscalerCondition(&currentCondition, &out.Status.Conditions[i], s); err != nil {
  381. return err
  382. }
  383. }
  384. delete(out.Annotations, autoscaling.HorizontalPodAutoscalerConditionsAnnotation)
  385. }
  386. return nil
  387. }
  388. func Convert_autoscaling_HorizontalPodAutoscalerSpec_To_v1_HorizontalPodAutoscalerSpec(in *autoscaling.HorizontalPodAutoscalerSpec, out *autoscalingv1.HorizontalPodAutoscalerSpec, s conversion.Scope) error {
  389. if err := Convert_autoscaling_CrossVersionObjectReference_To_v1_CrossVersionObjectReference(&in.ScaleTargetRef, &out.ScaleTargetRef, s); err != nil {
  390. return err
  391. }
  392. out.MinReplicas = in.MinReplicas
  393. out.MaxReplicas = in.MaxReplicas
  394. for _, metric := range in.Metrics {
  395. if metric.Type == autoscaling.ResourceMetricSourceType && metric.Resource != nil && metric.Resource.Name == core.ResourceCPU {
  396. if metric.Resource.Target.AverageUtilization != nil {
  397. out.TargetCPUUtilizationPercentage = new(int32)
  398. *out.TargetCPUUtilizationPercentage = *metric.Resource.Target.AverageUtilization
  399. }
  400. break
  401. }
  402. }
  403. return nil
  404. }
  405. func Convert_v1_HorizontalPodAutoscalerSpec_To_autoscaling_HorizontalPodAutoscalerSpec(in *autoscalingv1.HorizontalPodAutoscalerSpec, out *autoscaling.HorizontalPodAutoscalerSpec, s conversion.Scope) error {
  406. if err := Convert_v1_CrossVersionObjectReference_To_autoscaling_CrossVersionObjectReference(&in.ScaleTargetRef, &out.ScaleTargetRef, s); err != nil {
  407. return err
  408. }
  409. out.MinReplicas = in.MinReplicas
  410. out.MaxReplicas = in.MaxReplicas
  411. if in.TargetCPUUtilizationPercentage != nil {
  412. out.Metrics = []autoscaling.MetricSpec{
  413. {
  414. Type: autoscaling.ResourceMetricSourceType,
  415. Resource: &autoscaling.ResourceMetricSource{
  416. Name: core.ResourceCPU,
  417. Target: autoscaling.MetricTarget{
  418. Type: autoscaling.UtilizationMetricType,
  419. },
  420. },
  421. },
  422. }
  423. out.Metrics[0].Resource.Target.AverageUtilization = new(int32)
  424. *out.Metrics[0].Resource.Target.AverageUtilization = *in.TargetCPUUtilizationPercentage
  425. }
  426. return nil
  427. }
  428. func Convert_autoscaling_HorizontalPodAutoscalerStatus_To_v1_HorizontalPodAutoscalerStatus(in *autoscaling.HorizontalPodAutoscalerStatus, out *autoscalingv1.HorizontalPodAutoscalerStatus, s conversion.Scope) error {
  429. out.ObservedGeneration = in.ObservedGeneration
  430. out.LastScaleTime = in.LastScaleTime
  431. out.CurrentReplicas = in.CurrentReplicas
  432. out.DesiredReplicas = in.DesiredReplicas
  433. for _, metric := range in.CurrentMetrics {
  434. if metric.Type == autoscaling.ResourceMetricSourceType && metric.Resource != nil && metric.Resource.Name == core.ResourceCPU {
  435. if metric.Resource.Current.AverageUtilization != nil {
  436. out.CurrentCPUUtilizationPercentage = new(int32)
  437. *out.CurrentCPUUtilizationPercentage = *metric.Resource.Current.AverageUtilization
  438. }
  439. }
  440. }
  441. return nil
  442. }
  443. func Convert_v1_HorizontalPodAutoscalerStatus_To_autoscaling_HorizontalPodAutoscalerStatus(in *autoscalingv1.HorizontalPodAutoscalerStatus, out *autoscaling.HorizontalPodAutoscalerStatus, s conversion.Scope) error {
  444. out.ObservedGeneration = in.ObservedGeneration
  445. out.LastScaleTime = in.LastScaleTime
  446. out.CurrentReplicas = in.CurrentReplicas
  447. out.DesiredReplicas = in.DesiredReplicas
  448. if in.CurrentCPUUtilizationPercentage != nil {
  449. out.CurrentMetrics = []autoscaling.MetricStatus{
  450. {
  451. Type: autoscaling.ResourceMetricSourceType,
  452. Resource: &autoscaling.ResourceMetricStatus{
  453. Name: core.ResourceCPU,
  454. },
  455. },
  456. }
  457. out.CurrentMetrics[0].Resource.Current.AverageUtilization = new(int32)
  458. *out.CurrentMetrics[0].Resource.Current.AverageUtilization = *in.CurrentCPUUtilizationPercentage
  459. }
  460. return nil
  461. }