conversion.go 18 KB

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