
DONE: 1. refactor all predicates: predicates return fitOrNot(bool) and error(Error) in which the latter is of type PredicateFailureError or InsufficientResourceError. (For violation of either MaxEBSVolumeCount or MaxGCEPDVolumeCount, returns one same error type as ErrMaxVolumeCountExceeded) 2. GeneralPredicates() is a predicate function, which includes serveral other predicate functions (PodFitsResource, PodFitsHost, PodFitsHostPort). It is registered as one of the predicates in DefaultAlgorithmProvider, and is also called in canAdmitPod() in Kubelet and should be called by other components (like rescheduler, etc) if necessary. See discussion in issue #12744 3. remove podNumber check from GeneralPredicates 4. HostName is now verified in Kubelet's canAdminPod(). add TestHostNameConflicts in kubelet_test.go 5. add getNodeAnyWay() method in Kubelet to get node information in standaloneMode TODO: 1. determine which predicates should be included in GeneralPredicates() 2. separate GeneralPredicates() into: a. GeneralPredicatesEvictPod() and b. GeneralPredicatesNotEvictPod() 3. DaemonSet should use GeneralPredicates()
78 lines
2.8 KiB
Go
78 lines
2.8 KiB
Go
/*
|
|
Copyright 2016 The Kubernetes Authors All rights reserved.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
package predicates
|
|
|
|
import "fmt"
|
|
|
|
const (
|
|
podCountResourceName string = "PodCount"
|
|
cpuResourceName string = "CPU"
|
|
memoryResoureceName string = "Memory"
|
|
)
|
|
|
|
var (
|
|
// The predicateName tries to be consistent as the predicate name used in DefaultAlgorithmProvider defined in
|
|
// defaults.go (which tend to be stable for backward compatibility)
|
|
ErrDiskConflict = newPredicateFailureError("NoDiskConflict")
|
|
ErrVolumeZoneConflict = newPredicateFailureError("NoVolumeZoneConflict")
|
|
ErrNodeSelectorNotMatch = newPredicateFailureError("MatchNodeSelector")
|
|
ErrPodNotMatchHostName = newPredicateFailureError("HostName")
|
|
ErrPodNotFitsHostPorts = newPredicateFailureError("PodFitsHostPorts")
|
|
ErrNodeLabelPresenceViolated = newPredicateFailureError("CheckNodeLabelPresence")
|
|
ErrServiceAffinityViolated = newPredicateFailureError("CheckServiceAffinity")
|
|
ErrMaxVolumeCountExceeded = newPredicateFailureError("MaxVolumeCount")
|
|
// ErrFakePredicateError is used for test only. The fake predicates returning false also returns error
|
|
// as ErrFakePredicateError.
|
|
ErrFakePredicateError = newPredicateFailureError("false")
|
|
)
|
|
|
|
// InsufficientResourceError is an error type that indicates what kind of resource limit is
|
|
// hit and caused the unfitting failure.
|
|
type InsufficientResourceError struct {
|
|
// resourceName is the name of the resource that is insufficient
|
|
ResourceName string
|
|
requested int64
|
|
used int64
|
|
capacity int64
|
|
}
|
|
|
|
func newInsufficientResourceError(resourceName string, requested, used, capacity int64) *InsufficientResourceError {
|
|
return &InsufficientResourceError{
|
|
ResourceName: resourceName,
|
|
requested: requested,
|
|
used: used,
|
|
capacity: capacity,
|
|
}
|
|
}
|
|
|
|
func (e *InsufficientResourceError) Error() string {
|
|
return fmt.Sprintf("Node didn't have enough resource: %s, requested: %d, used: %d, capacity: %d",
|
|
e.ResourceName, e.requested, e.used, e.capacity)
|
|
}
|
|
|
|
type PredicateFailureError struct {
|
|
PredicateName string
|
|
}
|
|
|
|
func newPredicateFailureError(predicateName string) *PredicateFailureError {
|
|
return &PredicateFailureError{predicateName}
|
|
}
|
|
|
|
func (e *PredicateFailureError) Error() string {
|
|
return fmt.Sprintf("Predicate %s failed", e.PredicateName)
|
|
}
|