github.com/gocrane/crane@v0.11.0/pkg/utils/scale.go (about) 1 package utils 2 3 import ( 4 "context" 5 "fmt" 6 7 v1 "k8s.io/api/core/v1" 8 "k8s.io/apimachinery/pkg/labels" 9 "sigs.k8s.io/controller-runtime/pkg/client" 10 11 autoscalingapiv1 "k8s.io/api/autoscaling/v1" 12 autoscalingv2 "k8s.io/api/autoscaling/v2beta2" 13 "k8s.io/apimachinery/pkg/api/meta" 14 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 15 "k8s.io/apimachinery/pkg/runtime/schema" 16 "k8s.io/client-go/scale" 17 ) 18 19 func GetScale(ctx context.Context, restMapper meta.RESTMapper, scaleClient scale.ScalesGetter, namespace string, ref autoscalingv2.CrossVersionObjectReference) (*autoscalingapiv1.Scale, *meta.RESTMapping, error) { 20 targetGV, err := schema.ParseGroupVersion(ref.APIVersion) 21 if err != nil { 22 return nil, nil, err 23 } 24 25 targetGK := schema.GroupKind{ 26 Group: targetGV.Group, 27 Kind: ref.Kind, 28 } 29 30 mappings, err := restMapper.RESTMappings(targetGK) 31 if err != nil { 32 return nil, nil, err 33 } 34 35 var errs []error 36 for _, mapping := range mappings { 37 scale, err := scaleClient.Scales(namespace).Get(ctx, mapping.Resource.GroupResource(), ref.Name, metav1.GetOptions{}) 38 if err == nil { 39 return scale, mapping, nil 40 } 41 errs = append(errs, err) 42 } 43 44 return nil, nil, fmt.Errorf("unrecognized resource: %+v", errs) 45 } 46 47 func GetScaleFromObjectReference(ctx context.Context, restMapper meta.RESTMapper, scaleClient scale.ScalesGetter, ref v1.ObjectReference) (*autoscalingapiv1.Scale, *meta.RESTMapping, error) { 48 newRef := autoscalingv2.CrossVersionObjectReference{ 49 APIVersion: ref.APIVersion, 50 Kind: ref.Kind, 51 Name: ref.Name, 52 } 53 return GetScale(ctx, restMapper, scaleClient, ref.Namespace, newRef) 54 } 55 56 func GetPodsFromScale(kubeClient client.Client, scale *autoscalingapiv1.Scale) ([]v1.Pod, error) { 57 selector, err := labels.ConvertSelectorToLabelsMap(scale.Status.Selector) 58 if err != nil { 59 return nil, err 60 } 61 62 opts := []client.ListOption{ 63 client.InNamespace(scale.GetNamespace()), 64 client.MatchingLabels(selector), 65 } 66 67 podList := &v1.PodList{} 68 err = kubeClient.List(context.TODO(), podList, opts...) 69 if err != nil { 70 return nil, err 71 } 72 73 return podList.Items, nil 74 }