mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-03 19:58:17 +00:00 
			
		
		
		
	modify extends.Filter
Signed-off-by: PingWang <wang.ping5@zte.com.cn> Add docs Signed-off-by: PingWang <wang.ping5@zte.com.cn> add docs for ExtenderFilterResult.FailedNodes in types.go Signed-off-by: PingWang <wang.ping5@zte.com.cn> Modify the extender.Filter test. Signed-off-by: PingWang <wang.ping5@zte.com.cn> Update extender_test.go Signed-off-by: PingWang <wang.ping5@zte.com.cn> modify the comments Signed-off-by: PingWang <wang.ping5@zte.com.cn> gofmt -s scheduler_interface.go Signed-off-by: PingWang <wang.ping5@zte.com.cn> update the comments Signed-off-by: PingWang <wang.ping5@zte.com.cn>
This commit is contained in:
		@@ -26,8 +26,9 @@ import (
 | 
				
			|||||||
// managed by Kubernetes.
 | 
					// managed by Kubernetes.
 | 
				
			||||||
type SchedulerExtender interface {
 | 
					type SchedulerExtender interface {
 | 
				
			||||||
	// Filter based on extender-implemented predicate functions. The filtered list is
 | 
						// Filter based on extender-implemented predicate functions. The filtered list is
 | 
				
			||||||
	// expected to be a subset of the supplied list.
 | 
						// expected to be a subset of the supplied list. failedNodesMap optionally contains
 | 
				
			||||||
	Filter(pod *api.Pod, nodes []*api.Node) (filteredNodes []*api.Node, err error)
 | 
						// the list of failed nodes and failure reasons.
 | 
				
			||||||
 | 
						Filter(pod *api.Pod, nodes []*api.Node) (filteredNodes []*api.Node, failedNodesMap schedulerapi.FailedNodesMap, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Prioritize based on extender-implemented priority functions. The returned scores & weight
 | 
						// Prioritize based on extender-implemented priority functions. The returned scores & weight
 | 
				
			||||||
	// are used to compute the weighted score for an extender. The weighted scores are added to
 | 
						// are used to compute the weighted score for an extender. The weighted scores are added to
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -139,10 +139,15 @@ type ExtenderArgs struct {
 | 
				
			|||||||
	Nodes api.NodeList `json:"nodes"`
 | 
						Nodes api.NodeList `json:"nodes"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// FailedNodesMap represents the filtered out nodes, with node names and failure messages
 | 
				
			||||||
 | 
					type FailedNodesMap map[string]string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ExtenderFilterResult represents the results of a filter call to an extender
 | 
					// ExtenderFilterResult represents the results of a filter call to an extender
 | 
				
			||||||
type ExtenderFilterResult struct {
 | 
					type ExtenderFilterResult struct {
 | 
				
			||||||
	// Filtered set of nodes where the pod can be scheduled
 | 
						// Filtered set of nodes where the pod can be scheduled
 | 
				
			||||||
	Nodes api.NodeList `json:"nodes,omitempty"`
 | 
						Nodes api.NodeList `json:"nodes,omitempty"`
 | 
				
			||||||
 | 
						// Filtered out nodes where the pod can't be scheduled and the failure messages
 | 
				
			||||||
 | 
						FailedNodes FailedNodesMap `json:"failedNodes,omitempty"`
 | 
				
			||||||
	// Error message indicating failure
 | 
						// Error message indicating failure
 | 
				
			||||||
	Error string `json:"error,omitempty"`
 | 
						Error string `json:"error,omitempty"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -139,10 +139,15 @@ type ExtenderArgs struct {
 | 
				
			|||||||
	Nodes apiv1.NodeList `json:"nodes"`
 | 
						Nodes apiv1.NodeList `json:"nodes"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// FailedNodesMap represents the filtered out nodes, with node names and failure messages
 | 
				
			||||||
 | 
					type FailedNodesMap map[string]string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ExtenderFilterResult represents the results of a filter call to an extender
 | 
					// ExtenderFilterResult represents the results of a filter call to an extender
 | 
				
			||||||
type ExtenderFilterResult struct {
 | 
					type ExtenderFilterResult struct {
 | 
				
			||||||
	// Filtered set of nodes where the pod can be scheduled
 | 
						// Filtered set of nodes where the pod can be scheduled
 | 
				
			||||||
	Nodes apiv1.NodeList `json:"nodes,omitempty"`
 | 
						Nodes apiv1.NodeList `json:"nodes,omitempty"`
 | 
				
			||||||
 | 
						// Filtered out nodes where the pod can't be scheduled and the failure messages
 | 
				
			||||||
 | 
						FailedNodes FailedNodesMap `json:"failedNodes,omitempty"`
 | 
				
			||||||
	// Error message indicating failure
 | 
						// Error message indicating failure
 | 
				
			||||||
	Error string `json:"error,omitempty"`
 | 
						Error string `json:"error,omitempty"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -92,12 +92,13 @@ func NewHTTPExtender(config *schedulerapi.ExtenderConfig, apiVersion string) (al
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Filter based on extender implemented predicate functions. The filtered list is
 | 
					// Filter based on extender implemented predicate functions. The filtered list is
 | 
				
			||||||
// expected to be a subset of the supplied list.
 | 
					// expected to be a subset of the supplied list. failedNodesMap optionally contains
 | 
				
			||||||
func (h *HTTPExtender) Filter(pod *api.Pod, nodes []*api.Node) ([]*api.Node, error) {
 | 
					// the list of failed nodes and failure reasons.
 | 
				
			||||||
 | 
					func (h *HTTPExtender) Filter(pod *api.Pod, nodes []*api.Node) ([]*api.Node, schedulerapi.FailedNodesMap, error) {
 | 
				
			||||||
	var result schedulerapi.ExtenderFilterResult
 | 
						var result schedulerapi.ExtenderFilterResult
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if h.filterVerb == "" {
 | 
						if h.filterVerb == "" {
 | 
				
			||||||
		return nodes, nil
 | 
							return nodes, schedulerapi.FailedNodesMap{}, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	nodeItems := make([]api.Node, 0, len(nodes))
 | 
						nodeItems := make([]api.Node, 0, len(nodes))
 | 
				
			||||||
@@ -110,16 +111,17 @@ func (h *HTTPExtender) Filter(pod *api.Pod, nodes []*api.Node) ([]*api.Node, err
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err := h.send(h.filterVerb, &args, &result); err != nil {
 | 
						if err := h.send(h.filterVerb, &args, &result); err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if result.Error != "" {
 | 
						if result.Error != "" {
 | 
				
			||||||
		return nil, fmt.Errorf(result.Error)
 | 
							return nil, nil, fmt.Errorf(result.Error)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	nodeResult := make([]*api.Node, 0, len(result.Nodes.Items))
 | 
						nodeResult := make([]*api.Node, 0, len(result.Nodes.Items))
 | 
				
			||||||
	for i := range result.Nodes.Items {
 | 
						for i := range result.Nodes.Items {
 | 
				
			||||||
		nodeResult = append(nodeResult, &result.Nodes.Items[i])
 | 
							nodeResult = append(nodeResult, &result.Nodes.Items[i])
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return nodeResult, nil
 | 
						return nodeResult, result.FailedNodes, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Prioritize based on extender implemented priority functions. Weight*priority is added
 | 
					// Prioritize based on extender implemented priority functions. Weight*priority is added
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -107,14 +107,15 @@ type FakeExtender struct {
 | 
				
			|||||||
	weight       int
 | 
						weight       int
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (f *FakeExtender) Filter(pod *api.Pod, nodes []*api.Node) ([]*api.Node, error) {
 | 
					func (f *FakeExtender) Filter(pod *api.Pod, nodes []*api.Node) ([]*api.Node, schedulerapi.FailedNodesMap, error) {
 | 
				
			||||||
	filtered := []*api.Node{}
 | 
						filtered := []*api.Node{}
 | 
				
			||||||
 | 
						failedNodesMap := schedulerapi.FailedNodesMap{}
 | 
				
			||||||
	for _, node := range nodes {
 | 
						for _, node := range nodes {
 | 
				
			||||||
		fits := true
 | 
							fits := true
 | 
				
			||||||
		for _, predicate := range f.predicates {
 | 
							for _, predicate := range f.predicates {
 | 
				
			||||||
			fit, err := predicate(pod, node)
 | 
								fit, err := predicate(pod, node)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return []*api.Node{}, err
 | 
									return []*api.Node{}, schedulerapi.FailedNodesMap{}, err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if !fit {
 | 
								if !fit {
 | 
				
			||||||
				fits = false
 | 
									fits = false
 | 
				
			||||||
@@ -123,9 +124,11 @@ func (f *FakeExtender) Filter(pod *api.Pod, nodes []*api.Node) ([]*api.Node, err
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		if fits {
 | 
							if fits {
 | 
				
			||||||
			filtered = append(filtered, node)
 | 
								filtered = append(filtered, node)
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								failedNodesMap[node.Name] = "FakeExtender failed"
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return filtered, nil
 | 
						return filtered, failedNodesMap, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (f *FakeExtender) Prioritize(pod *api.Pod, nodes []*api.Node) (*schedulerapi.HostPriorityList, int, error) {
 | 
					func (f *FakeExtender) Prioritize(pod *api.Pod, nodes []*api.Node) (*schedulerapi.HostPriorityList, int, error) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -183,10 +183,14 @@ func findNodesThatFit(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if len(filtered) > 0 && len(extenders) != 0 {
 | 
						if len(filtered) > 0 && len(extenders) != 0 {
 | 
				
			||||||
		for _, extender := range extenders {
 | 
							for _, extender := range extenders {
 | 
				
			||||||
			filteredList, err := extender.Filter(pod, filtered)
 | 
								filteredList, failedMap, err := extender.Filter(pod, filtered)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return []*api.Node{}, FailedPredicateMap{}, err
 | 
									return []*api.Node{}, FailedPredicateMap{}, err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								for failedNodeName, failedMsg := range failedMap {
 | 
				
			||||||
 | 
									failedPredicateMap[failedNodeName] = failedMsg
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			filtered = filteredList
 | 
								filtered = filteredList
 | 
				
			||||||
			if len(filtered) == 0 {
 | 
								if len(filtered) == 0 {
 | 
				
			||||||
				break
 | 
									break
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -79,11 +79,12 @@ func (e *Extender) serveHTTP(t *testing.T, w http.ResponseWriter, req *http.Requ
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if strings.Contains(req.URL.Path, filter) {
 | 
						if strings.Contains(req.URL.Path, filter) {
 | 
				
			||||||
		resp := &schedulerapi.ExtenderFilterResult{}
 | 
							resp := &schedulerapi.ExtenderFilterResult{}
 | 
				
			||||||
		nodes, err := e.Filter(&args.Pod, &args.Nodes)
 | 
							nodes, failedNodes, err := e.Filter(&args.Pod, &args.Nodes)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			resp.Error = err.Error()
 | 
								resp.Error = err.Error()
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			resp.Nodes = *nodes
 | 
								resp.Nodes = *nodes
 | 
				
			||||||
 | 
								resp.FailedNodes = failedNodes
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if err := encoder.Encode(resp); err != nil {
 | 
							if err := encoder.Encode(resp); err != nil {
 | 
				
			||||||
@@ -102,14 +103,15 @@ func (e *Extender) serveHTTP(t *testing.T, w http.ResponseWriter, req *http.Requ
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (e *Extender) Filter(pod *api.Pod, nodes *api.NodeList) (*api.NodeList, error) {
 | 
					func (e *Extender) Filter(pod *api.Pod, nodes *api.NodeList) (*api.NodeList, schedulerapi.FailedNodesMap, error) {
 | 
				
			||||||
	filtered := []api.Node{}
 | 
						filtered := []api.Node{}
 | 
				
			||||||
 | 
						failedNodesMap := schedulerapi.FailedNodesMap{}
 | 
				
			||||||
	for _, node := range nodes.Items {
 | 
						for _, node := range nodes.Items {
 | 
				
			||||||
		fits := true
 | 
							fits := true
 | 
				
			||||||
		for _, predicate := range e.predicates {
 | 
							for _, predicate := range e.predicates {
 | 
				
			||||||
			fit, err := predicate(pod, &node)
 | 
								fit, err := predicate(pod, &node)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return &api.NodeList{}, err
 | 
									return &api.NodeList{}, schedulerapi.FailedNodesMap{}, err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if !fit {
 | 
								if !fit {
 | 
				
			||||||
				fits = false
 | 
									fits = false
 | 
				
			||||||
@@ -118,9 +120,11 @@ func (e *Extender) Filter(pod *api.Pod, nodes *api.NodeList) (*api.NodeList, err
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		if fits {
 | 
							if fits {
 | 
				
			||||||
			filtered = append(filtered, node)
 | 
								filtered = append(filtered, node)
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								failedNodesMap[node.Name] = fmt.Sprintf("extender failed: %s", e.name)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return &api.NodeList{Items: filtered}, nil
 | 
						return &api.NodeList{Items: filtered}, failedNodesMap, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (e *Extender) Prioritize(pod *api.Pod, nodes *api.NodeList) (*schedulerapi.HostPriorityList, error) {
 | 
					func (e *Extender) Prioritize(pod *api.Pod, nodes *api.NodeList) (*schedulerapi.HostPriorityList, error) {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user