mirror of
https://github.com/ceph/ceph-csi.git
synced 2025-06-13 10:33:35 +00:00
vendor updates
This commit is contained in:
3
vendor/k8s.io/kubernetes/pkg/quota/BUILD
generated
vendored
3
vendor/k8s.io/kubernetes/pkg/quota/BUILD
generated
vendored
@ -28,8 +28,7 @@ go_library(
|
||||
go_test(
|
||||
name = "go_default_test",
|
||||
srcs = ["resources_test.go"],
|
||||
importpath = "k8s.io/kubernetes/pkg/quota",
|
||||
library = ":go_default_library",
|
||||
embed = [":go_default_library"],
|
||||
deps = [
|
||||
"//pkg/apis/core:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
||||
|
9
vendor/k8s.io/kubernetes/pkg/quota/OWNERS
generated
vendored
9
vendor/k8s.io/kubernetes/pkg/quota/OWNERS
generated
vendored
@ -1,8 +1,9 @@
|
||||
approvers:
|
||||
- derekwaynecarr
|
||||
- vishh
|
||||
reviewers:
|
||||
- smarterclayton
|
||||
- deads2k
|
||||
- derekwaynecarr
|
||||
- vishh
|
||||
reviewers:
|
||||
- deads2k
|
||||
- derekwaynecarr
|
||||
- smarterclayton
|
||||
- vishh
|
||||
|
5
vendor/k8s.io/kubernetes/pkg/quota/evaluator/core/BUILD
generated
vendored
5
vendor/k8s.io/kubernetes/pkg/quota/evaluator/core/BUILD
generated
vendored
@ -21,7 +21,6 @@ go_library(
|
||||
"//pkg/apis/core/helper:go_default_library",
|
||||
"//pkg/apis/core/helper/qos:go_default_library",
|
||||
"//pkg/apis/core/v1:go_default_library",
|
||||
"//pkg/apis/core/validation:go_default_library",
|
||||
"//pkg/features:go_default_library",
|
||||
"//pkg/kubeapiserver/admission/util:go_default_library",
|
||||
"//pkg/quota:go_default_library",
|
||||
@ -34,7 +33,6 @@ go_library(
|
||||
"//vendor/k8s.io/apimachinery/pkg/util/initialization:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
||||
"//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
||||
"//vendor/k8s.io/apiserver/pkg/admission:go_default_library",
|
||||
"//vendor/k8s.io/apiserver/pkg/features:go_default_library",
|
||||
"//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
||||
@ -48,8 +46,7 @@ go_test(
|
||||
"pods_test.go",
|
||||
"services_test.go",
|
||||
],
|
||||
importpath = "k8s.io/kubernetes/pkg/quota/evaluator/core",
|
||||
library = ":go_default_library",
|
||||
embed = [":go_default_library"],
|
||||
deps = [
|
||||
"//pkg/apis/core:go_default_library",
|
||||
"//pkg/quota:go_default_library",
|
||||
|
2
vendor/k8s.io/kubernetes/pkg/quota/evaluator/core/persistent_volume_claims.go
generated
vendored
2
vendor/k8s.io/kubernetes/pkg/quota/evaluator/core/persistent_volume_claims.go
generated
vendored
@ -42,7 +42,7 @@ import (
|
||||
var pvcObjectCountName = generic.ObjectCountQuotaResourceNameFor(v1.SchemeGroupVersion.WithResource("persistentvolumeclaims").GroupResource())
|
||||
|
||||
// pvcResources are the set of static resources managed by quota associated with pvcs.
|
||||
// for each resouce in this list, it may be refined dynamically based on storage class.
|
||||
// for each resource in this list, it may be refined dynamically based on storage class.
|
||||
var pvcResources = []api.ResourceName{
|
||||
api.ResourcePersistentVolumeClaims,
|
||||
api.ResourceRequestsStorage,
|
||||
|
49
vendor/k8s.io/kubernetes/pkg/quota/evaluator/core/pods.go
generated
vendored
49
vendor/k8s.io/kubernetes/pkg/quota/evaluator/core/pods.go
generated
vendored
@ -29,12 +29,11 @@ import (
|
||||
"k8s.io/apimachinery/pkg/util/clock"
|
||||
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
||||
"k8s.io/apimachinery/pkg/util/sets"
|
||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||
"k8s.io/apiserver/pkg/admission"
|
||||
api "k8s.io/kubernetes/pkg/apis/core"
|
||||
"k8s.io/kubernetes/pkg/apis/core/helper"
|
||||
"k8s.io/kubernetes/pkg/apis/core/helper/qos"
|
||||
k8s_api_v1 "k8s.io/kubernetes/pkg/apis/core/v1"
|
||||
"k8s.io/kubernetes/pkg/apis/core/validation"
|
||||
"k8s.io/kubernetes/pkg/kubeapiserver/admission/util"
|
||||
"k8s.io/kubernetes/pkg/quota"
|
||||
"k8s.io/kubernetes/pkg/quota/generic"
|
||||
@ -71,17 +70,20 @@ var requestedResourcePrefixes = []string{
|
||||
api.ResourceHugePagesPrefix,
|
||||
}
|
||||
|
||||
const (
|
||||
requestsPrefix = "requests."
|
||||
limitsPrefix = "limits."
|
||||
)
|
||||
|
||||
// maskResourceWithPrefix mask resource with certain prefix
|
||||
// e.g. hugepages-XXX -> requests.hugepages-XXX
|
||||
func maskResourceWithPrefix(resource api.ResourceName, prefix string) api.ResourceName {
|
||||
return api.ResourceName(fmt.Sprintf("%s%s", prefix, string(resource)))
|
||||
}
|
||||
|
||||
// isExtendedResourceNameForQuota returns true if the extended resource name
|
||||
// has the quota related resource prefix.
|
||||
func isExtendedResourceNameForQuota(name api.ResourceName) bool {
|
||||
// As overcommit is not supported by extended resources for now,
|
||||
// only quota objects in format of "requests.resourceName" is allowed.
|
||||
return !helper.IsDefaultNamespaceResource(name) && strings.HasPrefix(string(name), api.DefaultResourceRequestsPrefix)
|
||||
}
|
||||
|
||||
// NOTE: it was a mistake, but if a quota tracks cpu or memory related resources,
|
||||
// the incoming pod is required to have those values set. we should not repeat
|
||||
// this mistake for other future resources (gpus, ephemeral-storage,etc).
|
||||
@ -118,23 +120,6 @@ func (p *podEvaluator) Constraints(required []api.ResourceName, item runtime.Obj
|
||||
return fmt.Errorf("Unexpected input object %v", item)
|
||||
}
|
||||
|
||||
// Pod level resources are often set during admission control
|
||||
// As a consequence, we want to verify that resources are valid prior
|
||||
// to ever charging quota prematurely in case they are not.
|
||||
// TODO remove this entire section when we have a validation step in admission.
|
||||
allErrs := field.ErrorList{}
|
||||
fldPath := field.NewPath("spec").Child("containers")
|
||||
for i, ctr := range pod.Spec.Containers {
|
||||
allErrs = append(allErrs, validation.ValidateResourceRequirements(&ctr.Resources, fldPath.Index(i).Child("resources"))...)
|
||||
}
|
||||
fldPath = field.NewPath("spec").Child("initContainers")
|
||||
for i, ctr := range pod.Spec.InitContainers {
|
||||
allErrs = append(allErrs, validation.ValidateResourceRequirements(&ctr.Resources, fldPath.Index(i).Child("resources"))...)
|
||||
}
|
||||
if len(allErrs) > 0 {
|
||||
return allErrs.ToAggregate()
|
||||
}
|
||||
|
||||
// BACKWARD COMPATIBILITY REQUIREMENT: if we quota cpu or memory, then each container
|
||||
// must make an explicit request for the resource. this was a mistake. it coupled
|
||||
// validation with resource counting, but we did this before QoS was even defined.
|
||||
@ -183,9 +168,14 @@ func (p *podEvaluator) Matches(resourceQuota *api.ResourceQuota, item runtime.Ob
|
||||
func (p *podEvaluator) MatchingResources(input []api.ResourceName) []api.ResourceName {
|
||||
result := quota.Intersection(input, podResources)
|
||||
for _, resource := range input {
|
||||
// for resources with certain prefix, e.g. hugepages
|
||||
if quota.ContainsPrefix(podResourcePrefixes, resource) {
|
||||
result = append(result, resource)
|
||||
}
|
||||
// for extended resources
|
||||
if isExtendedResourceNameForQuota(resource) {
|
||||
result = append(result, resource)
|
||||
}
|
||||
}
|
||||
|
||||
return result
|
||||
@ -244,14 +234,15 @@ func podComputeUsageHelper(requests api.ResourceList, limits api.ResourceList) a
|
||||
result[api.ResourceLimitsEphemeralStorage] = limit
|
||||
}
|
||||
for resource, request := range requests {
|
||||
// for resources with certain prefix, e.g. hugepages
|
||||
if quota.ContainsPrefix(requestedResourcePrefixes, resource) {
|
||||
result[resource] = request
|
||||
result[maskResourceWithPrefix(resource, requestsPrefix)] = request
|
||||
result[maskResourceWithPrefix(resource, api.DefaultResourceRequestsPrefix)] = request
|
||||
}
|
||||
}
|
||||
for resource, limit := range limits {
|
||||
if quota.ContainsPrefix(requestedResourcePrefixes, resource) {
|
||||
result[maskResourceWithPrefix(resource, limitsPrefix)] = limit
|
||||
// for extended resources
|
||||
if helper.IsExtendedResourceName(resource) {
|
||||
// only quota objects in format of "requests.resourceName" is allowed for extended resource.
|
||||
result[maskResourceWithPrefix(resource, api.DefaultResourceRequestsPrefix)] = request
|
||||
}
|
||||
}
|
||||
|
||||
|
115
vendor/k8s.io/kubernetes/pkg/quota/evaluator/core/pods_test.go
generated
vendored
115
vendor/k8s.io/kubernetes/pkg/quota/evaluator/core/pods_test.go
generated
vendored
@ -36,32 +36,6 @@ func TestPodConstraintsFunc(t *testing.T) {
|
||||
required []api.ResourceName
|
||||
err string
|
||||
}{
|
||||
"init container resource invalid": {
|
||||
pod: &api.Pod{
|
||||
Spec: api.PodSpec{
|
||||
InitContainers: []api.Container{{
|
||||
Resources: api.ResourceRequirements{
|
||||
Requests: api.ResourceList{api.ResourceCPU: resource.MustParse("2m")},
|
||||
Limits: api.ResourceList{api.ResourceCPU: resource.MustParse("1m")},
|
||||
},
|
||||
}},
|
||||
},
|
||||
},
|
||||
err: `spec.initContainers[0].resources.requests: Invalid value: "2m": must be less than or equal to cpu limit`,
|
||||
},
|
||||
"container resource invalid": {
|
||||
pod: &api.Pod{
|
||||
Spec: api.PodSpec{
|
||||
Containers: []api.Container{{
|
||||
Resources: api.ResourceRequirements{
|
||||
Requests: api.ResourceList{api.ResourceCPU: resource.MustParse("2m")},
|
||||
Limits: api.ResourceList{api.ResourceCPU: resource.MustParse("1m")},
|
||||
},
|
||||
}},
|
||||
},
|
||||
},
|
||||
err: `spec.containers[0].resources.requests: Invalid value: "2m": must be less than or equal to cpu limit`,
|
||||
},
|
||||
"init container resource missing": {
|
||||
pod: &api.Pod{
|
||||
Spec: api.PodSpec{
|
||||
@ -192,6 +166,23 @@ func TestPodEvaluatorUsage(t *testing.T) {
|
||||
generic.ObjectCountQuotaResourceNameFor(schema.GroupResource{Resource: "pods"}): resource.MustParse("1"),
|
||||
},
|
||||
},
|
||||
"init container extended resources": {
|
||||
pod: &api.Pod{
|
||||
Spec: api.PodSpec{
|
||||
InitContainers: []api.Container{{
|
||||
Resources: api.ResourceRequirements{
|
||||
Requests: api.ResourceList{api.ResourceName("example.com/dongle"): resource.MustParse("3")},
|
||||
Limits: api.ResourceList{api.ResourceName("example.com/dongle"): resource.MustParse("3")},
|
||||
},
|
||||
}},
|
||||
},
|
||||
},
|
||||
usage: api.ResourceList{
|
||||
api.ResourceName("requests.example.com/dongle"): resource.MustParse("3"),
|
||||
api.ResourcePods: resource.MustParse("1"),
|
||||
generic.ObjectCountQuotaResourceNameFor(schema.GroupResource{Resource: "pods"}): resource.MustParse("1"),
|
||||
},
|
||||
},
|
||||
"container CPU": {
|
||||
pod: &api.Pod{
|
||||
Spec: api.PodSpec{
|
||||
@ -266,6 +257,23 @@ func TestPodEvaluatorUsage(t *testing.T) {
|
||||
generic.ObjectCountQuotaResourceNameFor(schema.GroupResource{Resource: "pods"}): resource.MustParse("1"),
|
||||
},
|
||||
},
|
||||
"container extended resources": {
|
||||
pod: &api.Pod{
|
||||
Spec: api.PodSpec{
|
||||
Containers: []api.Container{{
|
||||
Resources: api.ResourceRequirements{
|
||||
Requests: api.ResourceList{api.ResourceName("example.com/dongle"): resource.MustParse("3")},
|
||||
Limits: api.ResourceList{api.ResourceName("example.com/dongle"): resource.MustParse("3")},
|
||||
},
|
||||
}},
|
||||
},
|
||||
},
|
||||
usage: api.ResourceList{
|
||||
api.ResourceName("requests.example.com/dongle"): resource.MustParse("3"),
|
||||
api.ResourcePods: resource.MustParse("1"),
|
||||
generic.ObjectCountQuotaResourceNameFor(schema.GroupResource{Resource: "pods"}): resource.MustParse("1"),
|
||||
},
|
||||
},
|
||||
"init container maximums override sum of containers": {
|
||||
pod: &api.Pod{
|
||||
Spec: api.PodSpec{
|
||||
@ -273,24 +281,28 @@ func TestPodEvaluatorUsage(t *testing.T) {
|
||||
{
|
||||
Resources: api.ResourceRequirements{
|
||||
Requests: api.ResourceList{
|
||||
api.ResourceCPU: resource.MustParse("4"),
|
||||
api.ResourceMemory: resource.MustParse("100M"),
|
||||
api.ResourceCPU: resource.MustParse("4"),
|
||||
api.ResourceMemory: resource.MustParse("100M"),
|
||||
api.ResourceName("example.com/dongle"): resource.MustParse("4"),
|
||||
},
|
||||
Limits: api.ResourceList{
|
||||
api.ResourceCPU: resource.MustParse("8"),
|
||||
api.ResourceMemory: resource.MustParse("200M"),
|
||||
api.ResourceCPU: resource.MustParse("8"),
|
||||
api.ResourceMemory: resource.MustParse("200M"),
|
||||
api.ResourceName("example.com/dongle"): resource.MustParse("4"),
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Resources: api.ResourceRequirements{
|
||||
Requests: api.ResourceList{
|
||||
api.ResourceCPU: resource.MustParse("1"),
|
||||
api.ResourceMemory: resource.MustParse("50M"),
|
||||
api.ResourceCPU: resource.MustParse("1"),
|
||||
api.ResourceMemory: resource.MustParse("50M"),
|
||||
api.ResourceName("example.com/dongle"): resource.MustParse("2"),
|
||||
},
|
||||
Limits: api.ResourceList{
|
||||
api.ResourceCPU: resource.MustParse("2"),
|
||||
api.ResourceMemory: resource.MustParse("100M"),
|
||||
api.ResourceCPU: resource.MustParse("2"),
|
||||
api.ResourceMemory: resource.MustParse("100M"),
|
||||
api.ResourceName("example.com/dongle"): resource.MustParse("2"),
|
||||
},
|
||||
},
|
||||
},
|
||||
@ -299,24 +311,28 @@ func TestPodEvaluatorUsage(t *testing.T) {
|
||||
{
|
||||
Resources: api.ResourceRequirements{
|
||||
Requests: api.ResourceList{
|
||||
api.ResourceCPU: resource.MustParse("1"),
|
||||
api.ResourceMemory: resource.MustParse("50M"),
|
||||
api.ResourceCPU: resource.MustParse("1"),
|
||||
api.ResourceMemory: resource.MustParse("50M"),
|
||||
api.ResourceName("example.com/dongle"): resource.MustParse("1"),
|
||||
},
|
||||
Limits: api.ResourceList{
|
||||
api.ResourceCPU: resource.MustParse("2"),
|
||||
api.ResourceMemory: resource.MustParse("100M"),
|
||||
api.ResourceCPU: resource.MustParse("2"),
|
||||
api.ResourceMemory: resource.MustParse("100M"),
|
||||
api.ResourceName("example.com/dongle"): resource.MustParse("1"),
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Resources: api.ResourceRequirements{
|
||||
Requests: api.ResourceList{
|
||||
api.ResourceCPU: resource.MustParse("2"),
|
||||
api.ResourceMemory: resource.MustParse("25M"),
|
||||
api.ResourceCPU: resource.MustParse("2"),
|
||||
api.ResourceMemory: resource.MustParse("25M"),
|
||||
api.ResourceName("example.com/dongle"): resource.MustParse("2"),
|
||||
},
|
||||
Limits: api.ResourceList{
|
||||
api.ResourceCPU: resource.MustParse("5"),
|
||||
api.ResourceMemory: resource.MustParse("50M"),
|
||||
api.ResourceCPU: resource.MustParse("5"),
|
||||
api.ResourceMemory: resource.MustParse("50M"),
|
||||
api.ResourceName("example.com/dongle"): resource.MustParse("2"),
|
||||
},
|
||||
},
|
||||
},
|
||||
@ -324,13 +340,14 @@ func TestPodEvaluatorUsage(t *testing.T) {
|
||||
},
|
||||
},
|
||||
usage: api.ResourceList{
|
||||
api.ResourceRequestsCPU: resource.MustParse("4"),
|
||||
api.ResourceRequestsMemory: resource.MustParse("100M"),
|
||||
api.ResourceLimitsCPU: resource.MustParse("8"),
|
||||
api.ResourceLimitsMemory: resource.MustParse("200M"),
|
||||
api.ResourcePods: resource.MustParse("1"),
|
||||
api.ResourceCPU: resource.MustParse("4"),
|
||||
api.ResourceMemory: resource.MustParse("100M"),
|
||||
api.ResourceRequestsCPU: resource.MustParse("4"),
|
||||
api.ResourceRequestsMemory: resource.MustParse("100M"),
|
||||
api.ResourceLimitsCPU: resource.MustParse("8"),
|
||||
api.ResourceLimitsMemory: resource.MustParse("200M"),
|
||||
api.ResourcePods: resource.MustParse("1"),
|
||||
api.ResourceCPU: resource.MustParse("4"),
|
||||
api.ResourceMemory: resource.MustParse("100M"),
|
||||
api.ResourceName("requests.example.com/dongle"): resource.MustParse("4"),
|
||||
generic.ObjectCountQuotaResourceNameFor(schema.GroupResource{Resource: "pods"}): resource.MustParse("1"),
|
||||
},
|
||||
},
|
||||
|
9
vendor/k8s.io/kubernetes/pkg/quota/evaluator/core/services.go
generated
vendored
9
vendor/k8s.io/kubernetes/pkg/quota/evaluator/core/services.go
generated
vendored
@ -132,15 +132,6 @@ func (p *serviceEvaluator) UsageStats(options quota.UsageStatsOptions) (quota.Us
|
||||
|
||||
var _ quota.Evaluator = &serviceEvaluator{}
|
||||
|
||||
// QuotaServiceType returns true if the service type is eligible to track against a quota
|
||||
func QuotaServiceType(service *v1.Service) bool {
|
||||
switch service.Spec.Type {
|
||||
case v1.ServiceTypeNodePort, v1.ServiceTypeLoadBalancer:
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
//GetQuotaServiceType returns ServiceType if the service type is eligible to track against a quota, nor return ""
|
||||
func GetQuotaServiceType(service *v1.Service) v1.ServiceType {
|
||||
switch service.Spec.Type {
|
||||
|
2
vendor/k8s.io/kubernetes/pkg/quota/generic/evaluator.go
generated
vendored
2
vendor/k8s.io/kubernetes/pkg/quota/generic/evaluator.go
generated
vendored
@ -200,7 +200,7 @@ func (o *objectCountEvaluator) UsageStats(options quota.UsageStatsOptions) (quot
|
||||
var _ quota.Evaluator = &objectCountEvaluator{}
|
||||
|
||||
// NewObjectCountEvaluator returns an evaluator that can perform generic
|
||||
// object quota counting. It allows an optional alias for backwards compatibilty
|
||||
// object quota counting. It allows an optional alias for backwards compatibility
|
||||
// purposes for the legacy object counting names in quota. Unless its supporting
|
||||
// backward compatibility, alias should not be used.
|
||||
func NewObjectCountEvaluator(
|
||||
|
4
vendor/k8s.io/kubernetes/pkg/quota/resources.go
generated
vendored
4
vendor/k8s.io/kubernetes/pkg/quota/resources.go
generated
vendored
@ -126,7 +126,7 @@ func Add(a api.ResourceList, b api.ResourceList) api.ResourceList {
|
||||
return result
|
||||
}
|
||||
|
||||
// SubtractWithNonNegativeResult - substracts and returns result of a - b but
|
||||
// SubtractWithNonNegativeResult - subtracts and returns result of a - b but
|
||||
// makes sure we don't return negative values to prevent negative resource usage.
|
||||
func SubtractWithNonNegativeResult(a api.ResourceList, b api.ResourceList) api.ResourceList {
|
||||
zero := resource.MustParse("0")
|
||||
@ -263,7 +263,7 @@ func CalculateUsage(namespaceName string, scopes []api.ResourceQuotaScope, hardL
|
||||
for _, evaluator := range evaluators {
|
||||
potentialResources = append(potentialResources, evaluator.MatchingResources(hardResources)...)
|
||||
}
|
||||
// NOTE: the intersection just removes duplicates since the evaluator match intersects wtih hard
|
||||
// NOTE: the intersection just removes duplicates since the evaluator match intersects with hard
|
||||
matchedResources := Intersection(hardResources, potentialResources)
|
||||
|
||||
// sum the observed usage from each evaluator
|
||||
|
Reference in New Issue
Block a user