cost-optimization/gke-shift-left-cost/api/builder_hpa.go (103 lines of code) (raw):
// Copyright 2021 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package api
import (
"fmt"
v1 "k8s.io/api/autoscaling/v1"
"k8s.io/api/autoscaling/v2beta1"
"k8s.io/api/autoscaling/v2beta2"
)
//decodeHPA reads k8s HorizontalPodAutoScaler yaml and trasform to HPA object - mostly used by tests
func decodeHPA(data []byte) (HPA, error) {
obj, groupVersionKind, err := decode(data)
if err != nil {
return HPA{}, fmt.Errorf("Error Decoding. Check if your GroupVersionKind is defined in api/k8s_decoder.go. Root cause %+v", err)
}
return buildHPA(obj, groupVersionKind)
}
//buildHPA reads k8s HorizontalPodAutoScaler object and trasform to HPA object
func buildHPA(obj interface{}, groupVersionKind GroupVersionKind) (HPA, error) {
switch obj.(type) {
case *v2beta2.HorizontalPodAutoscaler:
return buildHPAV2beta2(obj.(*v2beta2.HorizontalPodAutoscaler)), nil
case *v2beta1.HorizontalPodAutoscaler:
return buildHPAV2beta1(obj.(*v2beta1.HorizontalPodAutoscaler)), nil
case *v1.HorizontalPodAutoscaler:
return buildHPAV1(obj.(*v1.HorizontalPodAutoscaler)), nil
default:
return HPA{}, fmt.Errorf("APIVersion and Kind not Implemented: %+v", groupVersionKind)
}
}
func buildHPAV2beta2(hpa *v2beta2.HorizontalPodAutoscaler) HPA {
targetCPUPercentage := int32(0)
netrics := hpa.Spec.Metrics
for i := 0; i < len(netrics); i++ {
metric := netrics[i]
if metric.Type == v2beta2.ResourceMetricSourceType {
res := metric.Resource
target := res.Target
if res.Name == "cpu" && target.AverageUtilization != (*int32)(nil) {
targetCPUPercentage = *target.AverageUtilization
}
}
}
var minReplicas int32 = 1
if hpa.Spec.MinReplicas != (*int32)(nil) {
minReplicas = *hpa.Spec.MinReplicas
}
namespace := "default"
if hpa.GetNamespace() != "" {
namespace = hpa.GetNamespace()
}
targetRef := hpa.Spec.ScaleTargetRef
return HPA{
APIVersionKindName: fmt.Sprintf("%s|%s|%s|%s", hpa.APIVersion, hpa.Kind, namespace, hpa.GetName()),
TargetRef: fmt.Sprintf("%s|%s|%s|%s", targetRef.APIVersion, targetRef.Kind, namespace, targetRef.Name),
MinReplicas: minReplicas,
MaxReplicas: hpa.Spec.MaxReplicas,
TargetCPUPercentage: targetCPUPercentage,
}
}
func buildHPAV2beta1(hpa *v2beta1.HorizontalPodAutoscaler) HPA {
targetCPUPercentage := int32(0)
netrics := hpa.Spec.Metrics
for i := 0; i < len(netrics); i++ {
metric := netrics[i]
if metric.Type == v2beta1.ResourceMetricSourceType {
res := metric.Resource
if res.Name == "cpu" && res.TargetAverageUtilization != (*int32)(nil) {
targetCPUPercentage = *res.TargetAverageUtilization
}
}
}
var minReplicas int32 = 1
if hpa.Spec.MinReplicas != (*int32)(nil) {
minReplicas = *hpa.Spec.MinReplicas
}
namespace := "default"
if hpa.GetNamespace() != "" {
namespace = hpa.GetNamespace()
}
targetRef := hpa.Spec.ScaleTargetRef
return HPA{
APIVersionKindName: fmt.Sprintf("%s|%s|%s|%s", hpa.APIVersion, hpa.Kind, namespace, hpa.GetName()),
TargetRef: fmt.Sprintf("%s|%s|%s|%s", targetRef.APIVersion, targetRef.Kind, namespace, targetRef.Name),
MinReplicas: minReplicas,
MaxReplicas: hpa.Spec.MaxReplicas,
TargetCPUPercentage: targetCPUPercentage,
}
}
func buildHPAV1(hpa *v1.HorizontalPodAutoscaler) HPA {
var targetCPUPercentage int32 = 0
if hpa.Spec.TargetCPUUtilizationPercentage != (*int32)(nil) {
targetCPUPercentage = *hpa.Spec.TargetCPUUtilizationPercentage
}
var minReplicas int32 = 1
if hpa.Spec.MinReplicas != (*int32)(nil) {
minReplicas = *hpa.Spec.MinReplicas
}
targetRef := hpa.Spec.ScaleTargetRef
return HPA{
APIVersionKindName: buildAPIVersionKindName(hpa.APIVersion, hpa.Kind, hpa.GetNamespace(), hpa.GetName()),
TargetRef: buildAPIVersionKindName(targetRef.APIVersion, targetRef.Kind, hpa.GetNamespace(), targetRef.Name),
MinReplicas: minReplicas,
MaxReplicas: hpa.Spec.MaxReplicas,
TargetCPUPercentage: targetCPUPercentage,
}
}