Move ResourceQuota admission to k8s.io/apiserver
This commit is contained in:
parent
2373477aea
commit
70d440bc7e
@ -82,7 +82,6 @@ go_library(
|
|||||||
"//pkg/controller/volume/pvcprotection:go_default_library",
|
"//pkg/controller/volume/pvcprotection:go_default_library",
|
||||||
"//pkg/controller/volume/pvprotection:go_default_library",
|
"//pkg/controller/volume/pvprotection:go_default_library",
|
||||||
"//pkg/features:go_default_library",
|
"//pkg/features:go_default_library",
|
||||||
"//pkg/quota/v1/generic:go_default_library",
|
|
||||||
"//pkg/quota/v1/install:go_default_library",
|
"//pkg/quota/v1/install:go_default_library",
|
||||||
"//pkg/serviceaccount:go_default_library",
|
"//pkg/serviceaccount:go_default_library",
|
||||||
"//pkg/volume:go_default_library",
|
"//pkg/volume:go_default_library",
|
||||||
@ -115,6 +114,7 @@ go_library(
|
|||||||
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/quota/v1/generic:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/server:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/server:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/server/healthz:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/server/healthz:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/server/mux:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/server/mux:go_default_library",
|
||||||
|
@ -32,6 +32,7 @@ import (
|
|||||||
|
|
||||||
v1 "k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
|
"k8s.io/apiserver/pkg/quota/v1/generic"
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
storagev1informer "k8s.io/client-go/informers/storage/v1"
|
storagev1informer "k8s.io/client-go/informers/storage/v1"
|
||||||
clientset "k8s.io/client-go/kubernetes"
|
clientset "k8s.io/client-go/kubernetes"
|
||||||
@ -63,7 +64,6 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/controller/volume/pvcprotection"
|
"k8s.io/kubernetes/pkg/controller/volume/pvcprotection"
|
||||||
"k8s.io/kubernetes/pkg/controller/volume/pvprotection"
|
"k8s.io/kubernetes/pkg/controller/volume/pvprotection"
|
||||||
"k8s.io/kubernetes/pkg/features"
|
"k8s.io/kubernetes/pkg/features"
|
||||||
"k8s.io/kubernetes/pkg/quota/v1/generic"
|
|
||||||
quotainstall "k8s.io/kubernetes/pkg/quota/v1/install"
|
quotainstall "k8s.io/kubernetes/pkg/quota/v1/install"
|
||||||
"k8s.io/kubernetes/pkg/volume/csimigration"
|
"k8s.io/kubernetes/pkg/volume/csimigration"
|
||||||
netutils "k8s.io/utils/net"
|
netutils "k8s.io/utils/net"
|
||||||
|
@ -196,9 +196,6 @@ pkg/volume/util/volumepathhandler
|
|||||||
pkg/volume/vsphere_volume
|
pkg/volume/vsphere_volume
|
||||||
plugin/pkg/admission/eventratelimit/apis/eventratelimit/v1alpha1
|
plugin/pkg/admission/eventratelimit/apis/eventratelimit/v1alpha1
|
||||||
plugin/pkg/admission/limitranger
|
plugin/pkg/admission/limitranger
|
||||||
plugin/pkg/admission/resourcequota/apis/resourcequota/v1
|
|
||||||
plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1
|
|
||||||
plugin/pkg/admission/resourcequota/apis/resourcequota/v1beta1
|
|
||||||
plugin/pkg/auth/authorizer/node
|
plugin/pkg/auth/authorizer/node
|
||||||
plugin/pkg/auth/authorizer/rbac
|
plugin/pkg/auth/authorizer/rbac
|
||||||
staging/src/k8s.io/api/admission/v1
|
staging/src/k8s.io/api/admission/v1
|
||||||
@ -294,6 +291,9 @@ staging/src/k8s.io/apimachinery/pkg/watch
|
|||||||
staging/src/k8s.io/apiserver/pkg/admission
|
staging/src/k8s.io/apiserver/pkg/admission
|
||||||
staging/src/k8s.io/apiserver/pkg/admission/configuration
|
staging/src/k8s.io/apiserver/pkg/admission/configuration
|
||||||
staging/src/k8s.io/apiserver/pkg/admission/initializer
|
staging/src/k8s.io/apiserver/pkg/admission/initializer
|
||||||
|
staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1
|
||||||
|
staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1
|
||||||
|
staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1
|
||||||
staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook
|
staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook
|
||||||
staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission
|
staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission
|
||||||
staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1
|
staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1
|
||||||
|
@ -16,9 +16,7 @@ go_library(
|
|||||||
importpath = "k8s.io/kubernetes/pkg/controller/resourcequota",
|
importpath = "k8s.io/kubernetes/pkg/controller/resourcequota",
|
||||||
deps = [
|
deps = [
|
||||||
"//pkg/controller:go_default_library",
|
"//pkg/controller:go_default_library",
|
||||||
"//pkg/quota/v1:go_default_library",
|
|
||||||
"//pkg/quota/v1/evaluator/core:go_default_library",
|
"//pkg/quota/v1/evaluator/core:go_default_library",
|
||||||
"//pkg/quota/v1/generic:go_default_library",
|
|
||||||
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library",
|
||||||
@ -31,6 +29,8 @@ go_library(
|
|||||||
"//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/quota/v1:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/quota/v1/generic:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/discovery:go_default_library",
|
"//staging/src/k8s.io/client-go/discovery:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/informers/core/v1:go_default_library",
|
"//staging/src/k8s.io/client-go/informers/core/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library",
|
"//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library",
|
||||||
@ -47,8 +47,6 @@ go_test(
|
|||||||
embed = [":go_default_library"],
|
embed = [":go_default_library"],
|
||||||
deps = [
|
deps = [
|
||||||
"//pkg/controller:go_default_library",
|
"//pkg/controller:go_default_library",
|
||||||
"//pkg/quota/v1:go_default_library",
|
|
||||||
"//pkg/quota/v1/generic:go_default_library",
|
|
||||||
"//pkg/quota/v1/install:go_default_library",
|
"//pkg/quota/v1/install:go_default_library",
|
||||||
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
||||||
@ -57,6 +55,8 @@ go_test(
|
|||||||
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/quota/v1:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/quota/v1/generic:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/informers:go_default_library",
|
"//staging/src/k8s.io/client-go/informers:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library",
|
"//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library",
|
||||||
|
@ -35,6 +35,7 @@ import (
|
|||||||
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
"k8s.io/apimachinery/pkg/util/wait"
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
|
quota "k8s.io/apiserver/pkg/quota/v1"
|
||||||
"k8s.io/client-go/discovery"
|
"k8s.io/client-go/discovery"
|
||||||
coreinformers "k8s.io/client-go/informers/core/v1"
|
coreinformers "k8s.io/client-go/informers/core/v1"
|
||||||
corev1client "k8s.io/client-go/kubernetes/typed/core/v1"
|
corev1client "k8s.io/client-go/kubernetes/typed/core/v1"
|
||||||
@ -42,7 +43,6 @@ import (
|
|||||||
"k8s.io/client-go/tools/cache"
|
"k8s.io/client-go/tools/cache"
|
||||||
"k8s.io/client-go/util/workqueue"
|
"k8s.io/client-go/util/workqueue"
|
||||||
"k8s.io/kubernetes/pkg/controller"
|
"k8s.io/kubernetes/pkg/controller"
|
||||||
"k8s.io/kubernetes/pkg/quota/v1"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// NamespacedResourcesFunc knows how to discover namespaced resources.
|
// NamespacedResourcesFunc knows how to discover namespaced resources.
|
||||||
|
@ -32,6 +32,8 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
|
quota "k8s.io/apiserver/pkg/quota/v1"
|
||||||
|
"k8s.io/apiserver/pkg/quota/v1/generic"
|
||||||
"k8s.io/client-go/informers"
|
"k8s.io/client-go/informers"
|
||||||
"k8s.io/client-go/kubernetes"
|
"k8s.io/client-go/kubernetes"
|
||||||
"k8s.io/client-go/kubernetes/fake"
|
"k8s.io/client-go/kubernetes/fake"
|
||||||
|
@ -23,19 +23,19 @@ import (
|
|||||||
|
|
||||||
"k8s.io/klog/v2"
|
"k8s.io/klog/v2"
|
||||||
|
|
||||||
"k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
"k8s.io/apimachinery/pkg/api/meta"
|
"k8s.io/apimachinery/pkg/api/meta"
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
"k8s.io/apimachinery/pkg/util/clock"
|
"k8s.io/apimachinery/pkg/util/clock"
|
||||||
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
||||||
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
||||||
"k8s.io/apimachinery/pkg/util/wait"
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
|
quota "k8s.io/apiserver/pkg/quota/v1"
|
||||||
|
"k8s.io/apiserver/pkg/quota/v1/generic"
|
||||||
"k8s.io/client-go/tools/cache"
|
"k8s.io/client-go/tools/cache"
|
||||||
"k8s.io/client-go/util/workqueue"
|
"k8s.io/client-go/util/workqueue"
|
||||||
"k8s.io/kubernetes/pkg/controller"
|
"k8s.io/kubernetes/pkg/controller"
|
||||||
"k8s.io/kubernetes/pkg/quota/v1"
|
|
||||||
"k8s.io/kubernetes/pkg/quota/v1/evaluator/core"
|
"k8s.io/kubernetes/pkg/quota/v1/evaluator/core"
|
||||||
"k8s.io/kubernetes/pkg/quota/v1/generic"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type eventType int
|
type eventType int
|
||||||
|
@ -9,12 +9,13 @@ go_library(
|
|||||||
importpath = "k8s.io/kubernetes/pkg/kubeapiserver/admission",
|
importpath = "k8s.io/kubernetes/pkg/kubeapiserver/admission",
|
||||||
visibility = ["//visibility:public"],
|
visibility = ["//visibility:public"],
|
||||||
deps = [
|
deps = [
|
||||||
"//pkg/quota/v1:go_default_library",
|
|
||||||
"//pkg/quota/v1/install:go_default_library",
|
"//pkg/quota/v1/install:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/admission:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/admission:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/initializer:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/initializer:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/quota/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/server:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/server:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/server/egressselector:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/server/egressselector:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library",
|
||||||
|
@ -19,7 +19,8 @@ package admission
|
|||||||
import (
|
import (
|
||||||
"k8s.io/apimachinery/pkg/api/meta"
|
"k8s.io/apimachinery/pkg/api/meta"
|
||||||
"k8s.io/apiserver/pkg/admission"
|
"k8s.io/apiserver/pkg/admission"
|
||||||
quota "k8s.io/kubernetes/pkg/quota/v1"
|
"k8s.io/apiserver/pkg/admission/initializer"
|
||||||
|
quota "k8s.io/apiserver/pkg/quota/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TODO add a `WantsToRun` which takes a stopCh. Might make it generic.
|
// TODO add a `WantsToRun` which takes a stopCh. Might make it generic.
|
||||||
@ -34,12 +35,6 @@ type WantsRESTMapper interface {
|
|||||||
SetRESTMapper(meta.RESTMapper)
|
SetRESTMapper(meta.RESTMapper)
|
||||||
}
|
}
|
||||||
|
|
||||||
// WantsQuotaConfiguration defines a function which sets quota configuration for admission plugins that need it.
|
|
||||||
type WantsQuotaConfiguration interface {
|
|
||||||
SetQuotaConfiguration(quota.Configuration)
|
|
||||||
admission.InitializationValidator
|
|
||||||
}
|
|
||||||
|
|
||||||
// PluginInitializer is used for initialization of the Kubernetes specific admission plugins.
|
// PluginInitializer is used for initialization of the Kubernetes specific admission plugins.
|
||||||
type PluginInitializer struct {
|
type PluginInitializer struct {
|
||||||
cloudConfig []byte
|
cloudConfig []byte
|
||||||
@ -75,7 +70,7 @@ func (i *PluginInitializer) Initialize(plugin admission.Interface) {
|
|||||||
wants.SetRESTMapper(i.restMapper)
|
wants.SetRESTMapper(i.restMapper)
|
||||||
}
|
}
|
||||||
|
|
||||||
if wants, ok := plugin.(WantsQuotaConfiguration); ok {
|
if wants, ok := plugin.(initializer.WantsQuotaConfiguration); ok {
|
||||||
wants.SetQuotaConfiguration(i.quotaConfiguration)
|
wants.SetQuotaConfiguration(i.quotaConfiguration)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -42,7 +42,6 @@ go_library(
|
|||||||
"//plugin/pkg/admission/podpreset:go_default_library",
|
"//plugin/pkg/admission/podpreset:go_default_library",
|
||||||
"//plugin/pkg/admission/podtolerationrestriction:go_default_library",
|
"//plugin/pkg/admission/podtolerationrestriction:go_default_library",
|
||||||
"//plugin/pkg/admission/priority:go_default_library",
|
"//plugin/pkg/admission/priority:go_default_library",
|
||||||
"//plugin/pkg/admission/resourcequota:go_default_library",
|
|
||||||
"//plugin/pkg/admission/runtimeclass:go_default_library",
|
"//plugin/pkg/admission/runtimeclass:go_default_library",
|
||||||
"//plugin/pkg/admission/security/podsecuritypolicy:go_default_library",
|
"//plugin/pkg/admission/security/podsecuritypolicy:go_default_library",
|
||||||
"//plugin/pkg/admission/securitycontext/scdeny:go_default_library",
|
"//plugin/pkg/admission/securitycontext/scdeny:go_default_library",
|
||||||
@ -57,6 +56,7 @@ go_library(
|
|||||||
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/admission:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/admission:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/validating:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/validating:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library",
|
||||||
|
@ -44,7 +44,6 @@ import (
|
|||||||
"k8s.io/kubernetes/plugin/pkg/admission/podpreset"
|
"k8s.io/kubernetes/plugin/pkg/admission/podpreset"
|
||||||
"k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction"
|
"k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction"
|
||||||
podpriority "k8s.io/kubernetes/plugin/pkg/admission/priority"
|
podpriority "k8s.io/kubernetes/plugin/pkg/admission/priority"
|
||||||
"k8s.io/kubernetes/plugin/pkg/admission/resourcequota"
|
|
||||||
"k8s.io/kubernetes/plugin/pkg/admission/runtimeclass"
|
"k8s.io/kubernetes/plugin/pkg/admission/runtimeclass"
|
||||||
"k8s.io/kubernetes/plugin/pkg/admission/security/podsecuritypolicy"
|
"k8s.io/kubernetes/plugin/pkg/admission/security/podsecuritypolicy"
|
||||||
"k8s.io/kubernetes/plugin/pkg/admission/securitycontext/scdeny"
|
"k8s.io/kubernetes/plugin/pkg/admission/securitycontext/scdeny"
|
||||||
@ -57,6 +56,7 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
"k8s.io/apiserver/pkg/admission"
|
"k8s.io/apiserver/pkg/admission"
|
||||||
"k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle"
|
"k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle"
|
||||||
|
"k8s.io/apiserver/pkg/admission/plugin/resourcequota"
|
||||||
mutatingwebhook "k8s.io/apiserver/pkg/admission/plugin/webhook/mutating"
|
mutatingwebhook "k8s.io/apiserver/pkg/admission/plugin/webhook/mutating"
|
||||||
validatingwebhook "k8s.io/apiserver/pkg/admission/plugin/webhook/validating"
|
validatingwebhook "k8s.io/apiserver/pkg/admission/plugin/webhook/validating"
|
||||||
)
|
)
|
||||||
|
@ -1,40 +1,5 @@
|
|||||||
package(default_visibility = ["//visibility:public"])
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
load(
|
|
||||||
"@io_bazel_rules_go//go:def.bzl",
|
|
||||||
"go_library",
|
|
||||||
"go_test",
|
|
||||||
)
|
|
||||||
|
|
||||||
go_library(
|
|
||||||
name = "go_default_library",
|
|
||||||
srcs = [
|
|
||||||
"interfaces.go",
|
|
||||||
"resources.go",
|
|
||||||
],
|
|
||||||
importpath = "k8s.io/kubernetes/pkg/quota/v1",
|
|
||||||
deps = [
|
|
||||||
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apiserver/pkg/admission:go_default_library",
|
|
||||||
"//staging/src/k8s.io/client-go/tools/cache:go_default_library",
|
|
||||||
],
|
|
||||||
)
|
|
||||||
|
|
||||||
go_test(
|
|
||||||
name = "go_default_test",
|
|
||||||
srcs = ["resources_test.go"],
|
|
||||||
embed = [":go_default_library"],
|
|
||||||
deps = [
|
|
||||||
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
|
||||||
],
|
|
||||||
)
|
|
||||||
|
|
||||||
filegroup(
|
filegroup(
|
||||||
name = "package-srcs",
|
name = "package-srcs",
|
||||||
srcs = glob(["**"]),
|
srcs = glob(["**"]),
|
||||||
@ -47,7 +12,6 @@ filegroup(
|
|||||||
srcs = [
|
srcs = [
|
||||||
":package-srcs",
|
":package-srcs",
|
||||||
"//pkg/quota/v1/evaluator/core:all-srcs",
|
"//pkg/quota/v1/evaluator/core:all-srcs",
|
||||||
"//pkg/quota/v1/generic:all-srcs",
|
|
||||||
"//pkg/quota/v1/install:all-srcs",
|
"//pkg/quota/v1/install:all-srcs",
|
||||||
],
|
],
|
||||||
tags = ["automanaged"],
|
tags = ["automanaged"],
|
||||||
|
@ -22,8 +22,6 @@ go_library(
|
|||||||
"//pkg/apis/core/v1/helper:go_default_library",
|
"//pkg/apis/core/v1/helper:go_default_library",
|
||||||
"//pkg/apis/core/v1/helper/qos:go_default_library",
|
"//pkg/apis/core/v1/helper/qos:go_default_library",
|
||||||
"//pkg/features:go_default_library",
|
"//pkg/features:go_default_library",
|
||||||
"//pkg/quota/v1:go_default_library",
|
|
||||||
"//pkg/quota/v1/generic:go_default_library",
|
|
||||||
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library",
|
||||||
@ -32,6 +30,8 @@ go_library(
|
|||||||
"//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/admission:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/admission:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/quota/v1:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/quota/v1/generic:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
@ -46,14 +46,14 @@ go_test(
|
|||||||
embed = [":go_default_library"],
|
embed = [":go_default_library"],
|
||||||
deps = [
|
deps = [
|
||||||
"//pkg/apis/core:go_default_library",
|
"//pkg/apis/core:go_default_library",
|
||||||
"//pkg/quota/v1:go_default_library",
|
|
||||||
"//pkg/quota/v1/generic:go_default_library",
|
|
||||||
"//pkg/util/node:go_default_library",
|
"//pkg/util/node:go_default_library",
|
||||||
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/quota/v1:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/quota/v1/generic:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -25,13 +25,13 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
"k8s.io/apiserver/pkg/admission"
|
"k8s.io/apiserver/pkg/admission"
|
||||||
|
quota "k8s.io/apiserver/pkg/quota/v1"
|
||||||
|
"k8s.io/apiserver/pkg/quota/v1/generic"
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
k8s_api_v1 "k8s.io/kubernetes/pkg/apis/core/v1"
|
k8s_api_v1 "k8s.io/kubernetes/pkg/apis/core/v1"
|
||||||
"k8s.io/kubernetes/pkg/apis/core/v1/helper"
|
"k8s.io/kubernetes/pkg/apis/core/v1/helper"
|
||||||
k8sfeatures "k8s.io/kubernetes/pkg/features"
|
k8sfeatures "k8s.io/kubernetes/pkg/features"
|
||||||
quota "k8s.io/kubernetes/pkg/quota/v1"
|
|
||||||
"k8s.io/kubernetes/pkg/quota/v1/generic"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// the name used for object count quota
|
// the name used for object count quota
|
||||||
|
@ -23,9 +23,9 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/api/resource"
|
"k8s.io/apimachinery/pkg/api/resource"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
|
quota "k8s.io/apiserver/pkg/quota/v1"
|
||||||
|
"k8s.io/apiserver/pkg/quota/v1/generic"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
quota "k8s.io/kubernetes/pkg/quota/v1"
|
|
||||||
"k8s.io/kubernetes/pkg/quota/v1/generic"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func testVolumeClaim(name string, namespace string, spec api.PersistentVolumeClaimSpec) *api.PersistentVolumeClaim {
|
func testVolumeClaim(name string, namespace string, spec api.PersistentVolumeClaimSpec) *api.PersistentVolumeClaim {
|
||||||
|
@ -30,12 +30,12 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/util/clock"
|
"k8s.io/apimachinery/pkg/util/clock"
|
||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
"k8s.io/apiserver/pkg/admission"
|
"k8s.io/apiserver/pkg/admission"
|
||||||
|
quota "k8s.io/apiserver/pkg/quota/v1"
|
||||||
|
"k8s.io/apiserver/pkg/quota/v1/generic"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
k8s_api_v1 "k8s.io/kubernetes/pkg/apis/core/v1"
|
k8s_api_v1 "k8s.io/kubernetes/pkg/apis/core/v1"
|
||||||
"k8s.io/kubernetes/pkg/apis/core/v1/helper"
|
"k8s.io/kubernetes/pkg/apis/core/v1/helper"
|
||||||
"k8s.io/kubernetes/pkg/apis/core/v1/helper/qos"
|
"k8s.io/kubernetes/pkg/apis/core/v1/helper/qos"
|
||||||
quota "k8s.io/kubernetes/pkg/quota/v1"
|
|
||||||
"k8s.io/kubernetes/pkg/quota/v1/generic"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// the name used for object count quota
|
// the name used for object count quota
|
||||||
|
@ -25,9 +25,9 @@ import (
|
|||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
"k8s.io/apimachinery/pkg/util/clock"
|
"k8s.io/apimachinery/pkg/util/clock"
|
||||||
|
quota "k8s.io/apiserver/pkg/quota/v1"
|
||||||
|
"k8s.io/apiserver/pkg/quota/v1/generic"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
quota "k8s.io/kubernetes/pkg/quota/v1"
|
|
||||||
"k8s.io/kubernetes/pkg/quota/v1/generic"
|
|
||||||
"k8s.io/kubernetes/pkg/util/node"
|
"k8s.io/kubernetes/pkg/util/node"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -20,8 +20,8 @@ import (
|
|||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
"k8s.io/apimachinery/pkg/util/clock"
|
"k8s.io/apimachinery/pkg/util/clock"
|
||||||
quota "k8s.io/kubernetes/pkg/quota/v1"
|
quota "k8s.io/apiserver/pkg/quota/v1"
|
||||||
"k8s.io/kubernetes/pkg/quota/v1/generic"
|
"k8s.io/apiserver/pkg/quota/v1/generic"
|
||||||
)
|
)
|
||||||
|
|
||||||
// legacyObjectCountAliases are what we used to do simple object counting quota with mapped to alias
|
// legacyObjectCountAliases are what we used to do simple object counting quota with mapped to alias
|
||||||
|
@ -24,10 +24,10 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
"k8s.io/apiserver/pkg/admission"
|
"k8s.io/apiserver/pkg/admission"
|
||||||
|
quota "k8s.io/apiserver/pkg/quota/v1"
|
||||||
|
"k8s.io/apiserver/pkg/quota/v1/generic"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
k8s_api_v1 "k8s.io/kubernetes/pkg/apis/core/v1"
|
k8s_api_v1 "k8s.io/kubernetes/pkg/apis/core/v1"
|
||||||
"k8s.io/kubernetes/pkg/quota/v1"
|
|
||||||
"k8s.io/kubernetes/pkg/quota/v1/generic"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// the name used for object count quota
|
// the name used for object count quota
|
||||||
|
@ -22,9 +22,9 @@ import (
|
|||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
"k8s.io/apimachinery/pkg/api/resource"
|
"k8s.io/apimachinery/pkg/api/resource"
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
|
quota "k8s.io/apiserver/pkg/quota/v1"
|
||||||
|
"k8s.io/apiserver/pkg/quota/v1/generic"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
quota "k8s.io/kubernetes/pkg/quota/v1"
|
|
||||||
"k8s.io/kubernetes/pkg/quota/v1/generic"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestServiceEvaluatorMatchesResources(t *testing.T) {
|
func TestServiceEvaluatorMatchesResources(t *testing.T) {
|
||||||
|
@ -10,10 +10,10 @@ go_library(
|
|||||||
srcs = ["registry.go"],
|
srcs = ["registry.go"],
|
||||||
importpath = "k8s.io/kubernetes/pkg/quota/v1/install",
|
importpath = "k8s.io/kubernetes/pkg/quota/v1/install",
|
||||||
deps = [
|
deps = [
|
||||||
"//pkg/quota/v1:go_default_library",
|
|
||||||
"//pkg/quota/v1/evaluator/core:go_default_library",
|
"//pkg/quota/v1/evaluator/core:go_default_library",
|
||||||
"//pkg/quota/v1/generic:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/quota/v1:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/quota/v1/generic:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -18,9 +18,9 @@ package install
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
quota "k8s.io/kubernetes/pkg/quota/v1"
|
quota "k8s.io/apiserver/pkg/quota/v1"
|
||||||
core "k8s.io/kubernetes/pkg/quota/v1/evaluator/core"
|
"k8s.io/apiserver/pkg/quota/v1/generic"
|
||||||
generic "k8s.io/kubernetes/pkg/quota/v1/generic"
|
"k8s.io/kubernetes/pkg/quota/v1/evaluator/core"
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewQuotaConfigurationForAdmission returns a quota configuration for admission control.
|
// NewQuotaConfigurationForAdmission returns a quota configuration for admission control.
|
||||||
|
@ -1,78 +1,26 @@
|
|||||||
package(default_visibility = ["//visibility:public"])
|
load("@io_bazel_rules_go//go:def.bzl", "go_test")
|
||||||
|
|
||||||
load(
|
|
||||||
"@io_bazel_rules_go//go:def.bzl",
|
|
||||||
"go_library",
|
|
||||||
"go_test",
|
|
||||||
)
|
|
||||||
|
|
||||||
go_library(
|
|
||||||
name = "go_default_library",
|
|
||||||
srcs = [
|
|
||||||
"admission.go",
|
|
||||||
"config.go",
|
|
||||||
"controller.go",
|
|
||||||
"doc.go",
|
|
||||||
"resource_access.go",
|
|
||||||
],
|
|
||||||
importpath = "k8s.io/kubernetes/plugin/pkg/admission/resourcequota",
|
|
||||||
deps = [
|
|
||||||
"//pkg/kubeapiserver/admission:go_default_library",
|
|
||||||
"//pkg/quota/v1:go_default_library",
|
|
||||||
"//pkg/quota/v1/generic:go_default_library",
|
|
||||||
"//plugin/pkg/admission/resourcequota/apis/resourcequota:go_default_library",
|
|
||||||
"//plugin/pkg/admission/resourcequota/apis/resourcequota/install:go_default_library",
|
|
||||||
"//plugin/pkg/admission/resourcequota/apis/resourcequota/v1:go_default_library",
|
|
||||||
"//plugin/pkg/admission/resourcequota/apis/resourcequota/validation:go_default_library",
|
|
||||||
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apiserver/pkg/admission:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apiserver/pkg/storage/etcd3:go_default_library",
|
|
||||||
"//staging/src/k8s.io/client-go/informers:go_default_library",
|
|
||||||
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
|
||||||
"//staging/src/k8s.io/client-go/listers/core/v1:go_default_library",
|
|
||||||
"//staging/src/k8s.io/client-go/util/workqueue:go_default_library",
|
|
||||||
"//vendor/github.com/hashicorp/golang-lru:go_default_library",
|
|
||||||
"//vendor/k8s.io/klog/v2:go_default_library",
|
|
||||||
],
|
|
||||||
)
|
|
||||||
|
|
||||||
go_test(
|
go_test(
|
||||||
name = "go_default_test",
|
name = "go_default_test",
|
||||||
srcs = [
|
srcs = ["admission_test.go"],
|
||||||
"admission_test.go",
|
|
||||||
"config_test.go",
|
|
||||||
],
|
|
||||||
embed = [":go_default_library"],
|
|
||||||
deps = [
|
deps = [
|
||||||
"//pkg/apis/core:go_default_library",
|
"//pkg/apis/core:go_default_library",
|
||||||
"//pkg/controller:go_default_library",
|
|
||||||
"//pkg/features:go_default_library",
|
"//pkg/features:go_default_library",
|
||||||
"//pkg/quota/v1/generic:go_default_library",
|
|
||||||
"//pkg/quota/v1/install:go_default_library",
|
"//pkg/quota/v1/install:go_default_library",
|
||||||
"//plugin/pkg/admission/resourcequota/apis/resourcequota:go_default_library",
|
|
||||||
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/admission:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/admission:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/informers:go_default_library",
|
"//staging/src/k8s.io/client-go/informers:go_default_library",
|
||||||
|
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library",
|
"//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/testing:go_default_library",
|
"//staging/src/k8s.io/client-go/testing:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/tools/cache:go_default_library",
|
"//staging/src/k8s.io/client-go/tools/cache:go_default_library",
|
||||||
"//staging/src/k8s.io/component-base/featuregate/testing:go_default_library",
|
"//staging/src/k8s.io/component-base/featuregate/testing:go_default_library",
|
||||||
"//vendor/github.com/hashicorp/golang-lru:go_default_library",
|
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -85,9 +33,7 @@ filegroup(
|
|||||||
|
|
||||||
filegroup(
|
filegroup(
|
||||||
name = "all-srcs",
|
name = "all-srcs",
|
||||||
srcs = [
|
srcs = [":package-srcs"],
|
||||||
":package-srcs",
|
|
||||||
"//plugin/pkg/admission/resourcequota/apis/resourcequota:all-srcs",
|
|
||||||
],
|
|
||||||
tags = ["automanaged"],
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
)
|
)
|
||||||
|
@ -22,27 +22,24 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
|
||||||
|
|
||||||
lru "github.com/hashicorp/golang-lru"
|
|
||||||
|
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
"k8s.io/apimachinery/pkg/api/resource"
|
"k8s.io/apimachinery/pkg/api/resource"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
"k8s.io/apiserver/pkg/admission"
|
"k8s.io/apiserver/pkg/admission"
|
||||||
|
"k8s.io/apiserver/pkg/admission/plugin/resourcequota"
|
||||||
|
resourcequotaapi "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota"
|
||||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
"k8s.io/client-go/informers"
|
"k8s.io/client-go/informers"
|
||||||
|
"k8s.io/client-go/kubernetes"
|
||||||
"k8s.io/client-go/kubernetes/fake"
|
"k8s.io/client-go/kubernetes/fake"
|
||||||
testcore "k8s.io/client-go/testing"
|
testcore "k8s.io/client-go/testing"
|
||||||
"k8s.io/client-go/tools/cache"
|
"k8s.io/client-go/tools/cache"
|
||||||
featuregatetesting "k8s.io/component-base/featuregate/testing"
|
featuregatetesting "k8s.io/component-base/featuregate/testing"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
"k8s.io/kubernetes/pkg/controller"
|
|
||||||
"k8s.io/kubernetes/pkg/features"
|
"k8s.io/kubernetes/pkg/features"
|
||||||
"k8s.io/kubernetes/pkg/quota/v1/generic"
|
|
||||||
"k8s.io/kubernetes/pkg/quota/v1/install"
|
"k8s.io/kubernetes/pkg/quota/v1/install"
|
||||||
resourcequotaapi "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func getResourceList(cpu, memory string) api.ResourceList {
|
func getResourceList(cpu, memory string) api.ResourceList {
|
||||||
@ -95,44 +92,25 @@ func validPersistentVolumeClaim(name string, resources api.ResourceRequirements)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestPrettyPrint(t *testing.T) {
|
func createHandler(kubeClient kubernetes.Interface, informerFactory informers.SharedInformerFactory, stopCh chan struct{}) (*resourcequota.QuotaAdmission, error) {
|
||||||
toResourceList := func(resources map[corev1.ResourceName]string) corev1.ResourceList {
|
return createHandlerWithConfig(kubeClient, informerFactory, nil, stopCh)
|
||||||
resourceList := corev1.ResourceList{}
|
|
||||||
for key, value := range resources {
|
|
||||||
resourceList[key] = resource.MustParse(value)
|
|
||||||
}
|
}
|
||||||
return resourceList
|
|
||||||
}
|
func createHandlerWithConfig(kubeClient kubernetes.Interface, informerFactory informers.SharedInformerFactory, config *resourcequotaapi.Configuration, stopCh chan struct{}) (*resourcequota.QuotaAdmission, error) {
|
||||||
testCases := []struct {
|
if config == nil {
|
||||||
input corev1.ResourceList
|
config = &resourcequotaapi.Configuration{}
|
||||||
expected string
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
input: toResourceList(map[corev1.ResourceName]string{
|
|
||||||
corev1.ResourceCPU: "100m",
|
|
||||||
}),
|
|
||||||
expected: "cpu=100m",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
input: toResourceList(map[corev1.ResourceName]string{
|
|
||||||
corev1.ResourcePods: "10",
|
|
||||||
corev1.ResourceServices: "10",
|
|
||||||
corev1.ResourceReplicationControllers: "10",
|
|
||||||
corev1.ResourceServicesNodePorts: "10",
|
|
||||||
corev1.ResourceRequestsCPU: "100m",
|
|
||||||
corev1.ResourceRequestsMemory: "100Mi",
|
|
||||||
corev1.ResourceLimitsCPU: "100m",
|
|
||||||
corev1.ResourceLimitsMemory: "100Mi",
|
|
||||||
}),
|
|
||||||
expected: "limits.cpu=100m,limits.memory=100Mi,pods=10,replicationcontrollers=10,requests.cpu=100m,requests.memory=100Mi,services=10,services.nodeports=10",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for i, testCase := range testCases {
|
|
||||||
result := prettyPrint(testCase.input)
|
|
||||||
if result != testCase.expected {
|
|
||||||
t.Errorf("Pretty print did not give stable sorted output[%d], expected %v, but got %v", i, testCase.expected, result)
|
|
||||||
}
|
}
|
||||||
|
quotaConfiguration := install.NewQuotaConfigurationForAdmission()
|
||||||
|
|
||||||
|
handler, err := resourcequota.NewResourceQuota(config, 5, stopCh)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
|
handler.SetExternalKubeClientSet(kubeClient)
|
||||||
|
handler.SetExternalKubeInformerFactory(informerFactory)
|
||||||
|
handler.SetQuotaConfiguration(quotaConfiguration)
|
||||||
|
|
||||||
|
return handler, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// TestAdmissionIgnoresDelete verifies that the admission controller ignores delete operations
|
// TestAdmissionIgnoresDelete verifies that the admission controller ignores delete operations
|
||||||
@ -141,20 +119,15 @@ func TestAdmissionIgnoresDelete(t *testing.T) {
|
|||||||
defer close(stopCh)
|
defer close(stopCh)
|
||||||
|
|
||||||
kubeClient := fake.NewSimpleClientset()
|
kubeClient := fake.NewSimpleClientset()
|
||||||
informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc())
|
informerFactory := informers.NewSharedInformerFactory(kubeClient, 0)
|
||||||
quotaAccessor, _ := newQuotaAccessor()
|
|
||||||
quotaAccessor.client = kubeClient
|
|
||||||
quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister()
|
|
||||||
config := &resourcequotaapi.Configuration{}
|
|
||||||
quotaConfiguration := install.NewQuotaConfigurationForAdmission()
|
|
||||||
evaluator := NewQuotaEvaluator(quotaAccessor, quotaConfiguration.IgnoredResources(), generic.NewRegistry(quotaConfiguration.Evaluators()), nil, config, 5, stopCh)
|
|
||||||
|
|
||||||
handler := &QuotaAdmission{
|
handler, err := createHandler(kubeClient, informerFactory, stopCh)
|
||||||
Handler: admission.NewHandler(admission.Create, admission.Update),
|
if err != nil {
|
||||||
evaluator: evaluator,
|
t.Errorf("Error occurred while creating admission plugin: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace := "default"
|
namespace := "default"
|
||||||
err := handler.Validate(context.TODO(), admission.NewAttributesRecord(nil, nil, api.Kind("Pod").WithVersion("version"), namespace, "name", corev1.Resource("pods").WithVersion("version"), "", admission.Delete, &metav1.DeleteOptions{}, false, nil), nil)
|
err = handler.Validate(context.TODO(), admission.NewAttributesRecord(nil, nil, api.Kind("Pod").WithVersion("version"), namespace, "name", corev1.Resource("pods").WithVersion("version"), "", admission.Delete, &metav1.DeleteOptions{}, false, nil), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("ResourceQuota should admit all deletes: %v", err)
|
t.Errorf("ResourceQuota should admit all deletes: %v", err)
|
||||||
}
|
}
|
||||||
@ -177,21 +150,16 @@ func TestAdmissionIgnoresSubresources(t *testing.T) {
|
|||||||
defer close(stopCh)
|
defer close(stopCh)
|
||||||
|
|
||||||
kubeClient := fake.NewSimpleClientset()
|
kubeClient := fake.NewSimpleClientset()
|
||||||
informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc())
|
informerFactory := informers.NewSharedInformerFactory(kubeClient, 0)
|
||||||
quotaAccessor, _ := newQuotaAccessor()
|
|
||||||
quotaAccessor.client = kubeClient
|
|
||||||
quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister()
|
|
||||||
config := &resourcequotaapi.Configuration{}
|
|
||||||
quotaConfiguration := install.NewQuotaConfigurationForAdmission()
|
|
||||||
evaluator := NewQuotaEvaluator(quotaAccessor, quotaConfiguration.IgnoredResources(), generic.NewRegistry(quotaConfiguration.Evaluators()), nil, config, 5, stopCh)
|
|
||||||
|
|
||||||
handler := &QuotaAdmission{
|
handler, err := createHandler(kubeClient, informerFactory, stopCh)
|
||||||
Handler: admission.NewHandler(admission.Create, admission.Update),
|
if err != nil {
|
||||||
evaluator: evaluator,
|
t.Errorf("Error occurred while creating admission plugin: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota)
|
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota)
|
||||||
newPod := validPod("123", 1, getResourceRequirements(getResourceList("100m", "2Gi"), getResourceList("", "")))
|
newPod := validPod("123", 1, getResourceRequirements(getResourceList("100m", "2Gi"), getResourceList("", "")))
|
||||||
err := handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), newPod.Namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
err = handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), newPod.Namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Errorf("Expected an error because the pod exceeded allowed quota")
|
t.Errorf("Expected an error because the pod exceeded allowed quota")
|
||||||
}
|
}
|
||||||
@ -222,21 +190,16 @@ func TestAdmitBelowQuotaLimit(t *testing.T) {
|
|||||||
defer close(stopCh)
|
defer close(stopCh)
|
||||||
|
|
||||||
kubeClient := fake.NewSimpleClientset(resourceQuota)
|
kubeClient := fake.NewSimpleClientset(resourceQuota)
|
||||||
informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc())
|
informerFactory := informers.NewSharedInformerFactory(kubeClient, 0)
|
||||||
quotaAccessor, _ := newQuotaAccessor()
|
|
||||||
quotaAccessor.client = kubeClient
|
|
||||||
quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister()
|
|
||||||
config := &resourcequotaapi.Configuration{}
|
|
||||||
quotaConfiguration := install.NewQuotaConfigurationForAdmission()
|
|
||||||
evaluator := NewQuotaEvaluator(quotaAccessor, quotaConfiguration.IgnoredResources(), generic.NewRegistry(quotaConfiguration.Evaluators()), nil, config, 5, stopCh)
|
|
||||||
|
|
||||||
handler := &QuotaAdmission{
|
handler, err := createHandler(kubeClient, informerFactory, stopCh)
|
||||||
Handler: admission.NewHandler(admission.Create, admission.Update),
|
if err != nil {
|
||||||
evaluator: evaluator,
|
t.Errorf("Error occurred while creating admission plugin: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota)
|
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota)
|
||||||
newPod := validPod("allowed-pod", 1, getResourceRequirements(getResourceList("100m", "2Gi"), getResourceList("", "")))
|
newPod := validPod("allowed-pod", 1, getResourceRequirements(getResourceList("100m", "2Gi"), getResourceList("", "")))
|
||||||
err := handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), newPod.Namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
err = handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), newPod.Namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("Unexpected error: %v", err)
|
t.Errorf("Unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
@ -304,22 +267,17 @@ func TestAdmitDryRun(t *testing.T) {
|
|||||||
defer close(stopCh)
|
defer close(stopCh)
|
||||||
|
|
||||||
kubeClient := fake.NewSimpleClientset(resourceQuota)
|
kubeClient := fake.NewSimpleClientset(resourceQuota)
|
||||||
informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc())
|
informerFactory := informers.NewSharedInformerFactory(kubeClient, 0)
|
||||||
quotaAccessor, _ := newQuotaAccessor()
|
|
||||||
quotaAccessor.client = kubeClient
|
|
||||||
quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister()
|
|
||||||
config := &resourcequotaapi.Configuration{}
|
|
||||||
quotaConfiguration := install.NewQuotaConfigurationForAdmission()
|
|
||||||
evaluator := NewQuotaEvaluator(quotaAccessor, quotaConfiguration.IgnoredResources(), generic.NewRegistry(quotaConfiguration.Evaluators()), nil, config, 5, stopCh)
|
|
||||||
|
|
||||||
handler := &QuotaAdmission{
|
handler, err := createHandler(kubeClient, informerFactory, stopCh)
|
||||||
Handler: admission.NewHandler(admission.Create, admission.Update),
|
if err != nil {
|
||||||
evaluator: evaluator,
|
t.Errorf("Error occurred while creating admission plugin: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota)
|
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota)
|
||||||
|
|
||||||
newPod := validPod("allowed-pod", 1, getResourceRequirements(getResourceList("100m", "2Gi"), getResourceList("", "")))
|
newPod := validPod("allowed-pod", 1, getResourceRequirements(getResourceList("100m", "2Gi"), getResourceList("", "")))
|
||||||
err := handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), newPod.Namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, true, nil), nil)
|
err = handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), newPod.Namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, true, nil), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("Unexpected error: %v", err)
|
t.Errorf("Unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
@ -359,18 +317,13 @@ func TestAdmitHandlesOldObjects(t *testing.T) {
|
|||||||
defer close(stopCh)
|
defer close(stopCh)
|
||||||
|
|
||||||
kubeClient := fake.NewSimpleClientset(resourceQuota)
|
kubeClient := fake.NewSimpleClientset(resourceQuota)
|
||||||
informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc())
|
informerFactory := informers.NewSharedInformerFactory(kubeClient, 0)
|
||||||
quotaAccessor, _ := newQuotaAccessor()
|
|
||||||
quotaAccessor.client = kubeClient
|
|
||||||
quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister()
|
|
||||||
config := &resourcequotaapi.Configuration{}
|
|
||||||
quotaConfiguration := install.NewQuotaConfigurationForAdmission()
|
|
||||||
evaluator := NewQuotaEvaluator(quotaAccessor, quotaConfiguration.IgnoredResources(), generic.NewRegistry(quotaConfiguration.Evaluators()), nil, config, 5, stopCh)
|
|
||||||
|
|
||||||
handler := &QuotaAdmission{
|
handler, err := createHandler(kubeClient, informerFactory, stopCh)
|
||||||
Handler: admission.NewHandler(admission.Create, admission.Update),
|
if err != nil {
|
||||||
evaluator: evaluator,
|
t.Errorf("Error occurred while creating admission plugin: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota)
|
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota)
|
||||||
|
|
||||||
// old service was a load balancer, but updated version is a node port.
|
// old service was a load balancer, but updated version is a node port.
|
||||||
@ -385,7 +338,7 @@ func TestAdmitHandlesOldObjects(t *testing.T) {
|
|||||||
Ports: []api.ServicePort{{Port: 1234}},
|
Ports: []api.ServicePort{{Port: 1234}},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
err := handler.Validate(context.TODO(), admission.NewAttributesRecord(newService, existingService, api.Kind("Service").WithVersion("version"), newService.Namespace, newService.Name, corev1.Resource("services").WithVersion("version"), "", admission.Update, &metav1.UpdateOptions{}, false, nil), nil)
|
err = handler.Validate(context.TODO(), admission.NewAttributesRecord(newService, existingService, api.Kind("Service").WithVersion("version"), newService.Namespace, newService.Name, corev1.Resource("services").WithVersion("version"), "", admission.Update, &metav1.UpdateOptions{}, false, nil), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("Unexpected error: %v", err)
|
t.Errorf("Unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
@ -458,18 +411,13 @@ func TestAdmitHandlesNegativePVCUpdates(t *testing.T) {
|
|||||||
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.ExpandPersistentVolumes, true)()
|
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.ExpandPersistentVolumes, true)()
|
||||||
|
|
||||||
kubeClient := fake.NewSimpleClientset(resourceQuota)
|
kubeClient := fake.NewSimpleClientset(resourceQuota)
|
||||||
informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc())
|
informerFactory := informers.NewSharedInformerFactory(kubeClient, 0)
|
||||||
quotaAccessor, _ := newQuotaAccessor()
|
|
||||||
quotaAccessor.client = kubeClient
|
|
||||||
quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister()
|
|
||||||
config := &resourcequotaapi.Configuration{}
|
|
||||||
quotaConfiguration := install.NewQuotaConfigurationForAdmission()
|
|
||||||
evaluator := NewQuotaEvaluator(quotaAccessor, quotaConfiguration.IgnoredResources(), generic.NewRegistry(quotaConfiguration.Evaluators()), nil, config, 5, stopCh)
|
|
||||||
|
|
||||||
handler := &QuotaAdmission{
|
handler, err := createHandler(kubeClient, informerFactory, stopCh)
|
||||||
Handler: admission.NewHandler(admission.Create, admission.Update),
|
if err != nil {
|
||||||
evaluator: evaluator,
|
t.Errorf("Error occurred while creating admission plugin: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota)
|
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota)
|
||||||
|
|
||||||
oldPVC := &api.PersistentVolumeClaim{
|
oldPVC := &api.PersistentVolumeClaim{
|
||||||
@ -486,7 +434,7 @@ func TestAdmitHandlesNegativePVCUpdates(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
err := handler.Validate(context.TODO(), admission.NewAttributesRecord(newPVC, oldPVC, api.Kind("PersistentVolumeClaim").WithVersion("version"), newPVC.Namespace, newPVC.Name, corev1.Resource("persistentvolumeclaims").WithVersion("version"), "", admission.Update, &metav1.UpdateOptions{}, false, nil), nil)
|
err = handler.Validate(context.TODO(), admission.NewAttributesRecord(newPVC, oldPVC, api.Kind("PersistentVolumeClaim").WithVersion("version"), newPVC.Namespace, newPVC.Name, corev1.Resource("persistentvolumeclaims").WithVersion("version"), "", admission.Update, &metav1.UpdateOptions{}, false, nil), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("Unexpected error: %v", err)
|
t.Errorf("Unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
@ -517,18 +465,13 @@ func TestAdmitHandlesPVCUpdates(t *testing.T) {
|
|||||||
defer close(stopCh)
|
defer close(stopCh)
|
||||||
|
|
||||||
kubeClient := fake.NewSimpleClientset(resourceQuota)
|
kubeClient := fake.NewSimpleClientset(resourceQuota)
|
||||||
informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc())
|
informerFactory := informers.NewSharedInformerFactory(kubeClient, 0)
|
||||||
quotaAccessor, _ := newQuotaAccessor()
|
|
||||||
quotaAccessor.client = kubeClient
|
|
||||||
quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister()
|
|
||||||
config := &resourcequotaapi.Configuration{}
|
|
||||||
quotaConfiguration := install.NewQuotaConfigurationForAdmission()
|
|
||||||
evaluator := NewQuotaEvaluator(quotaAccessor, quotaConfiguration.IgnoredResources(), generic.NewRegistry(quotaConfiguration.Evaluators()), nil, config, 5, stopCh)
|
|
||||||
|
|
||||||
handler := &QuotaAdmission{
|
handler, err := createHandler(kubeClient, informerFactory, stopCh)
|
||||||
Handler: admission.NewHandler(admission.Create, admission.Update),
|
if err != nil {
|
||||||
evaluator: evaluator,
|
t.Errorf("Error occurred while creating admission plugin: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota)
|
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota)
|
||||||
|
|
||||||
oldPVC := &api.PersistentVolumeClaim{
|
oldPVC := &api.PersistentVolumeClaim{
|
||||||
@ -545,7 +488,7 @@ func TestAdmitHandlesPVCUpdates(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
err := handler.Validate(context.TODO(), admission.NewAttributesRecord(newPVC, oldPVC, api.Kind("PersistentVolumeClaim").WithVersion("version"), newPVC.Namespace, newPVC.Name, corev1.Resource("persistentvolumeclaims").WithVersion("version"), "", admission.Update, &metav1.UpdateOptions{}, false, nil), nil)
|
err = handler.Validate(context.TODO(), admission.NewAttributesRecord(newPVC, oldPVC, api.Kind("PersistentVolumeClaim").WithVersion("version"), newPVC.Namespace, newPVC.Name, corev1.Resource("persistentvolumeclaims").WithVersion("version"), "", admission.Update, &metav1.UpdateOptions{}, false, nil), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("Unexpected error: %v", err)
|
t.Errorf("Unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
@ -616,18 +559,13 @@ func TestAdmitHandlesCreatingUpdates(t *testing.T) {
|
|||||||
defer close(stopCh)
|
defer close(stopCh)
|
||||||
|
|
||||||
kubeClient := fake.NewSimpleClientset(resourceQuota)
|
kubeClient := fake.NewSimpleClientset(resourceQuota)
|
||||||
informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc())
|
informerFactory := informers.NewSharedInformerFactory(kubeClient, 0)
|
||||||
quotaAccessor, _ := newQuotaAccessor()
|
|
||||||
quotaAccessor.client = kubeClient
|
|
||||||
quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister()
|
|
||||||
config := &resourcequotaapi.Configuration{}
|
|
||||||
quotaConfiguration := install.NewQuotaConfigurationForAdmission()
|
|
||||||
evaluator := NewQuotaEvaluator(quotaAccessor, quotaConfiguration.IgnoredResources(), generic.NewRegistry(quotaConfiguration.Evaluators()), nil, config, 5, stopCh)
|
|
||||||
|
|
||||||
handler := &QuotaAdmission{
|
handler, err := createHandler(kubeClient, informerFactory, stopCh)
|
||||||
Handler: admission.NewHandler(admission.Create, admission.Update),
|
if err != nil {
|
||||||
evaluator: evaluator,
|
t.Errorf("Error occurred while creating admission plugin: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota)
|
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota)
|
||||||
|
|
||||||
// old service didn't exist, so this update is actually a create
|
// old service didn't exist, so this update is actually a create
|
||||||
@ -642,7 +580,7 @@ func TestAdmitHandlesCreatingUpdates(t *testing.T) {
|
|||||||
Ports: []api.ServicePort{{Port: 1234}},
|
Ports: []api.ServicePort{{Port: 1234}},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
err := handler.Validate(context.TODO(), admission.NewAttributesRecord(newService, oldService, api.Kind("Service").WithVersion("version"), newService.Namespace, newService.Name, corev1.Resource("services").WithVersion("version"), "", admission.Update, &metav1.UpdateOptions{}, false, nil), nil)
|
err = handler.Validate(context.TODO(), admission.NewAttributesRecord(newService, oldService, api.Kind("Service").WithVersion("version"), newService.Namespace, newService.Name, corev1.Resource("services").WithVersion("version"), "", admission.Update, &metav1.UpdateOptions{}, false, nil), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("Unexpected error: %v", err)
|
t.Errorf("Unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
@ -711,21 +649,16 @@ func TestAdmitExceedQuotaLimit(t *testing.T) {
|
|||||||
defer close(stopCh)
|
defer close(stopCh)
|
||||||
|
|
||||||
kubeClient := fake.NewSimpleClientset(resourceQuota)
|
kubeClient := fake.NewSimpleClientset(resourceQuota)
|
||||||
informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc())
|
informerFactory := informers.NewSharedInformerFactory(kubeClient, 0)
|
||||||
quotaAccessor, _ := newQuotaAccessor()
|
|
||||||
quotaAccessor.client = kubeClient
|
|
||||||
quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister()
|
|
||||||
config := &resourcequotaapi.Configuration{}
|
|
||||||
quotaConfiguration := install.NewQuotaConfigurationForAdmission()
|
|
||||||
evaluator := NewQuotaEvaluator(quotaAccessor, quotaConfiguration.IgnoredResources(), generic.NewRegistry(quotaConfiguration.Evaluators()), nil, config, 5, stopCh)
|
|
||||||
|
|
||||||
handler := &QuotaAdmission{
|
handler, err := createHandler(kubeClient, informerFactory, stopCh)
|
||||||
Handler: admission.NewHandler(admission.Create, admission.Update),
|
if err != nil {
|
||||||
evaluator: evaluator,
|
t.Errorf("Error occurred while creating admission plugin: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota)
|
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota)
|
||||||
newPod := validPod("not-allowed-pod", 1, getResourceRequirements(getResourceList("3", "2Gi"), getResourceList("", "")))
|
newPod := validPod("not-allowed-pod", 1, getResourceRequirements(getResourceList("3", "2Gi"), getResourceList("", "")))
|
||||||
err := handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), newPod.Namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
err = handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), newPod.Namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Errorf("Expected an error exceeding quota")
|
t.Errorf("Expected an error exceeding quota")
|
||||||
}
|
}
|
||||||
@ -756,22 +689,17 @@ func TestAdmitEnforceQuotaConstraints(t *testing.T) {
|
|||||||
defer close(stopCh)
|
defer close(stopCh)
|
||||||
|
|
||||||
kubeClient := fake.NewSimpleClientset(resourceQuota)
|
kubeClient := fake.NewSimpleClientset(resourceQuota)
|
||||||
informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc())
|
informerFactory := informers.NewSharedInformerFactory(kubeClient, 0)
|
||||||
quotaAccessor, _ := newQuotaAccessor()
|
|
||||||
quotaAccessor.client = kubeClient
|
|
||||||
quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister()
|
|
||||||
config := &resourcequotaapi.Configuration{}
|
|
||||||
quotaConfiguration := install.NewQuotaConfigurationForAdmission()
|
|
||||||
evaluator := NewQuotaEvaluator(quotaAccessor, quotaConfiguration.IgnoredResources(), generic.NewRegistry(quotaConfiguration.Evaluators()), nil, config, 5, stopCh)
|
|
||||||
|
|
||||||
handler := &QuotaAdmission{
|
handler, err := createHandler(kubeClient, informerFactory, stopCh)
|
||||||
Handler: admission.NewHandler(admission.Create, admission.Update),
|
if err != nil {
|
||||||
evaluator: evaluator,
|
t.Errorf("Error occurred while creating admission plugin: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota)
|
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota)
|
||||||
// verify all values are specified as required on the quota
|
// verify all values are specified as required on the quota
|
||||||
newPod := validPod("not-allowed-pod", 1, getResourceRequirements(getResourceList("100m", "2Gi"), getResourceList("200m", "")))
|
newPod := validPod("not-allowed-pod", 1, getResourceRequirements(getResourceList("100m", "2Gi"), getResourceList("200m", "")))
|
||||||
err := handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), newPod.Namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
err = handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), newPod.Namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Errorf("Expected an error because the pod does not specify a memory limit")
|
t.Errorf("Expected an error because the pod does not specify a memory limit")
|
||||||
}
|
}
|
||||||
@ -796,35 +724,24 @@ func TestAdmitPodInNamespaceWithoutQuota(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
liveLookupCache, err := lru.New(100)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
stopCh := make(chan struct{})
|
stopCh := make(chan struct{})
|
||||||
defer close(stopCh)
|
defer close(stopCh)
|
||||||
|
|
||||||
kubeClient := fake.NewSimpleClientset(resourceQuota)
|
kubeClient := fake.NewSimpleClientset(resourceQuota)
|
||||||
informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc())
|
informerFactory := informers.NewSharedInformerFactory(kubeClient, 0)
|
||||||
quotaAccessor, _ := newQuotaAccessor()
|
|
||||||
quotaAccessor.client = kubeClient
|
|
||||||
quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister()
|
|
||||||
quotaAccessor.liveLookupCache = liveLookupCache
|
|
||||||
config := &resourcequotaapi.Configuration{}
|
|
||||||
quotaConfiguration := install.NewQuotaConfigurationForAdmission()
|
|
||||||
evaluator := NewQuotaEvaluator(quotaAccessor, quotaConfiguration.IgnoredResources(), generic.NewRegistry(quotaConfiguration.Evaluators()), nil, config, 5, stopCh)
|
|
||||||
|
|
||||||
handler := &QuotaAdmission{
|
handler, err := createHandler(kubeClient, informerFactory, stopCh)
|
||||||
Handler: admission.NewHandler(admission.Create, admission.Update),
|
if err != nil {
|
||||||
evaluator: evaluator,
|
t.Errorf("Error occurred while creating admission plugin: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add to the index
|
// Add to the index
|
||||||
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota)
|
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota)
|
||||||
newPod := validPod("not-allowed-pod", 1, getResourceRequirements(getResourceList("100m", "2Gi"), getResourceList("200m", "")))
|
newPod := validPod("allowed-pod", 1, getResourceRequirements(getResourceList("100m", "2Gi"), getResourceList("200m", "")))
|
||||||
// Add to the lru cache so we do not do a live client lookup
|
|
||||||
liveLookupCache.Add(newPod.Namespace, liveLookupEntry{expiry: time.Now().Add(time.Duration(30 * time.Second)), items: []*corev1.ResourceQuota{}})
|
|
||||||
err = handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), newPod.Namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
err = handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), newPod.Namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("Did not expect an error because the pod is in a different namespace than the quota")
|
t.Errorf("Did not expect an error because the pod is in a different namespace than the quota: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -872,18 +789,13 @@ func TestAdmitBelowTerminatingQuotaLimit(t *testing.T) {
|
|||||||
defer close(stopCh)
|
defer close(stopCh)
|
||||||
|
|
||||||
kubeClient := fake.NewSimpleClientset(resourceQuotaTerminating, resourceQuotaNonTerminating)
|
kubeClient := fake.NewSimpleClientset(resourceQuotaTerminating, resourceQuotaNonTerminating)
|
||||||
informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc())
|
informerFactory := informers.NewSharedInformerFactory(kubeClient, 0)
|
||||||
quotaAccessor, _ := newQuotaAccessor()
|
|
||||||
quotaAccessor.client = kubeClient
|
|
||||||
quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister()
|
|
||||||
config := &resourcequotaapi.Configuration{}
|
|
||||||
quotaConfiguration := install.NewQuotaConfigurationForAdmission()
|
|
||||||
evaluator := NewQuotaEvaluator(quotaAccessor, quotaConfiguration.IgnoredResources(), generic.NewRegistry(quotaConfiguration.Evaluators()), nil, config, 5, stopCh)
|
|
||||||
|
|
||||||
handler := &QuotaAdmission{
|
handler, err := createHandler(kubeClient, informerFactory, stopCh)
|
||||||
Handler: admission.NewHandler(admission.Create, admission.Update),
|
if err != nil {
|
||||||
evaluator: evaluator,
|
t.Errorf("Error occurred while creating admission plugin: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuotaNonTerminating)
|
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuotaNonTerminating)
|
||||||
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuotaTerminating)
|
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuotaTerminating)
|
||||||
|
|
||||||
@ -891,7 +803,7 @@ func TestAdmitBelowTerminatingQuotaLimit(t *testing.T) {
|
|||||||
newPod := validPod("allowed-pod", 1, getResourceRequirements(getResourceList("100m", "2Gi"), getResourceList("", "")))
|
newPod := validPod("allowed-pod", 1, getResourceRequirements(getResourceList("100m", "2Gi"), getResourceList("", "")))
|
||||||
activeDeadlineSeconds := int64(30)
|
activeDeadlineSeconds := int64(30)
|
||||||
newPod.Spec.ActiveDeadlineSeconds = &activeDeadlineSeconds
|
newPod.Spec.ActiveDeadlineSeconds = &activeDeadlineSeconds
|
||||||
err := handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), newPod.Namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
err = handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), newPod.Namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("Unexpected error: %v", err)
|
t.Errorf("Unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
@ -978,24 +890,19 @@ func TestAdmitBelowBestEffortQuotaLimit(t *testing.T) {
|
|||||||
defer close(stopCh)
|
defer close(stopCh)
|
||||||
|
|
||||||
kubeClient := fake.NewSimpleClientset(resourceQuotaBestEffort, resourceQuotaNotBestEffort)
|
kubeClient := fake.NewSimpleClientset(resourceQuotaBestEffort, resourceQuotaNotBestEffort)
|
||||||
informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc())
|
informerFactory := informers.NewSharedInformerFactory(kubeClient, 0)
|
||||||
quotaAccessor, _ := newQuotaAccessor()
|
|
||||||
quotaAccessor.client = kubeClient
|
|
||||||
quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister()
|
|
||||||
config := &resourcequotaapi.Configuration{}
|
|
||||||
quotaConfiguration := install.NewQuotaConfigurationForAdmission()
|
|
||||||
evaluator := NewQuotaEvaluator(quotaAccessor, quotaConfiguration.IgnoredResources(), generic.NewRegistry(quotaConfiguration.Evaluators()), nil, config, 5, stopCh)
|
|
||||||
|
|
||||||
handler := &QuotaAdmission{
|
handler, err := createHandler(kubeClient, informerFactory, stopCh)
|
||||||
Handler: admission.NewHandler(admission.Create, admission.Update),
|
if err != nil {
|
||||||
evaluator: evaluator,
|
t.Errorf("Error occurred while creating admission plugin: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuotaBestEffort)
|
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuotaBestEffort)
|
||||||
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuotaNotBestEffort)
|
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuotaNotBestEffort)
|
||||||
|
|
||||||
// create a pod that is best effort because it does not make a request for anything
|
// create a pod that is best effort because it does not make a request for anything
|
||||||
newPod := validPod("allowed-pod", 1, getResourceRequirements(getResourceList("", ""), getResourceList("", "")))
|
newPod := validPod("allowed-pod", 1, getResourceRequirements(getResourceList("", ""), getResourceList("", "")))
|
||||||
err := handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), newPod.Namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
err = handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), newPod.Namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("Unexpected error: %v", err)
|
t.Errorf("Unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
@ -1071,21 +978,16 @@ func TestAdmitBestEffortQuotaLimitIgnoresBurstable(t *testing.T) {
|
|||||||
defer close(stopCh)
|
defer close(stopCh)
|
||||||
|
|
||||||
kubeClient := fake.NewSimpleClientset(resourceQuota)
|
kubeClient := fake.NewSimpleClientset(resourceQuota)
|
||||||
informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc())
|
informerFactory := informers.NewSharedInformerFactory(kubeClient, 0)
|
||||||
quotaAccessor, _ := newQuotaAccessor()
|
|
||||||
quotaAccessor.client = kubeClient
|
|
||||||
quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister()
|
|
||||||
config := &resourcequotaapi.Configuration{}
|
|
||||||
quotaConfiguration := install.NewQuotaConfigurationForAdmission()
|
|
||||||
evaluator := NewQuotaEvaluator(quotaAccessor, quotaConfiguration.IgnoredResources(), generic.NewRegistry(quotaConfiguration.Evaluators()), nil, config, 5, stopCh)
|
|
||||||
|
|
||||||
handler := &QuotaAdmission{
|
handler, err := createHandler(kubeClient, informerFactory, stopCh)
|
||||||
Handler: admission.NewHandler(admission.Create, admission.Update),
|
if err != nil {
|
||||||
evaluator: evaluator,
|
t.Errorf("Error occurred while creating admission plugin: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota)
|
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota)
|
||||||
newPod := validPod("allowed-pod", 1, getResourceRequirements(getResourceList("100m", "1Gi"), getResourceList("", "")))
|
newPod := validPod("allowed-pod", 1, getResourceRequirements(getResourceList("100m", "1Gi"), getResourceList("", "")))
|
||||||
err := handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), newPod.Namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
err = handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), newPod.Namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("Unexpected error: %v", err)
|
t.Errorf("Unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
@ -1096,66 +998,6 @@ func TestAdmitBestEffortQuotaLimitIgnoresBurstable(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestHasUsageStats(t *testing.T) {
|
|
||||||
testCases := map[string]struct {
|
|
||||||
a corev1.ResourceQuota
|
|
||||||
relevant []corev1.ResourceName
|
|
||||||
expected bool
|
|
||||||
}{
|
|
||||||
"empty": {
|
|
||||||
a: corev1.ResourceQuota{Status: corev1.ResourceQuotaStatus{Hard: corev1.ResourceList{}}},
|
|
||||||
relevant: []corev1.ResourceName{corev1.ResourceMemory},
|
|
||||||
expected: true,
|
|
||||||
},
|
|
||||||
"hard-only": {
|
|
||||||
a: corev1.ResourceQuota{
|
|
||||||
Status: corev1.ResourceQuotaStatus{
|
|
||||||
Hard: corev1.ResourceList{
|
|
||||||
corev1.ResourceMemory: resource.MustParse("1Gi"),
|
|
||||||
},
|
|
||||||
Used: corev1.ResourceList{},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
relevant: []corev1.ResourceName{corev1.ResourceMemory},
|
|
||||||
expected: false,
|
|
||||||
},
|
|
||||||
"hard-used": {
|
|
||||||
a: corev1.ResourceQuota{
|
|
||||||
Status: corev1.ResourceQuotaStatus{
|
|
||||||
Hard: corev1.ResourceList{
|
|
||||||
corev1.ResourceMemory: resource.MustParse("1Gi"),
|
|
||||||
},
|
|
||||||
Used: corev1.ResourceList{
|
|
||||||
corev1.ResourceMemory: resource.MustParse("500Mi"),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
relevant: []corev1.ResourceName{corev1.ResourceMemory},
|
|
||||||
expected: true,
|
|
||||||
},
|
|
||||||
"hard-used-relevant": {
|
|
||||||
a: corev1.ResourceQuota{
|
|
||||||
Status: corev1.ResourceQuotaStatus{
|
|
||||||
Hard: corev1.ResourceList{
|
|
||||||
corev1.ResourceMemory: resource.MustParse("1Gi"),
|
|
||||||
corev1.ResourcePods: resource.MustParse("1"),
|
|
||||||
},
|
|
||||||
Used: corev1.ResourceList{
|
|
||||||
corev1.ResourceMemory: resource.MustParse("500Mi"),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
relevant: []corev1.ResourceName{corev1.ResourceMemory},
|
|
||||||
expected: true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for testName, testCase := range testCases {
|
|
||||||
if result := hasUsageStats(&testCase.a, testCase.relevant); result != testCase.expected {
|
|
||||||
t.Errorf("%s expected: %v, actual: %v", testName, testCase.expected, result)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TestAdmissionSetsMissingNamespace verifies that if an object lacks a
|
// TestAdmissionSetsMissingNamespace verifies that if an object lacks a
|
||||||
// namespace, it will be set.
|
// namespace, it will be set.
|
||||||
func TestAdmissionSetsMissingNamespace(t *testing.T) {
|
func TestAdmissionSetsMissingNamespace(t *testing.T) {
|
||||||
@ -1176,25 +1018,20 @@ func TestAdmissionSetsMissingNamespace(t *testing.T) {
|
|||||||
defer close(stopCh)
|
defer close(stopCh)
|
||||||
|
|
||||||
kubeClient := fake.NewSimpleClientset(resourceQuota)
|
kubeClient := fake.NewSimpleClientset(resourceQuota)
|
||||||
informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc())
|
informerFactory := informers.NewSharedInformerFactory(kubeClient, 0)
|
||||||
quotaAccessor, _ := newQuotaAccessor()
|
|
||||||
quotaAccessor.client = kubeClient
|
|
||||||
quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister()
|
|
||||||
config := &resourcequotaapi.Configuration{}
|
|
||||||
quotaConfiguration := install.NewQuotaConfigurationForAdmission()
|
|
||||||
evaluator := NewQuotaEvaluator(quotaAccessor, quotaConfiguration.IgnoredResources(), generic.NewRegistry(quotaConfiguration.Evaluators()), nil, config, 5, stopCh)
|
|
||||||
|
|
||||||
handler := &QuotaAdmission{
|
handler, err := createHandler(kubeClient, informerFactory, stopCh)
|
||||||
Handler: admission.NewHandler(admission.Create, admission.Update),
|
if err != nil {
|
||||||
evaluator: evaluator,
|
t.Errorf("Error occurred while creating admission plugin: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota)
|
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota)
|
||||||
newPod := validPod("pod-without-namespace", 1, getResourceRequirements(getResourceList("1", "2Gi"), getResourceList("", "")))
|
newPod := validPod("pod-without-namespace", 1, getResourceRequirements(getResourceList("1", "2Gi"), getResourceList("", "")))
|
||||||
|
|
||||||
// unset the namespace
|
// unset the namespace
|
||||||
newPod.ObjectMeta.Namespace = ""
|
newPod.ObjectMeta.Namespace = ""
|
||||||
|
|
||||||
err := handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
err = handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("Got unexpected error: %v", err)
|
t.Errorf("Got unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
@ -1222,22 +1059,17 @@ func TestAdmitRejectsNegativeUsage(t *testing.T) {
|
|||||||
defer close(stopCh)
|
defer close(stopCh)
|
||||||
|
|
||||||
kubeClient := fake.NewSimpleClientset(resourceQuota)
|
kubeClient := fake.NewSimpleClientset(resourceQuota)
|
||||||
informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc())
|
informerFactory := informers.NewSharedInformerFactory(kubeClient, 0)
|
||||||
quotaAccessor, _ := newQuotaAccessor()
|
|
||||||
quotaAccessor.client = kubeClient
|
|
||||||
quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister()
|
|
||||||
config := &resourcequotaapi.Configuration{}
|
|
||||||
quotaConfiguration := install.NewQuotaConfigurationForAdmission()
|
|
||||||
evaluator := NewQuotaEvaluator(quotaAccessor, quotaConfiguration.IgnoredResources(), generic.NewRegistry(quotaConfiguration.Evaluators()), nil, config, 5, stopCh)
|
|
||||||
|
|
||||||
handler := &QuotaAdmission{
|
handler, err := createHandler(kubeClient, informerFactory, stopCh)
|
||||||
Handler: admission.NewHandler(admission.Create, admission.Update),
|
if err != nil {
|
||||||
evaluator: evaluator,
|
t.Errorf("Error occurred while creating admission plugin: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota)
|
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota)
|
||||||
// verify quota rejects negative pvc storage requests
|
// verify quota rejects negative pvc storage requests
|
||||||
newPvc := validPersistentVolumeClaim("not-allowed-pvc", getResourceRequirements(api.ResourceList{api.ResourceStorage: resource.MustParse("-1Gi")}, api.ResourceList{}))
|
newPvc := validPersistentVolumeClaim("not-allowed-pvc", getResourceRequirements(api.ResourceList{api.ResourceStorage: resource.MustParse("-1Gi")}, api.ResourceList{}))
|
||||||
err := handler.Validate(context.TODO(), admission.NewAttributesRecord(newPvc, nil, api.Kind("PersistentVolumeClaim").WithVersion("version"), newPvc.Namespace, newPvc.Name, corev1.Resource("persistentvolumeclaims").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
err = handler.Validate(context.TODO(), admission.NewAttributesRecord(newPvc, nil, api.Kind("PersistentVolumeClaim").WithVersion("version"), newPvc.Namespace, newPvc.Name, corev1.Resource("persistentvolumeclaims").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Errorf("Expected an error because the pvc has negative storage usage")
|
t.Errorf("Expected an error because the pvc has negative storage usage")
|
||||||
}
|
}
|
||||||
@ -1269,23 +1101,18 @@ func TestAdmitWhenUnrelatedResourceExceedsQuota(t *testing.T) {
|
|||||||
defer close(stopCh)
|
defer close(stopCh)
|
||||||
|
|
||||||
kubeClient := fake.NewSimpleClientset(resourceQuota)
|
kubeClient := fake.NewSimpleClientset(resourceQuota)
|
||||||
informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc())
|
informerFactory := informers.NewSharedInformerFactory(kubeClient, 0)
|
||||||
quotaAccessor, _ := newQuotaAccessor()
|
|
||||||
quotaAccessor.client = kubeClient
|
|
||||||
quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister()
|
|
||||||
config := &resourcequotaapi.Configuration{}
|
|
||||||
quotaConfiguration := install.NewQuotaConfigurationForAdmission()
|
|
||||||
evaluator := NewQuotaEvaluator(quotaAccessor, quotaConfiguration.IgnoredResources(), generic.NewRegistry(quotaConfiguration.Evaluators()), nil, config, 5, stopCh)
|
|
||||||
|
|
||||||
handler := &QuotaAdmission{
|
handler, err := createHandler(kubeClient, informerFactory, stopCh)
|
||||||
Handler: admission.NewHandler(admission.Create, admission.Update),
|
if err != nil {
|
||||||
evaluator: evaluator,
|
t.Errorf("Error occurred while creating admission plugin: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota)
|
informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota)
|
||||||
|
|
||||||
// create a pod that should pass existing quota
|
// create a pod that should pass existing quota
|
||||||
newPod := validPod("allowed-pod", 1, getResourceRequirements(getResourceList("", ""), getResourceList("", "")))
|
newPod := validPod("allowed-pod", 1, getResourceRequirements(getResourceList("", ""), getResourceList("", "")))
|
||||||
err := handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), newPod.Namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
err = handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), newPod.Namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("Unexpected error: %v", err)
|
t.Errorf("Unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
@ -1297,10 +1124,7 @@ func TestAdmitLimitedResourceNoQuota(t *testing.T) {
|
|||||||
stopCh := make(chan struct{})
|
stopCh := make(chan struct{})
|
||||||
defer close(stopCh)
|
defer close(stopCh)
|
||||||
|
|
||||||
informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc())
|
informerFactory := informers.NewSharedInformerFactory(kubeClient, 0)
|
||||||
quotaAccessor, _ := newQuotaAccessor()
|
|
||||||
quotaAccessor.client = kubeClient
|
|
||||||
quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister()
|
|
||||||
|
|
||||||
// disable consumption of cpu unless there is a covering quota.
|
// disable consumption of cpu unless there is a covering quota.
|
||||||
config := &resourcequotaapi.Configuration{
|
config := &resourcequotaapi.Configuration{
|
||||||
@ -1311,15 +1135,14 @@ func TestAdmitLimitedResourceNoQuota(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
quotaConfiguration := install.NewQuotaConfigurationForAdmission()
|
|
||||||
evaluator := NewQuotaEvaluator(quotaAccessor, quotaConfiguration.IgnoredResources(), generic.NewRegistry(quotaConfiguration.Evaluators()), nil, config, 5, stopCh)
|
|
||||||
|
|
||||||
handler := &QuotaAdmission{
|
handler, err := createHandlerWithConfig(kubeClient, informerFactory, config, stopCh)
|
||||||
Handler: admission.NewHandler(admission.Create, admission.Update),
|
if err != nil {
|
||||||
evaluator: evaluator,
|
t.Errorf("Error occurred while creating admission plugin: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
newPod := validPod("not-allowed-pod", 1, getResourceRequirements(getResourceList("3", "2Gi"), getResourceList("", "")))
|
newPod := validPod("not-allowed-pod", 1, getResourceRequirements(getResourceList("3", "2Gi"), getResourceList("", "")))
|
||||||
err := handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), newPod.Namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
err = handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), newPod.Namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Errorf("Expected an error for consuming a limited resource without quota.")
|
t.Errorf("Expected an error for consuming a limited resource without quota.")
|
||||||
}
|
}
|
||||||
@ -1331,10 +1154,7 @@ func TestAdmitLimitedResourceNoQuotaIgnoresNonMatchingResources(t *testing.T) {
|
|||||||
stopCh := make(chan struct{})
|
stopCh := make(chan struct{})
|
||||||
defer close(stopCh)
|
defer close(stopCh)
|
||||||
|
|
||||||
informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc())
|
informerFactory := informers.NewSharedInformerFactory(kubeClient, 0)
|
||||||
quotaAccessor, _ := newQuotaAccessor()
|
|
||||||
quotaAccessor.client = kubeClient
|
|
||||||
quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister()
|
|
||||||
|
|
||||||
// disable consumption of cpu unless there is a covering quota.
|
// disable consumption of cpu unless there is a covering quota.
|
||||||
config := &resourcequotaapi.Configuration{
|
config := &resourcequotaapi.Configuration{
|
||||||
@ -1345,15 +1165,14 @@ func TestAdmitLimitedResourceNoQuotaIgnoresNonMatchingResources(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
quotaConfiguration := install.NewQuotaConfigurationForAdmission()
|
|
||||||
evaluator := NewQuotaEvaluator(quotaAccessor, quotaConfiguration.IgnoredResources(), generic.NewRegistry(quotaConfiguration.Evaluators()), nil, config, 5, stopCh)
|
|
||||||
|
|
||||||
handler := &QuotaAdmission{
|
handler, err := createHandlerWithConfig(kubeClient, informerFactory, config, stopCh)
|
||||||
Handler: admission.NewHandler(admission.Create, admission.Update),
|
if err != nil {
|
||||||
evaluator: evaluator,
|
t.Errorf("Error occurred while creating admission plugin: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
newPod := validPod("allowed-pod", 1, getResourceRequirements(getResourceList("3", "2Gi"), getResourceList("", "")))
|
newPod := validPod("allowed-pod", 1, getResourceRequirements(getResourceList("3", "2Gi"), getResourceList("", "")))
|
||||||
err := handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), newPod.Namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
err = handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), newPod.Namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Unexpected error: %v", err)
|
t.Fatalf("Unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
@ -1377,10 +1196,7 @@ func TestAdmitLimitedResourceWithQuota(t *testing.T) {
|
|||||||
stopCh := make(chan struct{})
|
stopCh := make(chan struct{})
|
||||||
defer close(stopCh)
|
defer close(stopCh)
|
||||||
|
|
||||||
informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc())
|
informerFactory := informers.NewSharedInformerFactory(kubeClient, 0)
|
||||||
quotaAccessor, _ := newQuotaAccessor()
|
|
||||||
quotaAccessor.client = kubeClient
|
|
||||||
quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister()
|
|
||||||
|
|
||||||
// disable consumption of cpu unless there is a covering quota.
|
// disable consumption of cpu unless there is a covering quota.
|
||||||
// disable consumption of cpu unless there is a covering quota.
|
// disable consumption of cpu unless there is a covering quota.
|
||||||
@ -1392,16 +1208,15 @@ func TestAdmitLimitedResourceWithQuota(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
quotaConfiguration := install.NewQuotaConfigurationForAdmission()
|
|
||||||
evaluator := NewQuotaEvaluator(quotaAccessor, quotaConfiguration.IgnoredResources(), generic.NewRegistry(quotaConfiguration.Evaluators()), nil, config, 5, stopCh)
|
|
||||||
|
|
||||||
handler := &QuotaAdmission{
|
handler, err := createHandlerWithConfig(kubeClient, informerFactory, config, stopCh)
|
||||||
Handler: admission.NewHandler(admission.Create, admission.Update),
|
if err != nil {
|
||||||
evaluator: evaluator,
|
t.Errorf("Error occurred while creating admission plugin: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
indexer.Add(resourceQuota)
|
indexer.Add(resourceQuota)
|
||||||
newPod := validPod("allowed-pod", 1, getResourceRequirements(getResourceList("3", "2Gi"), getResourceList("", "")))
|
newPod := validPod("allowed-pod", 1, getResourceRequirements(getResourceList("3", "2Gi"), getResourceList("", "")))
|
||||||
err := handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), newPod.Namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
err = handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), newPod.Namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected error: %v", err)
|
t.Errorf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
@ -1436,10 +1251,7 @@ func TestAdmitLimitedResourceWithMultipleQuota(t *testing.T) {
|
|||||||
stopCh := make(chan struct{})
|
stopCh := make(chan struct{})
|
||||||
defer close(stopCh)
|
defer close(stopCh)
|
||||||
|
|
||||||
informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc())
|
informerFactory := informers.NewSharedInformerFactory(kubeClient, 0)
|
||||||
quotaAccessor, _ := newQuotaAccessor()
|
|
||||||
quotaAccessor.client = kubeClient
|
|
||||||
quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister()
|
|
||||||
|
|
||||||
// disable consumption of cpu unless there is a covering quota.
|
// disable consumption of cpu unless there is a covering quota.
|
||||||
// disable consumption of cpu unless there is a covering quota.
|
// disable consumption of cpu unless there is a covering quota.
|
||||||
@ -1451,17 +1263,16 @@ func TestAdmitLimitedResourceWithMultipleQuota(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
quotaConfiguration := install.NewQuotaConfigurationForAdmission()
|
|
||||||
evaluator := NewQuotaEvaluator(quotaAccessor, quotaConfiguration.IgnoredResources(), generic.NewRegistry(quotaConfiguration.Evaluators()), nil, config, 5, stopCh)
|
|
||||||
|
|
||||||
handler := &QuotaAdmission{
|
handler, err := createHandlerWithConfig(kubeClient, informerFactory, config, stopCh)
|
||||||
Handler: admission.NewHandler(admission.Create, admission.Update),
|
if err != nil {
|
||||||
evaluator: evaluator,
|
t.Errorf("Error occurred while creating admission plugin: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
indexer.Add(resourceQuota1)
|
indexer.Add(resourceQuota1)
|
||||||
indexer.Add(resourceQuota2)
|
indexer.Add(resourceQuota2)
|
||||||
newPod := validPod("allowed-pod", 1, getResourceRequirements(getResourceList("3", "2Gi"), getResourceList("", "")))
|
newPod := validPod("allowed-pod", 1, getResourceRequirements(getResourceList("3", "2Gi"), getResourceList("", "")))
|
||||||
err := handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), newPod.Namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
err = handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), newPod.Namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected error: %v", err)
|
t.Errorf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
@ -1485,10 +1296,7 @@ func TestAdmitLimitedResourceWithQuotaThatDoesNotCover(t *testing.T) {
|
|||||||
stopCh := make(chan struct{})
|
stopCh := make(chan struct{})
|
||||||
defer close(stopCh)
|
defer close(stopCh)
|
||||||
|
|
||||||
informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc())
|
informerFactory := informers.NewSharedInformerFactory(kubeClient, 0)
|
||||||
quotaAccessor, _ := newQuotaAccessor()
|
|
||||||
quotaAccessor.client = kubeClient
|
|
||||||
quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister()
|
|
||||||
|
|
||||||
// disable consumption of cpu unless there is a covering quota.
|
// disable consumption of cpu unless there is a covering quota.
|
||||||
// disable consumption of cpu unless there is a covering quota.
|
// disable consumption of cpu unless there is a covering quota.
|
||||||
@ -1500,16 +1308,15 @@ func TestAdmitLimitedResourceWithQuotaThatDoesNotCover(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
quotaConfiguration := install.NewQuotaConfigurationForAdmission()
|
|
||||||
evaluator := NewQuotaEvaluator(quotaAccessor, quotaConfiguration.IgnoredResources(), generic.NewRegistry(quotaConfiguration.Evaluators()), nil, config, 5, stopCh)
|
|
||||||
|
|
||||||
handler := &QuotaAdmission{
|
handler, err := createHandlerWithConfig(kubeClient, informerFactory, config, stopCh)
|
||||||
Handler: admission.NewHandler(admission.Create, admission.Update),
|
if err != nil {
|
||||||
evaluator: evaluator,
|
t.Errorf("Error occurred while creating admission plugin: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
indexer.Add(resourceQuota)
|
indexer.Add(resourceQuota)
|
||||||
newPod := validPod("not-allowed-pod", 1, getResourceRequirements(getResourceList("3", "2Gi"), getResourceList("", "")))
|
newPod := validPod("not-allowed-pod", 1, getResourceRequirements(getResourceList("3", "2Gi"), getResourceList("", "")))
|
||||||
err := handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), newPod.Namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
err = handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), newPod.Namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Fatalf("Expected an error since the quota did not cover cpu")
|
t.Fatalf("Expected an error since the quota did not cover cpu")
|
||||||
}
|
}
|
||||||
@ -2154,23 +1961,18 @@ func TestAdmitLimitedScopeWithCoverQuota(t *testing.T) {
|
|||||||
stopCh := make(chan struct{})
|
stopCh := make(chan struct{})
|
||||||
defer close(stopCh)
|
defer close(stopCh)
|
||||||
|
|
||||||
informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc())
|
informerFactory := informers.NewSharedInformerFactory(kubeClient, 0)
|
||||||
quotaAccessor, _ := newQuotaAccessor()
|
|
||||||
quotaAccessor.client = kubeClient
|
|
||||||
quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister()
|
|
||||||
|
|
||||||
quotaConfiguration := install.NewQuotaConfigurationForAdmission()
|
handler, err := createHandlerWithConfig(kubeClient, informerFactory, config, stopCh)
|
||||||
evaluator := NewQuotaEvaluator(quotaAccessor, quotaConfiguration.IgnoredResources(), generic.NewRegistry(quotaConfiguration.Evaluators()), nil, config, 5, stopCh)
|
if err != nil {
|
||||||
|
t.Errorf("Error occurred while creating admission plugin: %v", err)
|
||||||
handler := &QuotaAdmission{
|
|
||||||
Handler: admission.NewHandler(admission.Create, admission.Update),
|
|
||||||
evaluator: evaluator,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
indexer.Add(resourceQuota)
|
indexer.Add(resourceQuota)
|
||||||
if testCase.anotherQuota != nil {
|
if testCase.anotherQuota != nil {
|
||||||
indexer.Add(testCase.anotherQuota)
|
indexer.Add(testCase.anotherQuota)
|
||||||
}
|
}
|
||||||
err := handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), newPod.Namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
err = handler.Validate(context.TODO(), admission.NewAttributesRecord(newPod, nil, api.Kind("Pod").WithVersion("version"), newPod.Namespace, newPod.Name, corev1.Resource("pods").WithVersion("version"), "", admission.Create, &metav1.CreateOptions{}, false, nil), nil)
|
||||||
if testCase.expErr == "" {
|
if testCase.expErr == "" {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Testcase, %v, failed with unexpected error: %v. ExpErr: %v", testCase.description, err, testCase.expErr)
|
t.Fatalf("Testcase, %v, failed with unexpected error: %v. ExpErr: %v", testCase.description, err, testCase.expErr)
|
||||||
@ -2191,10 +1993,7 @@ func TestAdmitZeroDeltaUsageWithoutCoveringQuota(t *testing.T) {
|
|||||||
stopCh := make(chan struct{})
|
stopCh := make(chan struct{})
|
||||||
defer close(stopCh)
|
defer close(stopCh)
|
||||||
|
|
||||||
informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc())
|
informerFactory := informers.NewSharedInformerFactory(kubeClient, 0)
|
||||||
quotaAccessor, _ := newQuotaAccessor()
|
|
||||||
quotaAccessor.client = kubeClient
|
|
||||||
quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister()
|
|
||||||
|
|
||||||
// disable services unless there is a covering quota.
|
// disable services unless there is a covering quota.
|
||||||
config := &resourcequotaapi.Configuration{
|
config := &resourcequotaapi.Configuration{
|
||||||
@ -2205,12 +2004,10 @@ func TestAdmitZeroDeltaUsageWithoutCoveringQuota(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
quotaConfiguration := install.NewQuotaConfigurationForAdmission()
|
|
||||||
evaluator := NewQuotaEvaluator(quotaAccessor, quotaConfiguration.IgnoredResources(), generic.NewRegistry(quotaConfiguration.Evaluators()), nil, config, 5, stopCh)
|
|
||||||
|
|
||||||
handler := &QuotaAdmission{
|
handler, err := createHandlerWithConfig(kubeClient, informerFactory, config, stopCh)
|
||||||
Handler: admission.NewHandler(admission.Create, admission.Update),
|
if err != nil {
|
||||||
evaluator: evaluator,
|
t.Errorf("Error occurred while creating admission plugin: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
existingService := &api.Service{
|
existingService := &api.Service{
|
||||||
@ -2222,7 +2019,7 @@ func TestAdmitZeroDeltaUsageWithoutCoveringQuota(t *testing.T) {
|
|||||||
Spec: api.ServiceSpec{Type: api.ServiceTypeLoadBalancer},
|
Spec: api.ServiceSpec{Type: api.ServiceTypeLoadBalancer},
|
||||||
}
|
}
|
||||||
|
|
||||||
err := handler.Validate(context.TODO(), admission.NewAttributesRecord(newService, existingService, api.Kind("Service").WithVersion("version"), newService.Namespace, newService.Name, corev1.Resource("services").WithVersion("version"), "", admission.Update, &metav1.CreateOptions{}, false, nil), nil)
|
err = handler.Validate(context.TODO(), admission.NewAttributesRecord(newService, existingService, api.Kind("Service").WithVersion("version"), newService.Namespace, newService.Name, corev1.Resource("services").WithVersion("version"), "", admission.Update, &metav1.CreateOptions{}, false, nil), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected error: %v", err)
|
t.Errorf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
@ -2234,10 +2031,7 @@ func TestAdmitRejectIncreaseUsageWithoutCoveringQuota(t *testing.T) {
|
|||||||
stopCh := make(chan struct{})
|
stopCh := make(chan struct{})
|
||||||
defer close(stopCh)
|
defer close(stopCh)
|
||||||
|
|
||||||
informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc())
|
informerFactory := informers.NewSharedInformerFactory(kubeClient, 0)
|
||||||
quotaAccessor, _ := newQuotaAccessor()
|
|
||||||
quotaAccessor.client = kubeClient
|
|
||||||
quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister()
|
|
||||||
|
|
||||||
// disable services unless there is a covering quota.
|
// disable services unless there is a covering quota.
|
||||||
config := &resourcequotaapi.Configuration{
|
config := &resourcequotaapi.Configuration{
|
||||||
@ -2248,12 +2042,10 @@ func TestAdmitRejectIncreaseUsageWithoutCoveringQuota(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
quotaConfiguration := install.NewQuotaConfigurationForAdmission()
|
|
||||||
evaluator := NewQuotaEvaluator(quotaAccessor, quotaConfiguration.IgnoredResources(), generic.NewRegistry(quotaConfiguration.Evaluators()), nil, config, 5, stopCh)
|
|
||||||
|
|
||||||
handler := &QuotaAdmission{
|
handler, err := createHandlerWithConfig(kubeClient, informerFactory, config, stopCh)
|
||||||
Handler: admission.NewHandler(admission.Create, admission.Update),
|
if err != nil {
|
||||||
evaluator: evaluator,
|
t.Errorf("Error occurred while creating admission plugin: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
existingService := &api.Service{
|
existingService := &api.Service{
|
||||||
@ -2268,7 +2060,7 @@ func TestAdmitRejectIncreaseUsageWithoutCoveringQuota(t *testing.T) {
|
|||||||
Spec: api.ServiceSpec{Type: api.ServiceTypeLoadBalancer},
|
Spec: api.ServiceSpec{Type: api.ServiceTypeLoadBalancer},
|
||||||
}
|
}
|
||||||
|
|
||||||
err := handler.Validate(context.TODO(), admission.NewAttributesRecord(newService, existingService, api.Kind("Service").WithVersion("version"), newService.Namespace, newService.Name, corev1.Resource("services").WithVersion("version"), "", admission.Update, &metav1.UpdateOptions{}, false, nil), nil)
|
err = handler.Validate(context.TODO(), admission.NewAttributesRecord(newService, existingService, api.Kind("Service").WithVersion("version"), newService.Namespace, newService.Name, corev1.Resource("services").WithVersion("version"), "", admission.Update, &metav1.UpdateOptions{}, false, nil), nil)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Errorf("Expected an error for consuming a limited resource without quota.")
|
t.Errorf("Expected an error for consuming a limited resource without quota.")
|
||||||
}
|
}
|
||||||
@ -2280,10 +2072,7 @@ func TestAdmitAllowDecreaseUsageWithoutCoveringQuota(t *testing.T) {
|
|||||||
stopCh := make(chan struct{})
|
stopCh := make(chan struct{})
|
||||||
defer close(stopCh)
|
defer close(stopCh)
|
||||||
|
|
||||||
informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc())
|
informerFactory := informers.NewSharedInformerFactory(kubeClient, 0)
|
||||||
quotaAccessor, _ := newQuotaAccessor()
|
|
||||||
quotaAccessor.client = kubeClient
|
|
||||||
quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister()
|
|
||||||
|
|
||||||
// disable services unless there is a covering quota.
|
// disable services unless there is a covering quota.
|
||||||
config := &resourcequotaapi.Configuration{
|
config := &resourcequotaapi.Configuration{
|
||||||
@ -2294,12 +2083,10 @@ func TestAdmitAllowDecreaseUsageWithoutCoveringQuota(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
quotaConfiguration := install.NewQuotaConfigurationForAdmission()
|
|
||||||
evaluator := NewQuotaEvaluator(quotaAccessor, quotaConfiguration.IgnoredResources(), generic.NewRegistry(quotaConfiguration.Evaluators()), nil, config, 5, stopCh)
|
|
||||||
|
|
||||||
handler := &QuotaAdmission{
|
handler, err := createHandlerWithConfig(kubeClient, informerFactory, config, stopCh)
|
||||||
Handler: admission.NewHandler(admission.Create, admission.Update),
|
if err != nil {
|
||||||
evaluator: evaluator,
|
t.Errorf("Error occurred while creating admission plugin: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
existingService := &api.Service{
|
existingService := &api.Service{
|
||||||
@ -2314,7 +2101,8 @@ func TestAdmitAllowDecreaseUsageWithoutCoveringQuota(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
err := handler.Validate(context.TODO(), admission.NewAttributesRecord(newService, existingService, api.Kind("Service").WithVersion("version"), newService.Namespace, newService.Name, corev1.Resource("services").WithVersion("version"), "", admission.Update, &metav1.UpdateOptions{}, false, nil), nil)
|
err = handler.Validate(context.TODO(), admission.NewAttributesRecord(newService, existingService, api.Kind("Service").WithVersion("version"), newService.Namespace, newService.Name, corev1.Resource("services").WithVersion("version"), "", admission.Update, &metav1.UpdateOptions{}, false, nil), nil)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("Expected no error for decreasing a limited resource without quota, got %v", err)
|
t.Errorf("Expected no error for decreasing a limited resource without quota, got %v", err)
|
||||||
}
|
}
|
||||||
|
@ -1,33 +0,0 @@
|
|||||||
package(default_visibility = ["//visibility:public"])
|
|
||||||
|
|
||||||
load(
|
|
||||||
"@io_bazel_rules_go//go:def.bzl",
|
|
||||||
"go_library",
|
|
||||||
)
|
|
||||||
|
|
||||||
go_library(
|
|
||||||
name = "go_default_library",
|
|
||||||
srcs = ["install.go"],
|
|
||||||
importpath = "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota/install",
|
|
||||||
deps = [
|
|
||||||
"//plugin/pkg/admission/resourcequota/apis/resourcequota:go_default_library",
|
|
||||||
"//plugin/pkg/admission/resourcequota/apis/resourcequota/v1:go_default_library",
|
|
||||||
"//plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1:go_default_library",
|
|
||||||
"//plugin/pkg/admission/resourcequota/apis/resourcequota/v1beta1:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
|
|
||||||
],
|
|
||||||
)
|
|
||||||
|
|
||||||
filegroup(
|
|
||||||
name = "package-srcs",
|
|
||||||
srcs = glob(["**"]),
|
|
||||||
tags = ["automanaged"],
|
|
||||||
visibility = ["//visibility:private"],
|
|
||||||
)
|
|
||||||
|
|
||||||
filegroup(
|
|
||||||
name = "all-srcs",
|
|
||||||
srcs = [":package-srcs"],
|
|
||||||
tags = ["automanaged"],
|
|
||||||
)
|
|
@ -38,6 +38,7 @@ filegroup(
|
|||||||
"//staging/src/k8s.io/apiserver/pkg/authorization/union:all-srcs",
|
"//staging/src/k8s.io/apiserver/pkg/authorization/union:all-srcs",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/endpoints:all-srcs",
|
"//staging/src/k8s.io/apiserver/pkg/endpoints:all-srcs",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/features:all-srcs",
|
"//staging/src/k8s.io/apiserver/pkg/features:all-srcs",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/quota/v1:all-srcs",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/registry:all-srcs",
|
"//staging/src/k8s.io/apiserver/pkg/registry:all-srcs",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/server:all-srcs",
|
"//staging/src/k8s.io/apiserver/pkg/server:all-srcs",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/storage:all-srcs",
|
"//staging/src/k8s.io/apiserver/pkg/storage:all-srcs",
|
||||||
|
@ -77,6 +77,7 @@ filegroup(
|
|||||||
"//staging/src/k8s.io/apiserver/pkg/admission/initializer:all-srcs",
|
"//staging/src/k8s.io/apiserver/pkg/admission/initializer:all-srcs",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/admission/metrics:all-srcs",
|
"//staging/src/k8s.io/apiserver/pkg/admission/metrics:all-srcs",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle:all-srcs",
|
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle:all-srcs",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota:all-srcs",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook:all-srcs",
|
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook:all-srcs",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/admission/testing:all-srcs",
|
"//staging/src/k8s.io/apiserver/pkg/admission/testing:all-srcs",
|
||||||
],
|
],
|
||||||
|
@ -17,6 +17,7 @@ go_library(
|
|||||||
deps = [
|
deps = [
|
||||||
"//staging/src/k8s.io/apiserver/pkg/admission:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/admission:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/quota/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/informers:go_default_library",
|
"//staging/src/k8s.io/client-go/informers:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
||||||
"//staging/src/k8s.io/component-base/featuregate:go_default_library",
|
"//staging/src/k8s.io/component-base/featuregate:go_default_library",
|
||||||
|
@ -19,6 +19,7 @@ package initializer
|
|||||||
import (
|
import (
|
||||||
"k8s.io/apiserver/pkg/admission"
|
"k8s.io/apiserver/pkg/admission"
|
||||||
"k8s.io/apiserver/pkg/authorization/authorizer"
|
"k8s.io/apiserver/pkg/authorization/authorizer"
|
||||||
|
quota "k8s.io/apiserver/pkg/quota/v1"
|
||||||
"k8s.io/client-go/informers"
|
"k8s.io/client-go/informers"
|
||||||
"k8s.io/client-go/kubernetes"
|
"k8s.io/client-go/kubernetes"
|
||||||
"k8s.io/component-base/featuregate"
|
"k8s.io/component-base/featuregate"
|
||||||
@ -42,6 +43,12 @@ type WantsAuthorizer interface {
|
|||||||
admission.InitializationValidator
|
admission.InitializationValidator
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WantsQuotaConfiguration defines a function which sets quota configuration for admission plugins that need it.
|
||||||
|
type WantsQuotaConfiguration interface {
|
||||||
|
SetQuotaConfiguration(quota.Configuration)
|
||||||
|
admission.InitializationValidator
|
||||||
|
}
|
||||||
|
|
||||||
// WantsFeatureGate defines a function which passes the featureGates for inspection by an admission plugin.
|
// WantsFeatureGate defines a function which passes the featureGates for inspection by an admission plugin.
|
||||||
// Admission plugins should not hold a reference to the featureGates. Instead, they should query a particular one
|
// Admission plugins should not hold a reference to the featureGates. Instead, they should query a particular one
|
||||||
// and assign it to a simple bool in the admission plugin struct.
|
// and assign it to a simple bool in the admission plugin struct.
|
||||||
|
@ -0,0 +1,83 @@
|
|||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
|
"go_library",
|
||||||
|
"go_test",
|
||||||
|
)
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = [
|
||||||
|
"admission.go",
|
||||||
|
"config.go",
|
||||||
|
"controller.go",
|
||||||
|
"doc.go",
|
||||||
|
"resource_access.go",
|
||||||
|
],
|
||||||
|
importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota",
|
||||||
|
importpath = "k8s.io/apiserver/pkg/admission/plugin/resourcequota",
|
||||||
|
deps = [
|
||||||
|
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/admission:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/install:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/validation:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/quota/v1:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/quota/v1/generic:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/storage/etcd3:go_default_library",
|
||||||
|
"//staging/src/k8s.io/client-go/informers:go_default_library",
|
||||||
|
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
||||||
|
"//staging/src/k8s.io/client-go/listers/core/v1:go_default_library",
|
||||||
|
"//staging/src/k8s.io/client-go/util/workqueue:go_default_library",
|
||||||
|
"//vendor/github.com/hashicorp/golang-lru:go_default_library",
|
||||||
|
"//vendor/k8s.io/klog/v2:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
go_test(
|
||||||
|
name = "go_default_test",
|
||||||
|
srcs = [
|
||||||
|
"admission_test.go",
|
||||||
|
"config_test.go",
|
||||||
|
"resource_access_test.go",
|
||||||
|
],
|
||||||
|
embed = [":go_default_library"],
|
||||||
|
deps = [
|
||||||
|
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota:go_default_library",
|
||||||
|
"//staging/src/k8s.io/client-go/informers:go_default_library",
|
||||||
|
"//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library",
|
||||||
|
"//vendor/github.com/hashicorp/golang-lru:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [
|
||||||
|
":package-srcs",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota:all-srcs",
|
||||||
|
],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
)
|
@ -25,13 +25,12 @@ import (
|
|||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
"k8s.io/apiserver/pkg/admission"
|
"k8s.io/apiserver/pkg/admission"
|
||||||
genericadmissioninitializer "k8s.io/apiserver/pkg/admission/initializer"
|
genericadmissioninitializer "k8s.io/apiserver/pkg/admission/initializer"
|
||||||
|
resourcequotaapi "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota"
|
||||||
|
"k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/validation"
|
||||||
|
quota "k8s.io/apiserver/pkg/quota/v1"
|
||||||
|
"k8s.io/apiserver/pkg/quota/v1/generic"
|
||||||
"k8s.io/client-go/informers"
|
"k8s.io/client-go/informers"
|
||||||
"k8s.io/client-go/kubernetes"
|
"k8s.io/client-go/kubernetes"
|
||||||
kubeapiserveradmission "k8s.io/kubernetes/pkg/kubeapiserver/admission"
|
|
||||||
quota "k8s.io/kubernetes/pkg/quota/v1"
|
|
||||||
"k8s.io/kubernetes/pkg/quota/v1/generic"
|
|
||||||
resourcequotaapi "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota"
|
|
||||||
"k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota/validation"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// PluginName is a string with the name of the plugin
|
// PluginName is a string with the name of the plugin
|
||||||
@ -70,7 +69,7 @@ type QuotaAdmission struct {
|
|||||||
var _ admission.ValidationInterface = &QuotaAdmission{}
|
var _ admission.ValidationInterface = &QuotaAdmission{}
|
||||||
var _ = genericadmissioninitializer.WantsExternalKubeInformerFactory(&QuotaAdmission{})
|
var _ = genericadmissioninitializer.WantsExternalKubeInformerFactory(&QuotaAdmission{})
|
||||||
var _ = genericadmissioninitializer.WantsExternalKubeClientSet(&QuotaAdmission{})
|
var _ = genericadmissioninitializer.WantsExternalKubeClientSet(&QuotaAdmission{})
|
||||||
var _ = kubeapiserveradmission.WantsQuotaConfiguration(&QuotaAdmission{})
|
var _ = genericadmissioninitializer.WantsQuotaConfiguration(&QuotaAdmission{})
|
||||||
|
|
||||||
type liveLookupEntry struct {
|
type liveLookupEntry struct {
|
||||||
expiry time.Time
|
expiry time.Time
|
@ -0,0 +1,124 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2020 The Kubernetes Authors.
|
||||||
|
|
||||||
|
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 resourcequota
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
corev1 "k8s.io/api/core/v1"
|
||||||
|
"k8s.io/apimachinery/pkg/api/resource"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPrettyPrint(t *testing.T) {
|
||||||
|
toResourceList := func(resources map[corev1.ResourceName]string) corev1.ResourceList {
|
||||||
|
resourceList := corev1.ResourceList{}
|
||||||
|
for key, value := range resources {
|
||||||
|
resourceList[key] = resource.MustParse(value)
|
||||||
|
}
|
||||||
|
return resourceList
|
||||||
|
}
|
||||||
|
testCases := []struct {
|
||||||
|
input corev1.ResourceList
|
||||||
|
expected string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
input: toResourceList(map[corev1.ResourceName]string{
|
||||||
|
corev1.ResourceCPU: "100m",
|
||||||
|
}),
|
||||||
|
expected: "cpu=100m",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: toResourceList(map[corev1.ResourceName]string{
|
||||||
|
corev1.ResourcePods: "10",
|
||||||
|
corev1.ResourceServices: "10",
|
||||||
|
corev1.ResourceReplicationControllers: "10",
|
||||||
|
corev1.ResourceServicesNodePorts: "10",
|
||||||
|
corev1.ResourceRequestsCPU: "100m",
|
||||||
|
corev1.ResourceRequestsMemory: "100Mi",
|
||||||
|
corev1.ResourceLimitsCPU: "100m",
|
||||||
|
corev1.ResourceLimitsMemory: "100Mi",
|
||||||
|
}),
|
||||||
|
expected: "limits.cpu=100m,limits.memory=100Mi,pods=10,replicationcontrollers=10,requests.cpu=100m,requests.memory=100Mi,services=10,services.nodeports=10",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for i, testCase := range testCases {
|
||||||
|
result := prettyPrint(testCase.input)
|
||||||
|
if result != testCase.expected {
|
||||||
|
t.Errorf("Pretty print did not give stable sorted output[%d], expected %v, but got %v", i, testCase.expected, result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestHasUsageStats(t *testing.T) {
|
||||||
|
testCases := map[string]struct {
|
||||||
|
a corev1.ResourceQuota
|
||||||
|
relevant []corev1.ResourceName
|
||||||
|
expected bool
|
||||||
|
}{
|
||||||
|
"empty": {
|
||||||
|
a: corev1.ResourceQuota{Status: corev1.ResourceQuotaStatus{Hard: corev1.ResourceList{}}},
|
||||||
|
relevant: []corev1.ResourceName{corev1.ResourceMemory},
|
||||||
|
expected: true,
|
||||||
|
},
|
||||||
|
"hard-only": {
|
||||||
|
a: corev1.ResourceQuota{
|
||||||
|
Status: corev1.ResourceQuotaStatus{
|
||||||
|
Hard: corev1.ResourceList{
|
||||||
|
corev1.ResourceMemory: resource.MustParse("1Gi"),
|
||||||
|
},
|
||||||
|
Used: corev1.ResourceList{},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
relevant: []corev1.ResourceName{corev1.ResourceMemory},
|
||||||
|
expected: false,
|
||||||
|
},
|
||||||
|
"hard-used": {
|
||||||
|
a: corev1.ResourceQuota{
|
||||||
|
Status: corev1.ResourceQuotaStatus{
|
||||||
|
Hard: corev1.ResourceList{
|
||||||
|
corev1.ResourceMemory: resource.MustParse("1Gi"),
|
||||||
|
},
|
||||||
|
Used: corev1.ResourceList{
|
||||||
|
corev1.ResourceMemory: resource.MustParse("500Mi"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
relevant: []corev1.ResourceName{corev1.ResourceMemory},
|
||||||
|
expected: true,
|
||||||
|
},
|
||||||
|
"hard-used-relevant": {
|
||||||
|
a: corev1.ResourceQuota{
|
||||||
|
Status: corev1.ResourceQuotaStatus{
|
||||||
|
Hard: corev1.ResourceList{
|
||||||
|
corev1.ResourceMemory: resource.MustParse("1Gi"),
|
||||||
|
corev1.ResourcePods: resource.MustParse("1"),
|
||||||
|
},
|
||||||
|
Used: corev1.ResourceList{
|
||||||
|
corev1.ResourceMemory: resource.MustParse("500Mi"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
relevant: []corev1.ResourceName{corev1.ResourceMemory},
|
||||||
|
expected: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for testName, testCase := range testCases {
|
||||||
|
if result := hasUsageStats(&testCase.a, testCase.relevant); result != testCase.expected {
|
||||||
|
t.Errorf("%s expected: %v, actual: %v", testName, testCase.expected, result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -13,7 +13,8 @@ go_library(
|
|||||||
"types.go",
|
"types.go",
|
||||||
"zz_generated.deepcopy.go",
|
"zz_generated.deepcopy.go",
|
||||||
],
|
],
|
||||||
importpath = "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota",
|
importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota",
|
||||||
|
importpath = "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota",
|
||||||
deps = [
|
deps = [
|
||||||
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
@ -33,11 +34,11 @@ filegroup(
|
|||||||
name = "all-srcs",
|
name = "all-srcs",
|
||||||
srcs = [
|
srcs = [
|
||||||
":package-srcs",
|
":package-srcs",
|
||||||
"//plugin/pkg/admission/resourcequota/apis/resourcequota/install:all-srcs",
|
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/install:all-srcs",
|
||||||
"//plugin/pkg/admission/resourcequota/apis/resourcequota/v1:all-srcs",
|
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1:all-srcs",
|
||||||
"//plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1:all-srcs",
|
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1:all-srcs",
|
||||||
"//plugin/pkg/admission/resourcequota/apis/resourcequota/v1beta1:all-srcs",
|
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1:all-srcs",
|
||||||
"//plugin/pkg/admission/resourcequota/apis/resourcequota/validation:all-srcs",
|
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/validation:all-srcs",
|
||||||
],
|
],
|
||||||
tags = ["automanaged"],
|
tags = ["automanaged"],
|
||||||
)
|
)
|
@ -16,4 +16,4 @@ limitations under the License.
|
|||||||
|
|
||||||
// +k8s:deepcopy-gen=package
|
// +k8s:deepcopy-gen=package
|
||||||
|
|
||||||
package resourcequota // import "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota"
|
package resourcequota // import "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota"
|
@ -0,0 +1,34 @@
|
|||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
|
"go_library",
|
||||||
|
)
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = ["install.go"],
|
||||||
|
importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/install",
|
||||||
|
importpath = "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/install",
|
||||||
|
deps = [
|
||||||
|
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [":package-srcs"],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
)
|
@ -21,10 +21,10 @@ package install
|
|||||||
import (
|
import (
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
||||||
resourcequotaapi "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota"
|
resourcequotaapi "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota"
|
||||||
resourcequotav1 "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota/v1"
|
resourcequotav1 "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1"
|
||||||
resourcequotav1alpha1 "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1"
|
resourcequotav1alpha1 "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1"
|
||||||
resourcequotav1beta1 "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota/v1beta1"
|
resourcequotav1beta1 "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Install registers the API group and adds types to a scheme
|
// Install registers the API group and adds types to a scheme
|
@ -16,14 +16,15 @@ go_library(
|
|||||||
"zz_generated.deepcopy.go",
|
"zz_generated.deepcopy.go",
|
||||||
"zz_generated.defaults.go",
|
"zz_generated.defaults.go",
|
||||||
],
|
],
|
||||||
importpath = "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota/v1beta1",
|
importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1",
|
||||||
|
importpath = "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1",
|
||||||
deps = [
|
deps = [
|
||||||
"//plugin/pkg/admission/resourcequota/apis/resourcequota:go_default_library",
|
|
||||||
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
@ -15,9 +15,9 @@ limitations under the License.
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// +k8s:deepcopy-gen=package
|
// +k8s:deepcopy-gen=package
|
||||||
// +k8s:conversion-gen=k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota
|
// +k8s:conversion-gen=k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota
|
||||||
// +k8s:defaulter-gen=TypeMeta
|
// +k8s:defaulter-gen=TypeMeta
|
||||||
// +groupName=resourcequota.admission.k8s.io
|
// +groupName=resourcequota.admission.k8s.io
|
||||||
|
|
||||||
// Package v1 is the v1 version of the API.
|
// Package v1 is the v1 version of the API.
|
||||||
package v1 // import "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota/v1"
|
package v1 // import "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1"
|
@ -26,7 +26,7 @@ import (
|
|||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
conversion "k8s.io/apimachinery/pkg/conversion"
|
conversion "k8s.io/apimachinery/pkg/conversion"
|
||||||
runtime "k8s.io/apimachinery/pkg/runtime"
|
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||||
resourcequota "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota"
|
resourcequota "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
@ -16,14 +16,15 @@ go_library(
|
|||||||
"zz_generated.deepcopy.go",
|
"zz_generated.deepcopy.go",
|
||||||
"zz_generated.defaults.go",
|
"zz_generated.defaults.go",
|
||||||
],
|
],
|
||||||
importpath = "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1",
|
importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1",
|
||||||
|
importpath = "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1",
|
||||||
deps = [
|
deps = [
|
||||||
"//plugin/pkg/admission/resourcequota/apis/resourcequota:go_default_library",
|
|
||||||
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
@ -15,9 +15,9 @@ limitations under the License.
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// +k8s:deepcopy-gen=package
|
// +k8s:deepcopy-gen=package
|
||||||
// +k8s:conversion-gen=k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota
|
// +k8s:conversion-gen=k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota
|
||||||
// +k8s:defaulter-gen=TypeMeta
|
// +k8s:defaulter-gen=TypeMeta
|
||||||
// +groupName=resourcequota.admission.k8s.io
|
// +groupName=resourcequota.admission.k8s.io
|
||||||
|
|
||||||
// Package v1alpha1 is the v1alpha1 version of the API.
|
// Package v1alpha1 is the v1alpha1 version of the API.
|
||||||
package v1alpha1 // import "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1"
|
package v1alpha1 // import "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1"
|
@ -26,7 +26,7 @@ import (
|
|||||||
v1 "k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
conversion "k8s.io/apimachinery/pkg/conversion"
|
conversion "k8s.io/apimachinery/pkg/conversion"
|
||||||
runtime "k8s.io/apimachinery/pkg/runtime"
|
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||||
resourcequota "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota"
|
resourcequota "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
@ -16,14 +16,15 @@ go_library(
|
|||||||
"zz_generated.deepcopy.go",
|
"zz_generated.deepcopy.go",
|
||||||
"zz_generated.defaults.go",
|
"zz_generated.defaults.go",
|
||||||
],
|
],
|
||||||
importpath = "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota/v1",
|
importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1",
|
||||||
|
importpath = "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1",
|
||||||
deps = [
|
deps = [
|
||||||
"//plugin/pkg/admission/resourcequota/apis/resourcequota:go_default_library",
|
|
||||||
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
@ -15,9 +15,9 @@ limitations under the License.
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// +k8s:deepcopy-gen=package
|
// +k8s:deepcopy-gen=package
|
||||||
// +k8s:conversion-gen=k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota
|
// +k8s:conversion-gen=k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota
|
||||||
// +k8s:defaulter-gen=TypeMeta
|
// +k8s:defaulter-gen=TypeMeta
|
||||||
// +groupName=resourcequota.admission.k8s.io
|
// +groupName=resourcequota.admission.k8s.io
|
||||||
|
|
||||||
// Package v1beta1 is the v1beta1 version of the API.
|
// Package v1beta1 is the v1beta1 version of the API.
|
||||||
package v1beta1 // import "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota/v1beta1"
|
package v1beta1 // import "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1"
|
@ -26,7 +26,7 @@ import (
|
|||||||
v1 "k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
conversion "k8s.io/apimachinery/pkg/conversion"
|
conversion "k8s.io/apimachinery/pkg/conversion"
|
||||||
runtime "k8s.io/apimachinery/pkg/runtime"
|
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||||
resourcequota "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota"
|
resourcequota "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
@ -9,10 +9,11 @@ load(
|
|||||||
go_library(
|
go_library(
|
||||||
name = "go_default_library",
|
name = "go_default_library",
|
||||||
srcs = ["validation.go"],
|
srcs = ["validation.go"],
|
||||||
importpath = "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota/validation",
|
importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/validation",
|
||||||
|
importpath = "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/validation",
|
||||||
deps = [
|
deps = [
|
||||||
"//plugin/pkg/admission/resourcequota/apis/resourcequota:go_default_library",
|
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -33,5 +34,5 @@ go_test(
|
|||||||
name = "go_default_test",
|
name = "go_default_test",
|
||||||
srcs = ["validation_test.go"],
|
srcs = ["validation_test.go"],
|
||||||
embed = [":go_default_library"],
|
embed = [":go_default_library"],
|
||||||
deps = ["//plugin/pkg/admission/resourcequota/apis/resourcequota:go_default_library"],
|
deps = ["//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota:go_default_library"],
|
||||||
)
|
)
|
@ -17,9 +17,9 @@ limitations under the License.
|
|||||||
package validation
|
package validation
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
resourcequotaapi "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota"
|
||||||
|
|
||||||
resourcequotaapi "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota"
|
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ValidateConfiguration validates the configuration.
|
// ValidateConfiguration validates the configuration.
|
@ -19,7 +19,7 @@ package validation
|
|||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
resourcequotaapi "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota"
|
resourcequotaapi "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestValidateConfiguration(t *testing.T) {
|
func TestValidateConfiguration(t *testing.T) {
|
@ -23,9 +23,9 @@ import (
|
|||||||
|
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apimachinery/pkg/runtime/serializer"
|
"k8s.io/apimachinery/pkg/runtime/serializer"
|
||||||
resourcequotaapi "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota"
|
resourcequotaapi "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota"
|
||||||
"k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota/install"
|
"k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/install"
|
||||||
resourcequotav1 "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota/v1"
|
resourcequotav1 "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
@ -23,7 +23,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
resourcequotaapi "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota"
|
resourcequotaapi "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestLoadConfiguration(t *testing.T) {
|
func TestLoadConfiguration(t *testing.T) {
|
@ -34,10 +34,10 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
"k8s.io/apimachinery/pkg/util/wait"
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
"k8s.io/apiserver/pkg/admission"
|
"k8s.io/apiserver/pkg/admission"
|
||||||
|
resourcequotaapi "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota"
|
||||||
|
quota "k8s.io/apiserver/pkg/quota/v1"
|
||||||
|
"k8s.io/apiserver/pkg/quota/v1/generic"
|
||||||
"k8s.io/client-go/util/workqueue"
|
"k8s.io/client-go/util/workqueue"
|
||||||
quota "k8s.io/kubernetes/pkg/quota/v1"
|
|
||||||
"k8s.io/kubernetes/pkg/quota/v1/generic"
|
|
||||||
resourcequotaapi "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Evaluator is used to see if quota constraints are satisfied.
|
// Evaluator is used to see if quota constraints are satisfied.
|
@ -16,4 +16,4 @@ limitations under the License.
|
|||||||
|
|
||||||
// Package resourcequota enforces all incoming requests against any applied quota
|
// Package resourcequota enforces all incoming requests against any applied quota
|
||||||
// in the namespace context of the request
|
// in the namespace context of the request
|
||||||
package resourcequota // import "k8s.io/kubernetes/plugin/pkg/admission/resourcequota"
|
package resourcequota // import "k8s.io/apiserver/pkg/admission/plugin/resourcequota"
|
@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2020 The Kubernetes Authors.
|
||||||
|
|
||||||
|
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 resourcequota
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
|
||||||
|
lru "github.com/hashicorp/golang-lru"
|
||||||
|
corev1 "k8s.io/api/core/v1"
|
||||||
|
"k8s.io/client-go/informers"
|
||||||
|
"k8s.io/client-go/kubernetes/fake"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestLRUCacheLookup(t *testing.T) {
|
||||||
|
liveLookupCache, err := lru.New(100)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
kubeClient := fake.NewSimpleClientset()
|
||||||
|
informerFactory := informers.NewSharedInformerFactory(kubeClient, 0)
|
||||||
|
|
||||||
|
accessor, _ := newQuotaAccessor()
|
||||||
|
accessor.client = kubeClient
|
||||||
|
accessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister()
|
||||||
|
accessor.liveLookupCache = liveLookupCache
|
||||||
|
|
||||||
|
namespace := "foo"
|
||||||
|
resourceQuota := &corev1.ResourceQuota{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: "foo",
|
||||||
|
Namespace: namespace,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
liveLookupCache.Add(resourceQuota.Namespace, liveLookupEntry{expiry: time.Now().Add(30 * time.Second), items: []*corev1.ResourceQuota{
|
||||||
|
resourceQuota,
|
||||||
|
}})
|
||||||
|
|
||||||
|
quotas, err := accessor.GetQuotas(resourceQuota.Namespace)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Unexpected error: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if count := len(quotas); count != 1 {
|
||||||
|
t.Errorf("Expected 1 object but got %d", count)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !reflect.DeepEqual(quotas[0], *resourceQuota) {
|
||||||
|
t.Errorf("Retrieved object does not match")
|
||||||
|
}
|
||||||
|
}
|
53
staging/src/k8s.io/apiserver/pkg/quota/v1/BUILD
Normal file
53
staging/src/k8s.io/apiserver/pkg/quota/v1/BUILD
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
|
||||||
|
load(
|
||||||
|
"@io_bazel_rules_go//go:def.bzl",
|
||||||
|
"go_library",
|
||||||
|
"go_test",
|
||||||
|
)
|
||||||
|
|
||||||
|
go_library(
|
||||||
|
name = "go_default_library",
|
||||||
|
srcs = [
|
||||||
|
"interfaces.go",
|
||||||
|
"resources.go",
|
||||||
|
],
|
||||||
|
importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/quota/v1",
|
||||||
|
importpath = "k8s.io/apiserver/pkg/quota/v1",
|
||||||
|
deps = [
|
||||||
|
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/admission:go_default_library",
|
||||||
|
"//staging/src/k8s.io/client-go/tools/cache:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
go_test(
|
||||||
|
name = "go_default_test",
|
||||||
|
srcs = ["resources_test.go"],
|
||||||
|
embed = [":go_default_library"],
|
||||||
|
deps = [
|
||||||
|
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "package-srcs",
|
||||||
|
srcs = glob(["**"]),
|
||||||
|
tags = ["automanaged"],
|
||||||
|
visibility = ["//visibility:private"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "all-srcs",
|
||||||
|
srcs = [
|
||||||
|
":package-srcs",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/quota/v1/generic:all-srcs",
|
||||||
|
],
|
||||||
|
tags = ["automanaged"],
|
||||||
|
)
|
13
staging/src/k8s.io/apiserver/pkg/quota/v1/OWNERS
Normal file
13
staging/src/k8s.io/apiserver/pkg/quota/v1/OWNERS
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
# See the OWNERS docs at https://go.k8s.io/owners
|
||||||
|
|
||||||
|
approvers:
|
||||||
|
- deads2k
|
||||||
|
- derekwaynecarr
|
||||||
|
- vishh
|
||||||
|
reviewers:
|
||||||
|
- deads2k
|
||||||
|
- derekwaynecarr
|
||||||
|
- smarterclayton
|
||||||
|
- vishh
|
||||||
|
labels:
|
||||||
|
- sig/api-machinery
|
@ -9,15 +9,16 @@ go_library(
|
|||||||
"evaluator.go",
|
"evaluator.go",
|
||||||
"registry.go",
|
"registry.go",
|
||||||
],
|
],
|
||||||
importpath = "k8s.io/kubernetes/pkg/quota/v1/generic",
|
importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/quota/v1/generic",
|
||||||
|
importpath = "k8s.io/apiserver/pkg/quota/v1/generic",
|
||||||
deps = [
|
deps = [
|
||||||
"//pkg/quota/v1:go_default_library",
|
|
||||||
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/admission:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/admission:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/quota/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/informers:go_default_library",
|
"//staging/src/k8s.io/client-go/informers:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/tools/cache:go_default_library",
|
"//staging/src/k8s.io/client-go/tools/cache:go_default_library",
|
||||||
],
|
],
|
@ -18,7 +18,7 @@ package generic
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
quota "k8s.io/kubernetes/pkg/quota/v1"
|
quota "k8s.io/apiserver/pkg/quota/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
// implements a basic configuration
|
// implements a basic configuration
|
@ -26,9 +26,9 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
"k8s.io/apiserver/pkg/admission"
|
"k8s.io/apiserver/pkg/admission"
|
||||||
|
quota "k8s.io/apiserver/pkg/quota/v1"
|
||||||
"k8s.io/client-go/informers"
|
"k8s.io/client-go/informers"
|
||||||
"k8s.io/client-go/tools/cache"
|
"k8s.io/client-go/tools/cache"
|
||||||
quota "k8s.io/kubernetes/pkg/quota/v1"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// InformerForResourceFunc knows how to provision an informer
|
// InformerForResourceFunc knows how to provision an informer
|
@ -20,7 +20,7 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
quota "k8s.io/kubernetes/pkg/quota/v1"
|
quota "k8s.io/apiserver/pkg/quota/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
// implements a basic registry
|
// implements a basic registry
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package quota
|
package v1
|
||||||
|
|
||||||
import (
|
import (
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package quota
|
package v1
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"sort"
|
"sort"
|
@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package quota
|
package v1
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"reflect"
|
"reflect"
|
@ -17,10 +17,7 @@ go_test(
|
|||||||
"//pkg/controller:go_default_library",
|
"//pkg/controller:go_default_library",
|
||||||
"//pkg/controller/replication:go_default_library",
|
"//pkg/controller/replication:go_default_library",
|
||||||
"//pkg/controller/resourcequota:go_default_library",
|
"//pkg/controller/resourcequota:go_default_library",
|
||||||
"//pkg/quota/v1/generic:go_default_library",
|
|
||||||
"//pkg/quota/v1/install:go_default_library",
|
"//pkg/quota/v1/install:go_default_library",
|
||||||
"//plugin/pkg/admission/resourcequota:go_default_library",
|
|
||||||
"//plugin/pkg/admission/resourcequota/apis/resourcequota:go_default_library",
|
|
||||||
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
@ -29,6 +26,9 @@ go_test(
|
|||||||
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/quota/v1/generic:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/informers:go_default_library",
|
"//staging/src/k8s.io/client-go/informers:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
|
||||||
"//staging/src/k8s.io/client-go/rest:go_default_library",
|
"//staging/src/k8s.io/client-go/rest:go_default_library",
|
||||||
|
@ -24,7 +24,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
"k8s.io/apimachinery/pkg/api/resource"
|
"k8s.io/apimachinery/pkg/api/resource"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/fields"
|
"k8s.io/apimachinery/pkg/fields"
|
||||||
@ -32,6 +32,9 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
"k8s.io/apimachinery/pkg/util/wait"
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
"k8s.io/apimachinery/pkg/watch"
|
"k8s.io/apimachinery/pkg/watch"
|
||||||
|
"k8s.io/apiserver/pkg/admission/plugin/resourcequota"
|
||||||
|
resourcequotaapi "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota"
|
||||||
|
"k8s.io/apiserver/pkg/quota/v1/generic"
|
||||||
"k8s.io/client-go/informers"
|
"k8s.io/client-go/informers"
|
||||||
clientset "k8s.io/client-go/kubernetes"
|
clientset "k8s.io/client-go/kubernetes"
|
||||||
restclient "k8s.io/client-go/rest"
|
restclient "k8s.io/client-go/rest"
|
||||||
@ -40,10 +43,7 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/controller"
|
"k8s.io/kubernetes/pkg/controller"
|
||||||
replicationcontroller "k8s.io/kubernetes/pkg/controller/replication"
|
replicationcontroller "k8s.io/kubernetes/pkg/controller/replication"
|
||||||
resourcequotacontroller "k8s.io/kubernetes/pkg/controller/resourcequota"
|
resourcequotacontroller "k8s.io/kubernetes/pkg/controller/resourcequota"
|
||||||
"k8s.io/kubernetes/pkg/quota/v1/generic"
|
|
||||||
quotainstall "k8s.io/kubernetes/pkg/quota/v1/install"
|
quotainstall "k8s.io/kubernetes/pkg/quota/v1/install"
|
||||||
"k8s.io/kubernetes/plugin/pkg/admission/resourcequota"
|
|
||||||
resourcequotaapi "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota"
|
|
||||||
"k8s.io/kubernetes/test/integration/framework"
|
"k8s.io/kubernetes/test/integration/framework"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
9
vendor/modules.txt
vendored
9
vendor/modules.txt
vendored
@ -1715,6 +1715,13 @@ k8s.io/apiserver/pkg/admission/configuration
|
|||||||
k8s.io/apiserver/pkg/admission/initializer
|
k8s.io/apiserver/pkg/admission/initializer
|
||||||
k8s.io/apiserver/pkg/admission/metrics
|
k8s.io/apiserver/pkg/admission/metrics
|
||||||
k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle
|
k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle
|
||||||
|
k8s.io/apiserver/pkg/admission/plugin/resourcequota
|
||||||
|
k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota
|
||||||
|
k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/install
|
||||||
|
k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1
|
||||||
|
k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1
|
||||||
|
k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1
|
||||||
|
k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/validation
|
||||||
k8s.io/apiserver/pkg/admission/plugin/webhook
|
k8s.io/apiserver/pkg/admission/plugin/webhook
|
||||||
k8s.io/apiserver/pkg/admission/plugin/webhook/config
|
k8s.io/apiserver/pkg/admission/plugin/webhook/config
|
||||||
k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission
|
k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission
|
||||||
@ -1780,6 +1787,8 @@ k8s.io/apiserver/pkg/endpoints/openapi
|
|||||||
k8s.io/apiserver/pkg/endpoints/request
|
k8s.io/apiserver/pkg/endpoints/request
|
||||||
k8s.io/apiserver/pkg/endpoints/warning
|
k8s.io/apiserver/pkg/endpoints/warning
|
||||||
k8s.io/apiserver/pkg/features
|
k8s.io/apiserver/pkg/features
|
||||||
|
k8s.io/apiserver/pkg/quota/v1
|
||||||
|
k8s.io/apiserver/pkg/quota/v1/generic
|
||||||
k8s.io/apiserver/pkg/registry/generic
|
k8s.io/apiserver/pkg/registry/generic
|
||||||
k8s.io/apiserver/pkg/registry/generic/registry
|
k8s.io/apiserver/pkg/registry/generic/registry
|
||||||
k8s.io/apiserver/pkg/registry/generic/rest
|
k8s.io/apiserver/pkg/registry/generic/rest
|
||||||
|
Loading…
Reference in New Issue
Block a user