func()

in custom-metrics-stackdriver-adapter/pkg/adapter/provider/provider.go [139:179]


func (p *StackdriverProvider) getRootScopedMetricBySelector(groupResource schema.GroupResource, selector labels.Selector, escapedMetricName string, metricSelector labels.Selector) (*custom_metrics.MetricValueList, error) {
	if !p.useNewResourceModel {
		return nil, NewOperationNotSupportedError("Get root scoped metric by selector")
	}
	if groupResource.Resource != nodeResource {
		return nil, NewOperationNotSupportedError(fmt.Sprintf("Get root scoped metric by selector for resource %q", groupResource.Resource))
	}
	matchingNodes, err := p.kubeClient.Nodes().List(context.Background(), metav1.ListOptions{LabelSelector: selector.String()})
	if err != nil {
		return nil, err
	}
	metricName := getCustomMetricName(escapedMetricName)
	metricKind, metricValueType, err := p.translator.GetMetricKind(metricName, metricSelector)
	if err != nil {
		return nil, err
	}
	result := []custom_metrics.MetricValue{}
	for i := 0; i < len(matchingNodes.Items); i += translator.MaxNumOfArgsInOneOfFilter {
		sliceSegmentEnd := min(i+translator.MaxNumOfArgsInOneOfFilter, len(matchingNodes.Items))
		nodesSlice := &v1.NodeList{Items: matchingNodes.Items[i:sliceSegmentEnd]}
		stackdriverRequest, err := translator.NewQueryBuilder(p.translator, metricName).
			WithNodes(nodesSlice).
			WithMetricKind(metricKind).
			WithMetricValueType(metricValueType).
			WithMetricSelector(metricSelector).
			Build()
		if err != nil {
			return nil, err
		}
		stackdriverResponse, err := stackdriverRequest.Do()
		if err != nil {
			return nil, err
		}
		slice, err := p.translator.GetRespForMultipleObjects(stackdriverResponse, p.translator.GetNodeItems(matchingNodes), groupResource, escapedMetricName, metricSelector)
		if err != nil {
			return nil, err
		}
		result = append(result, slice...)
	}
	return &custom_metrics.MetricValueList{Items: result}, nil
}