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  }