karmada/pkg/apis/cluster/mutation/mutation.go

204 lines
5.5 KiB
Go

package mutation
import (
"math"
"sort"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
clusterapis "github.com/karmada-io/karmada/pkg/apis/cluster"
)
const (
// GB is a conversion value from GB to Bytes.
GB = 1024 * 1024 * 1024
)
// MutateCluster mutates required fields of the Cluster.
func MutateCluster(cluster *clusterapis.Cluster) {
mutateClusterTaints(cluster.Spec.Taints)
migrateZoneToZones(cluster)
}
// migrateZoneToZones add zones field for cluster if Zones not set but Zone set only.
func migrateZoneToZones(cluster *clusterapis.Cluster) {
if cluster.Spec.Zone != "" && len(cluster.Spec.Zones) == 0 {
cluster.Spec.Zones = append(cluster.Spec.Zones, cluster.Spec.Zone)
cluster.Spec.Zone = ""
}
}
// mutateClusterTaints add TimeAdded field for cluster NoExecute taints only if TimeAdded not set.
func mutateClusterTaints(taints []corev1.Taint) {
for i := range taints {
if taints[i].Effect == corev1.TaintEffectNoExecute && taints[i].TimeAdded == nil {
now := metav1.Now()
taints[i].TimeAdded = &now
}
}
}
// StandardizeClusterResourceModels set cluster resource models for given order and boundary value.
func StandardizeClusterResourceModels(models []clusterapis.ResourceModel) {
if len(models) == 0 {
return
}
sort.Slice(models, func(i, j int) bool {
return models[i].Grade < models[j].Grade
})
// The Min value of the first grade(usually 0) always acts as zero.
for index := range models[0].Ranges {
models[0].Ranges[index].Min.Set(0)
}
// The Max value of the last grade always acts as MaxInt64.
for index := range models[len(models)-1].Ranges {
models[len(models)-1].Ranges[index].Max.Set(math.MaxInt64)
}
}
// SetDefaultClusterResourceModels set default cluster resource models for cluster.
func SetDefaultClusterResourceModels(cluster *clusterapis.Cluster) {
cluster.Spec.ResourceModels = []clusterapis.ResourceModel{
{
Grade: 0,
Ranges: []clusterapis.ResourceModelRange{
{
Name: clusterapis.ResourceCPU,
Min: *resource.NewQuantity(0, resource.DecimalSI),
Max: *resource.NewQuantity(1, resource.DecimalSI),
},
{
Name: clusterapis.ResourceMemory,
Min: *resource.NewQuantity(0, resource.BinarySI),
Max: *resource.NewQuantity(4*GB, resource.BinarySI),
},
},
},
{
Grade: 1,
Ranges: []clusterapis.ResourceModelRange{
{
Name: clusterapis.ResourceCPU,
Min: *resource.NewQuantity(1, resource.DecimalSI),
Max: *resource.NewQuantity(2, resource.DecimalSI),
},
{
Name: clusterapis.ResourceMemory,
Min: *resource.NewQuantity(4*GB, resource.BinarySI),
Max: *resource.NewQuantity(16*GB, resource.BinarySI),
},
},
},
{
Grade: 2,
Ranges: []clusterapis.ResourceModelRange{
{
Name: clusterapis.ResourceCPU,
Min: *resource.NewQuantity(2, resource.DecimalSI),
Max: *resource.NewQuantity(4, resource.DecimalSI),
},
{
Name: clusterapis.ResourceMemory,
Min: *resource.NewQuantity(16*GB, resource.BinarySI),
Max: *resource.NewQuantity(32*GB, resource.BinarySI),
},
},
},
{
Grade: 3,
Ranges: []clusterapis.ResourceModelRange{
{
Name: clusterapis.ResourceCPU,
Min: *resource.NewQuantity(4, resource.DecimalSI),
Max: *resource.NewQuantity(8, resource.DecimalSI),
},
{
Name: clusterapis.ResourceMemory,
Min: *resource.NewQuantity(32*GB, resource.BinarySI),
Max: *resource.NewQuantity(64*GB, resource.BinarySI),
},
},
},
{
Grade: 4,
Ranges: []clusterapis.ResourceModelRange{
{
Name: clusterapis.ResourceCPU,
Min: *resource.NewQuantity(8, resource.DecimalSI),
Max: *resource.NewQuantity(16, resource.DecimalSI),
},
{
Name: clusterapis.ResourceMemory,
Min: *resource.NewQuantity(64*GB, resource.BinarySI),
Max: *resource.NewQuantity(128*GB, resource.BinarySI),
},
},
},
{
Grade: 5,
Ranges: []clusterapis.ResourceModelRange{
{
Name: clusterapis.ResourceCPU,
Min: *resource.NewQuantity(16, resource.DecimalSI),
Max: *resource.NewQuantity(32, resource.DecimalSI),
},
{
Name: clusterapis.ResourceMemory,
Min: *resource.NewQuantity(128*GB, resource.BinarySI),
Max: *resource.NewQuantity(256*GB, resource.BinarySI),
},
},
},
{
Grade: 6,
Ranges: []clusterapis.ResourceModelRange{
{
Name: clusterapis.ResourceCPU,
Min: *resource.NewQuantity(32, resource.DecimalSI),
Max: *resource.NewQuantity(64, resource.DecimalSI),
},
{
Name: clusterapis.ResourceMemory,
Min: *resource.NewQuantity(256*GB, resource.BinarySI),
Max: *resource.NewQuantity(512*GB, resource.BinarySI),
},
},
},
{
Grade: 7,
Ranges: []clusterapis.ResourceModelRange{
{
Name: clusterapis.ResourceCPU,
Min: *resource.NewQuantity(64, resource.DecimalSI),
Max: *resource.NewQuantity(128, resource.DecimalSI),
},
{
Name: clusterapis.ResourceMemory,
Min: *resource.NewQuantity(512*GB, resource.BinarySI),
Max: *resource.NewQuantity(1024*GB, resource.BinarySI),
},
},
},
{
Grade: 8,
Ranges: []clusterapis.ResourceModelRange{
{
Name: clusterapis.ResourceCPU,
Min: *resource.NewQuantity(128, resource.DecimalSI),
Max: *resource.NewQuantity(math.MaxInt64, resource.DecimalSI),
},
{
Name: clusterapis.ResourceMemory,
Min: *resource.NewQuantity(1024*GB, resource.BinarySI),
Max: *resource.NewQuantity(math.MaxInt64, resource.BinarySI),
},
},
},
}
}