From 70d440bc7e3ec31b3f193b85f265b39d629aa3bb Mon Sep 17 00:00:00 2001 From: Tim Usner Date: Wed, 29 Jul 2020 10:34:39 +0200 Subject: [PATCH] Move ResourceQuota admission to k8s.io/apiserver --- cmd/kube-controller-manager/app/BUILD | 2 +- cmd/kube-controller-manager/app/core.go | 2 +- hack/.golint_failures | 6 +- pkg/controller/resourcequota/BUILD | 8 +- .../resource_quota_controller.go | 2 +- .../resource_quota_controller_test.go | 2 + .../resourcequota/resource_quota_monitor.go | 6 +- pkg/kubeapiserver/admission/BUILD | 3 +- pkg/kubeapiserver/admission/initializer.go | 11 +- pkg/kubeapiserver/options/BUILD | 2 +- pkg/kubeapiserver/options/plugins.go | 2 +- pkg/quota/v1/BUILD | 36 -- pkg/quota/v1/evaluator/core/BUILD | 8 +- .../core/persistent_volume_claims.go | 4 +- .../core/persistent_volume_claims_test.go | 4 +- pkg/quota/v1/evaluator/core/pods.go | 4 +- pkg/quota/v1/evaluator/core/pods_test.go | 4 +- pkg/quota/v1/evaluator/core/registry.go | 4 +- pkg/quota/v1/evaluator/core/services.go | 4 +- pkg/quota/v1/evaluator/core/services_test.go | 4 +- pkg/quota/v1/install/BUILD | 4 +- pkg/quota/v1/install/registry.go | 6 +- plugin/pkg/admission/resourcequota/BUILD | 68 +-- .../admission/resourcequota/admission_test.go | 564 ++++++------------ .../apis/resourcequota/install/BUILD | 33 - staging/src/k8s.io/apiserver/BUILD | 1 + .../src/k8s.io/apiserver/pkg/admission/BUILD | 1 + .../apiserver/pkg/admission/initializer/BUILD | 1 + .../pkg/admission/initializer/interfaces.go | 7 + .../pkg/admission/plugin/resourcequota/BUILD | 83 +++ .../plugin}/resourcequota/admission.go | 11 +- .../plugin/resourcequota/admission_test.go | 124 ++++ .../resourcequota/apis/resourcequota/BUILD | 13 +- .../resourcequota/apis/resourcequota/OWNERS | 0 .../resourcequota/apis/resourcequota/doc.go | 2 +- .../apis/resourcequota/install/BUILD | 34 ++ .../apis/resourcequota/install/install.go | 8 +- .../apis/resourcequota/register.go | 0 .../resourcequota/apis/resourcequota/types.go | 0 .../apis/resourcequota/v1}/BUILD | 5 +- .../apis/resourcequota/v1/defaults.go | 0 .../apis/resourcequota/v1/doc.go | 4 +- .../apis/resourcequota/v1/register.go | 0 .../apis/resourcequota/v1/types.go | 0 .../v1/zz_generated.conversion.go | 2 +- .../resourcequota/v1/zz_generated.deepcopy.go | 0 .../resourcequota/v1/zz_generated.defaults.go | 0 .../apis/resourcequota/v1alpha1/BUILD | 5 +- .../apis/resourcequota/v1alpha1/defaults.go | 0 .../apis/resourcequota/v1alpha1/doc.go | 4 +- .../apis/resourcequota/v1alpha1/register.go | 0 .../apis/resourcequota/v1alpha1/types.go | 0 .../v1alpha1/zz_generated.conversion.go | 2 +- .../v1alpha1/zz_generated.deepcopy.go | 0 .../v1alpha1/zz_generated.defaults.go | 0 .../apis/resourcequota/v1beta1}/BUILD | 5 +- .../apis/resourcequota/v1beta1/defaults.go | 0 .../apis/resourcequota/v1beta1/doc.go | 4 +- .../apis/resourcequota/v1beta1/register.go | 0 .../apis/resourcequota/v1beta1/types.go | 0 .../v1beta1/zz_generated.conversion.go | 2 +- .../v1beta1/zz_generated.deepcopy.go | 0 .../v1beta1/zz_generated.defaults.go | 0 .../apis/resourcequota/validation/BUILD | 7 +- .../resourcequota/validation/validation.go | 4 +- .../validation/validation_test.go | 2 +- .../resourcequota/zz_generated.deepcopy.go | 0 .../admission/plugin}/resourcequota/config.go | 6 +- .../plugin}/resourcequota/config_test.go | 2 +- .../plugin}/resourcequota/controller.go | 6 +- .../admission/plugin}/resourcequota/doc.go | 2 +- .../plugin}/resourcequota/resource_access.go | 0 .../resourcequota/resource_access_test.go | 69 +++ .../src/k8s.io/apiserver/pkg/quota/v1/BUILD | 53 ++ .../src/k8s.io/apiserver/pkg/quota/v1/OWNERS | 13 + .../apiserver/pkg}/quota/v1/generic/BUILD | 5 +- .../apiserver/pkg}/quota/v1/generic/OWNERS | 0 .../pkg}/quota/v1/generic/configuration.go | 2 +- .../pkg}/quota/v1/generic/evaluator.go | 2 +- .../pkg}/quota/v1/generic/evaluator_test.go | 0 .../pkg}/quota/v1/generic/registry.go | 2 +- .../apiserver/pkg}/quota/v1/interfaces.go | 2 +- .../apiserver/pkg}/quota/v1/resources.go | 2 +- .../apiserver/pkg}/quota/v1/resources_test.go | 2 +- test/integration/quota/BUILD | 6 +- test/integration/quota/quota_test.go | 8 +- vendor/modules.txt | 9 + 87 files changed, 689 insertions(+), 626 deletions(-) delete mode 100644 plugin/pkg/admission/resourcequota/apis/resourcequota/install/BUILD create mode 100644 staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/BUILD rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/admission.go (91%) create mode 100644 staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/admission_test.go rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/apis/resourcequota/BUILD (52%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/apis/resourcequota/OWNERS (100%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/apis/resourcequota/doc.go (85%) create mode 100644 staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/install/BUILD rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/apis/resourcequota/install/install.go (78%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/apis/resourcequota/register.go (100%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/apis/resourcequota/types.go (100%) rename {plugin/pkg/admission/resourcequota/apis/resourcequota/v1beta1 => staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1}/BUILD (75%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/apis/resourcequota/v1/defaults.go (100%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/apis/resourcequota/v1/doc.go (78%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/apis/resourcequota/v1/register.go (100%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/apis/resourcequota/v1/types.go (100%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/apis/resourcequota/v1/zz_generated.conversion.go (98%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/apis/resourcequota/v1/zz_generated.deepcopy.go (100%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/apis/resourcequota/v1/zz_generated.defaults.go (100%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/apis/resourcequota/v1alpha1/BUILD (74%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/apis/resourcequota/v1alpha1/defaults.go (100%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/apis/resourcequota/v1alpha1/doc.go (78%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/apis/resourcequota/v1alpha1/register.go (100%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/apis/resourcequota/v1alpha1/types.go (100%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/apis/resourcequota/v1alpha1/zz_generated.conversion.go (98%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/apis/resourcequota/v1alpha1/zz_generated.deepcopy.go (100%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/apis/resourcequota/v1alpha1/zz_generated.defaults.go (100%) rename {plugin/pkg/admission/resourcequota/apis/resourcequota/v1 => staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1}/BUILD (75%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/apis/resourcequota/v1beta1/defaults.go (100%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/apis/resourcequota/v1beta1/doc.go (78%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/apis/resourcequota/v1beta1/register.go (100%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/apis/resourcequota/v1beta1/types.go (100%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/apis/resourcequota/v1beta1/zz_generated.conversion.go (98%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/apis/resourcequota/v1beta1/zz_generated.deepcopy.go (100%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/apis/resourcequota/v1beta1/zz_generated.defaults.go (100%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/apis/resourcequota/validation/BUILD (59%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/apis/resourcequota/validation/validation.go (92%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/apis/resourcequota/validation/validation_test.go (94%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/apis/resourcequota/zz_generated.deepcopy.go (100%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/config.go (86%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/config_test.go (97%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/controller.go (99%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/doc.go (88%) rename {plugin/pkg/admission => staging/src/k8s.io/apiserver/pkg/admission/plugin}/resourcequota/resource_access.go (100%) create mode 100644 staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/resource_access_test.go create mode 100644 staging/src/k8s.io/apiserver/pkg/quota/v1/BUILD create mode 100644 staging/src/k8s.io/apiserver/pkg/quota/v1/OWNERS rename {pkg => staging/src/k8s.io/apiserver/pkg}/quota/v1/generic/BUILD (87%) rename {pkg => staging/src/k8s.io/apiserver/pkg}/quota/v1/generic/OWNERS (100%) rename {pkg => staging/src/k8s.io/apiserver/pkg}/quota/v1/generic/configuration.go (96%) rename {pkg => staging/src/k8s.io/apiserver/pkg}/quota/v1/generic/evaluator.go (99%) rename {pkg => staging/src/k8s.io/apiserver/pkg}/quota/v1/generic/evaluator_test.go (100%) rename {pkg => staging/src/k8s.io/apiserver/pkg}/quota/v1/generic/registry.go (98%) rename {pkg => staging/src/k8s.io/apiserver/pkg}/quota/v1/interfaces.go (99%) rename {pkg => staging/src/k8s.io/apiserver/pkg}/quota/v1/resources.go (99%) rename {pkg => staging/src/k8s.io/apiserver/pkg}/quota/v1/resources_test.go (99%) diff --git a/cmd/kube-controller-manager/app/BUILD b/cmd/kube-controller-manager/app/BUILD index f105b14e059..113bcca5bfe 100644 --- a/cmd/kube-controller-manager/app/BUILD +++ b/cmd/kube-controller-manager/app/BUILD @@ -82,7 +82,6 @@ go_library( "//pkg/controller/volume/pvcprotection:go_default_library", "//pkg/controller/volume/pvprotection:go_default_library", "//pkg/features:go_default_library", - "//pkg/quota/v1/generic:go_default_library", "//pkg/quota/v1/install:go_default_library", "//pkg/serviceaccount: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/uuid: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/healthz:go_default_library", "//staging/src/k8s.io/apiserver/pkg/server/mux:go_default_library", diff --git a/cmd/kube-controller-manager/app/core.go b/cmd/kube-controller-manager/app/core.go index e8388eb8b4a..94f1f62f762 100644 --- a/cmd/kube-controller-manager/app/core.go +++ b/cmd/kube-controller-manager/app/core.go @@ -32,6 +32,7 @@ import ( v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apiserver/pkg/quota/v1/generic" utilfeature "k8s.io/apiserver/pkg/util/feature" storagev1informer "k8s.io/client-go/informers/storage/v1" clientset "k8s.io/client-go/kubernetes" @@ -63,7 +64,6 @@ import ( "k8s.io/kubernetes/pkg/controller/volume/pvcprotection" "k8s.io/kubernetes/pkg/controller/volume/pvprotection" "k8s.io/kubernetes/pkg/features" - "k8s.io/kubernetes/pkg/quota/v1/generic" quotainstall "k8s.io/kubernetes/pkg/quota/v1/install" "k8s.io/kubernetes/pkg/volume/csimigration" netutils "k8s.io/utils/net" diff --git a/hack/.golint_failures b/hack/.golint_failures index b88d3e2be79..370f1c4aae3 100644 --- a/hack/.golint_failures +++ b/hack/.golint_failures @@ -196,9 +196,6 @@ pkg/volume/util/volumepathhandler pkg/volume/vsphere_volume plugin/pkg/admission/eventratelimit/apis/eventratelimit/v1alpha1 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/rbac 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/configuration 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/config/apis/webhookadmission staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1 diff --git a/pkg/controller/resourcequota/BUILD b/pkg/controller/resourcequota/BUILD index a12f63e18c3..b2e74ad6888 100644 --- a/pkg/controller/resourcequota/BUILD +++ b/pkg/controller/resourcequota/BUILD @@ -16,9 +16,7 @@ go_library( importpath = "k8s.io/kubernetes/pkg/controller/resourcequota", deps = [ "//pkg/controller:go_default_library", - "//pkg/quota/v1: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/apimachinery/pkg/api/equality: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/sets: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/informers/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"], deps = [ "//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", "//staging/src/k8s.io/api/core/v1: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/schema: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/kubernetes:go_default_library", "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", diff --git a/pkg/controller/resourcequota/resource_quota_controller.go b/pkg/controller/resourcequota/resource_quota_controller.go index c7c8c1275f0..03de2b19823 100644 --- a/pkg/controller/resourcequota/resource_quota_controller.go +++ b/pkg/controller/resourcequota/resource_quota_controller.go @@ -35,6 +35,7 @@ import ( utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/wait" + quota "k8s.io/apiserver/pkg/quota/v1" "k8s.io/client-go/discovery" coreinformers "k8s.io/client-go/informers/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/util/workqueue" "k8s.io/kubernetes/pkg/controller" - "k8s.io/kubernetes/pkg/quota/v1" ) // NamespacedResourcesFunc knows how to discover namespaced resources. diff --git a/pkg/controller/resourcequota/resource_quota_controller_test.go b/pkg/controller/resourcequota/resource_quota_controller_test.go index 1697f172817..34c3516653d 100644 --- a/pkg/controller/resourcequota/resource_quota_controller_test.go +++ b/pkg/controller/resourcequota/resource_quota_controller_test.go @@ -32,6 +32,8 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "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/kubernetes" "k8s.io/client-go/kubernetes/fake" diff --git a/pkg/controller/resourcequota/resource_quota_monitor.go b/pkg/controller/resourcequota/resource_quota_monitor.go index 1d7cad05b46..fc2ed1bbce8 100644 --- a/pkg/controller/resourcequota/resource_quota_monitor.go +++ b/pkg/controller/resourcequota/resource_quota_monitor.go @@ -23,19 +23,19 @@ import ( "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/runtime/schema" "k8s.io/apimachinery/pkg/util/clock" utilerrors "k8s.io/apimachinery/pkg/util/errors" utilruntime "k8s.io/apimachinery/pkg/util/runtime" "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/util/workqueue" "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/generic" ) type eventType int diff --git a/pkg/kubeapiserver/admission/BUILD b/pkg/kubeapiserver/admission/BUILD index 8f870ab9b7e..24ea4253096 100644 --- a/pkg/kubeapiserver/admission/BUILD +++ b/pkg/kubeapiserver/admission/BUILD @@ -9,12 +9,13 @@ go_library( importpath = "k8s.io/kubernetes/pkg/kubeapiserver/admission", visibility = ["//visibility:public"], deps = [ - "//pkg/quota/v1: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/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/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/egressselector:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library", diff --git a/pkg/kubeapiserver/admission/initializer.go b/pkg/kubeapiserver/admission/initializer.go index 35734322e0e..b913b5a76c8 100644 --- a/pkg/kubeapiserver/admission/initializer.go +++ b/pkg/kubeapiserver/admission/initializer.go @@ -19,7 +19,8 @@ package admission import ( "k8s.io/apimachinery/pkg/api/meta" "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. @@ -34,12 +35,6 @@ type WantsRESTMapper interface { 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. type PluginInitializer struct { cloudConfig []byte @@ -75,7 +70,7 @@ func (i *PluginInitializer) Initialize(plugin admission.Interface) { wants.SetRESTMapper(i.restMapper) } - if wants, ok := plugin.(WantsQuotaConfiguration); ok { + if wants, ok := plugin.(initializer.WantsQuotaConfiguration); ok { wants.SetQuotaConfiguration(i.quotaConfiguration) } } diff --git a/pkg/kubeapiserver/options/BUILD b/pkg/kubeapiserver/options/BUILD index bd631e32707..e2dbaa68e85 100644 --- a/pkg/kubeapiserver/options/BUILD +++ b/pkg/kubeapiserver/options/BUILD @@ -42,7 +42,6 @@ go_library( "//plugin/pkg/admission/podpreset:go_default_library", "//plugin/pkg/admission/podtolerationrestriction: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/security/podsecuritypolicy: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/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/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/validating:go_default_library", "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", diff --git a/pkg/kubeapiserver/options/plugins.go b/pkg/kubeapiserver/options/plugins.go index f3c60636d62..7a20661906c 100644 --- a/pkg/kubeapiserver/options/plugins.go +++ b/pkg/kubeapiserver/options/plugins.go @@ -44,7 +44,6 @@ import ( "k8s.io/kubernetes/plugin/pkg/admission/podpreset" "k8s.io/kubernetes/plugin/pkg/admission/podtolerationrestriction" 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/security/podsecuritypolicy" "k8s.io/kubernetes/plugin/pkg/admission/securitycontext/scdeny" @@ -57,6 +56,7 @@ import ( "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apiserver/pkg/admission" "k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle" + "k8s.io/apiserver/pkg/admission/plugin/resourcequota" mutatingwebhook "k8s.io/apiserver/pkg/admission/plugin/webhook/mutating" validatingwebhook "k8s.io/apiserver/pkg/admission/plugin/webhook/validating" ) diff --git a/pkg/quota/v1/BUILD b/pkg/quota/v1/BUILD index fe9f7b579d3..b314e22e56b 100644 --- a/pkg/quota/v1/BUILD +++ b/pkg/quota/v1/BUILD @@ -1,40 +1,5 @@ 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( name = "package-srcs", srcs = glob(["**"]), @@ -47,7 +12,6 @@ filegroup( srcs = [ ":package-srcs", "//pkg/quota/v1/evaluator/core:all-srcs", - "//pkg/quota/v1/generic:all-srcs", "//pkg/quota/v1/install:all-srcs", ], tags = ["automanaged"], diff --git a/pkg/quota/v1/evaluator/core/BUILD b/pkg/quota/v1/evaluator/core/BUILD index 58cc57bfea3..63d948d8308 100644 --- a/pkg/quota/v1/evaluator/core/BUILD +++ b/pkg/quota/v1/evaluator/core/BUILD @@ -22,8 +22,6 @@ go_library( "//pkg/apis/core/v1/helper:go_default_library", "//pkg/apis/core/v1/helper/qos: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/apimachinery/pkg/api/resource: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/sets: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", ], ) @@ -46,14 +46,14 @@ go_test( embed = [":go_default_library"], deps = [ "//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", "//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/apimachinery/pkg/runtime/schema: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", ], ) diff --git a/pkg/quota/v1/evaluator/core/persistent_volume_claims.go b/pkg/quota/v1/evaluator/core/persistent_volume_claims.go index 3cf3a2b0fa9..5b58a54bbc0 100644 --- a/pkg/quota/v1/evaluator/core/persistent_volume_claims.go +++ b/pkg/quota/v1/evaluator/core/persistent_volume_claims.go @@ -25,13 +25,13 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "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" api "k8s.io/kubernetes/pkg/apis/core" k8s_api_v1 "k8s.io/kubernetes/pkg/apis/core/v1" "k8s.io/kubernetes/pkg/apis/core/v1/helper" 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 diff --git a/pkg/quota/v1/evaluator/core/persistent_volume_claims_test.go b/pkg/quota/v1/evaluator/core/persistent_volume_claims_test.go index 284395e3154..f5122ffcb6b 100644 --- a/pkg/quota/v1/evaluator/core/persistent_volume_claims_test.go +++ b/pkg/quota/v1/evaluator/core/persistent_volume_claims_test.go @@ -23,9 +23,9 @@ import ( "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "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" - 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 { diff --git a/pkg/quota/v1/evaluator/core/pods.go b/pkg/quota/v1/evaluator/core/pods.go index 955a59596f0..b0b85cb5ffd 100644 --- a/pkg/quota/v1/evaluator/core/pods.go +++ b/pkg/quota/v1/evaluator/core/pods.go @@ -30,12 +30,12 @@ import ( "k8s.io/apimachinery/pkg/util/clock" "k8s.io/apimachinery/pkg/util/sets" "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" 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/qos" - quota "k8s.io/kubernetes/pkg/quota/v1" - "k8s.io/kubernetes/pkg/quota/v1/generic" ) // the name used for object count quota diff --git a/pkg/quota/v1/evaluator/core/pods_test.go b/pkg/quota/v1/evaluator/core/pods_test.go index 229a1ed3c98..4b27b9cf3e5 100644 --- a/pkg/quota/v1/evaluator/core/pods_test.go +++ b/pkg/quota/v1/evaluator/core/pods_test.go @@ -25,9 +25,9 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" "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" - quota "k8s.io/kubernetes/pkg/quota/v1" - "k8s.io/kubernetes/pkg/quota/v1/generic" "k8s.io/kubernetes/pkg/util/node" ) diff --git a/pkg/quota/v1/evaluator/core/registry.go b/pkg/quota/v1/evaluator/core/registry.go index 43a86d318ce..5305e140eb2 100644 --- a/pkg/quota/v1/evaluator/core/registry.go +++ b/pkg/quota/v1/evaluator/core/registry.go @@ -20,8 +20,8 @@ import ( corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/clock" - quota "k8s.io/kubernetes/pkg/quota/v1" - "k8s.io/kubernetes/pkg/quota/v1/generic" + quota "k8s.io/apiserver/pkg/quota/v1" + "k8s.io/apiserver/pkg/quota/v1/generic" ) // legacyObjectCountAliases are what we used to do simple object counting quota with mapped to alias diff --git a/pkg/quota/v1/evaluator/core/services.go b/pkg/quota/v1/evaluator/core/services.go index eaebcc698a2..d90afe0b4f8 100644 --- a/pkg/quota/v1/evaluator/core/services.go +++ b/pkg/quota/v1/evaluator/core/services.go @@ -24,10 +24,10 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "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" 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 diff --git a/pkg/quota/v1/evaluator/core/services_test.go b/pkg/quota/v1/evaluator/core/services_test.go index 7817bd8156a..b275f23a8a2 100644 --- a/pkg/quota/v1/evaluator/core/services_test.go +++ b/pkg/quota/v1/evaluator/core/services_test.go @@ -22,9 +22,9 @@ import ( corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" "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" - quota "k8s.io/kubernetes/pkg/quota/v1" - "k8s.io/kubernetes/pkg/quota/v1/generic" ) func TestServiceEvaluatorMatchesResources(t *testing.T) { diff --git a/pkg/quota/v1/install/BUILD b/pkg/quota/v1/install/BUILD index 96425fa422c..66fecf77b4f 100644 --- a/pkg/quota/v1/install/BUILD +++ b/pkg/quota/v1/install/BUILD @@ -10,10 +10,10 @@ go_library( srcs = ["registry.go"], importpath = "k8s.io/kubernetes/pkg/quota/v1/install", deps = [ - "//pkg/quota/v1: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/apiserver/pkg/quota/v1:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/quota/v1/generic:go_default_library", ], ) diff --git a/pkg/quota/v1/install/registry.go b/pkg/quota/v1/install/registry.go index 28b87159c80..536145c82a3 100644 --- a/pkg/quota/v1/install/registry.go +++ b/pkg/quota/v1/install/registry.go @@ -18,9 +18,9 @@ package install import ( "k8s.io/apimachinery/pkg/runtime/schema" - quota "k8s.io/kubernetes/pkg/quota/v1" - core "k8s.io/kubernetes/pkg/quota/v1/evaluator/core" - generic "k8s.io/kubernetes/pkg/quota/v1/generic" + quota "k8s.io/apiserver/pkg/quota/v1" + "k8s.io/apiserver/pkg/quota/v1/generic" + "k8s.io/kubernetes/pkg/quota/v1/evaluator/core" ) // NewQuotaConfigurationForAdmission returns a quota configuration for admission control. diff --git a/plugin/pkg/admission/resourcequota/BUILD b/plugin/pkg/admission/resourcequota/BUILD index 8f4d5ee1fd5..9edc5be2623 100644 --- a/plugin/pkg/admission/resourcequota/BUILD +++ b/plugin/pkg/admission/resourcequota/BUILD @@ -1,78 +1,26 @@ -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", - ], - 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", - ], -) +load("@io_bazel_rules_go//go:def.bzl", "go_test") go_test( name = "go_default_test", - srcs = [ - "admission_test.go", - "config_test.go", - ], - embed = [":go_default_library"], + srcs = ["admission_test.go"], deps = [ "//pkg/apis/core:go_default_library", - "//pkg/controller:go_default_library", "//pkg/features:go_default_library", - "//pkg/quota/v1/generic: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/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/util/sets: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/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/testing: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", - "//vendor/github.com/hashicorp/golang-lru:go_default_library", ], ) @@ -85,9 +33,7 @@ filegroup( filegroup( name = "all-srcs", - srcs = [ - ":package-srcs", - "//plugin/pkg/admission/resourcequota/apis/resourcequota:all-srcs", - ], + srcs = [":package-srcs"], tags = ["automanaged"], + visibility = ["//visibility:public"], ) diff --git a/plugin/pkg/admission/resourcequota/admission_test.go b/plugin/pkg/admission/resourcequota/admission_test.go index bb62571c84a..d084db8e9df 100644 --- a/plugin/pkg/admission/resourcequota/admission_test.go +++ b/plugin/pkg/admission/resourcequota/admission_test.go @@ -22,27 +22,24 @@ import ( "strconv" "strings" "testing" - "time" - - lru "github.com/hashicorp/golang-lru" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/sets" "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" "k8s.io/client-go/informers" + "k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes/fake" testcore "k8s.io/client-go/testing" "k8s.io/client-go/tools/cache" featuregatetesting "k8s.io/component-base/featuregate/testing" api "k8s.io/kubernetes/pkg/apis/core" - "k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/features" - "k8s.io/kubernetes/pkg/quota/v1/generic" "k8s.io/kubernetes/pkg/quota/v1/install" - resourcequotaapi "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota" ) func getResourceList(cpu, memory string) api.ResourceList { @@ -95,44 +92,25 @@ func validPersistentVolumeClaim(name string, resources api.ResourceRequirements) } } -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 +func createHandler(kubeClient kubernetes.Interface, informerFactory informers.SharedInformerFactory, stopCh chan struct{}) (*resourcequota.QuotaAdmission, error) { + return createHandlerWithConfig(kubeClient, informerFactory, nil, stopCh) +} + +func createHandlerWithConfig(kubeClient kubernetes.Interface, informerFactory informers.SharedInformerFactory, config *resourcequotaapi.Configuration, stopCh chan struct{}) (*resourcequota.QuotaAdmission, error) { + if config == nil { + config = &resourcequotaapi.Configuration{} } - 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) - } + 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 @@ -141,20 +119,15 @@ func TestAdmissionIgnoresDelete(t *testing.T) { defer close(stopCh) kubeClient := fake.NewSimpleClientset() - informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc()) - 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) + informerFactory := informers.NewSharedInformerFactory(kubeClient, 0) - handler := &QuotaAdmission{ - Handler: admission.NewHandler(admission.Create, admission.Update), - evaluator: evaluator, + handler, err := createHandler(kubeClient, informerFactory, stopCh) + if err != nil { + t.Errorf("Error occurred while creating admission plugin: %v", err) } + 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 { t.Errorf("ResourceQuota should admit all deletes: %v", err) } @@ -177,21 +150,16 @@ func TestAdmissionIgnoresSubresources(t *testing.T) { defer close(stopCh) kubeClient := fake.NewSimpleClientset() - informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc()) - 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) + informerFactory := informers.NewSharedInformerFactory(kubeClient, 0) - handler := &QuotaAdmission{ - Handler: admission.NewHandler(admission.Create, admission.Update), - evaluator: evaluator, + handler, err := createHandler(kubeClient, informerFactory, stopCh) + if err != nil { + t.Errorf("Error occurred while creating admission plugin: %v", err) } + informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota) 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 { t.Errorf("Expected an error because the pod exceeded allowed quota") } @@ -222,21 +190,16 @@ func TestAdmitBelowQuotaLimit(t *testing.T) { defer close(stopCh) kubeClient := fake.NewSimpleClientset(resourceQuota) - informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc()) - 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) + informerFactory := informers.NewSharedInformerFactory(kubeClient, 0) - handler := &QuotaAdmission{ - Handler: admission.NewHandler(admission.Create, admission.Update), - evaluator: evaluator, + handler, err := createHandler(kubeClient, informerFactory, stopCh) + if err != nil { + t.Errorf("Error occurred while creating admission plugin: %v", err) } + informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota) 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 { t.Errorf("Unexpected error: %v", err) } @@ -304,22 +267,17 @@ func TestAdmitDryRun(t *testing.T) { defer close(stopCh) kubeClient := fake.NewSimpleClientset(resourceQuota) - informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc()) - 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) + informerFactory := informers.NewSharedInformerFactory(kubeClient, 0) - handler := &QuotaAdmission{ - Handler: admission.NewHandler(admission.Create, admission.Update), - evaluator: evaluator, + handler, err := createHandler(kubeClient, informerFactory, stopCh) + if err != nil { + t.Errorf("Error occurred while creating admission plugin: %v", err) } + informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota) 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 { t.Errorf("Unexpected error: %v", err) } @@ -359,18 +317,13 @@ func TestAdmitHandlesOldObjects(t *testing.T) { defer close(stopCh) kubeClient := fake.NewSimpleClientset(resourceQuota) - informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc()) - 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) + informerFactory := informers.NewSharedInformerFactory(kubeClient, 0) - handler := &QuotaAdmission{ - Handler: admission.NewHandler(admission.Create, admission.Update), - evaluator: evaluator, + handler, err := createHandler(kubeClient, informerFactory, stopCh) + if err != nil { + t.Errorf("Error occurred while creating admission plugin: %v", err) } + informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota) // 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}}, }, } - 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 { t.Errorf("Unexpected error: %v", err) } @@ -458,18 +411,13 @@ func TestAdmitHandlesNegativePVCUpdates(t *testing.T) { defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.ExpandPersistentVolumes, true)() kubeClient := fake.NewSimpleClientset(resourceQuota) - informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc()) - 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) + informerFactory := informers.NewSharedInformerFactory(kubeClient, 0) - handler := &QuotaAdmission{ - Handler: admission.NewHandler(admission.Create, admission.Update), - evaluator: evaluator, + handler, err := createHandler(kubeClient, informerFactory, stopCh) + if err != nil { + t.Errorf("Error occurred while creating admission plugin: %v", err) } + informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota) 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 { t.Errorf("Unexpected error: %v", err) } @@ -517,18 +465,13 @@ func TestAdmitHandlesPVCUpdates(t *testing.T) { defer close(stopCh) kubeClient := fake.NewSimpleClientset(resourceQuota) - informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc()) - 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) + informerFactory := informers.NewSharedInformerFactory(kubeClient, 0) - handler := &QuotaAdmission{ - Handler: admission.NewHandler(admission.Create, admission.Update), - evaluator: evaluator, + handler, err := createHandler(kubeClient, informerFactory, stopCh) + if err != nil { + t.Errorf("Error occurred while creating admission plugin: %v", err) } + informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota) 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 { t.Errorf("Unexpected error: %v", err) } @@ -616,18 +559,13 @@ func TestAdmitHandlesCreatingUpdates(t *testing.T) { defer close(stopCh) kubeClient := fake.NewSimpleClientset(resourceQuota) - informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc()) - 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) + informerFactory := informers.NewSharedInformerFactory(kubeClient, 0) - handler := &QuotaAdmission{ - Handler: admission.NewHandler(admission.Create, admission.Update), - evaluator: evaluator, + handler, err := createHandler(kubeClient, informerFactory, stopCh) + if err != nil { + t.Errorf("Error occurred while creating admission plugin: %v", err) } + informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota) // 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}}, }, } - 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 { t.Errorf("Unexpected error: %v", err) } @@ -711,21 +649,16 @@ func TestAdmitExceedQuotaLimit(t *testing.T) { defer close(stopCh) kubeClient := fake.NewSimpleClientset(resourceQuota) - informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc()) - 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) + informerFactory := informers.NewSharedInformerFactory(kubeClient, 0) - handler := &QuotaAdmission{ - Handler: admission.NewHandler(admission.Create, admission.Update), - evaluator: evaluator, + handler, err := createHandler(kubeClient, informerFactory, stopCh) + if err != nil { + t.Errorf("Error occurred while creating admission plugin: %v", err) } + informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota) 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 { t.Errorf("Expected an error exceeding quota") } @@ -756,22 +689,17 @@ func TestAdmitEnforceQuotaConstraints(t *testing.T) { defer close(stopCh) kubeClient := fake.NewSimpleClientset(resourceQuota) - informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc()) - 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) + informerFactory := informers.NewSharedInformerFactory(kubeClient, 0) - handler := &QuotaAdmission{ - Handler: admission.NewHandler(admission.Create, admission.Update), - evaluator: evaluator, + handler, err := createHandler(kubeClient, informerFactory, stopCh) + if err != nil { + t.Errorf("Error occurred while creating admission plugin: %v", err) } + informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota) // verify all values are specified as required on the quota 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 { 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{}) defer close(stopCh) kubeClient := fake.NewSimpleClientset(resourceQuota) - informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc()) - 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) + informerFactory := informers.NewSharedInformerFactory(kubeClient, 0) - handler := &QuotaAdmission{ - Handler: admission.NewHandler(admission.Create, admission.Update), - evaluator: evaluator, + handler, err := createHandler(kubeClient, informerFactory, stopCh) + if err != nil { + t.Errorf("Error occurred while creating admission plugin: %v", err) } + // Add to the index informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota) - newPod := validPod("not-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{}}) + newPod := validPod("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) 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) kubeClient := fake.NewSimpleClientset(resourceQuotaTerminating, resourceQuotaNonTerminating) - informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc()) - 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) + informerFactory := informers.NewSharedInformerFactory(kubeClient, 0) - handler := &QuotaAdmission{ - Handler: admission.NewHandler(admission.Create, admission.Update), - evaluator: evaluator, + handler, err := createHandler(kubeClient, informerFactory, stopCh) + if err != nil { + 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(resourceQuotaTerminating) @@ -891,7 +803,7 @@ func TestAdmitBelowTerminatingQuotaLimit(t *testing.T) { newPod := validPod("allowed-pod", 1, getResourceRequirements(getResourceList("100m", "2Gi"), getResourceList("", ""))) activeDeadlineSeconds := int64(30) 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 { t.Errorf("Unexpected error: %v", err) } @@ -978,24 +890,19 @@ func TestAdmitBelowBestEffortQuotaLimit(t *testing.T) { defer close(stopCh) kubeClient := fake.NewSimpleClientset(resourceQuotaBestEffort, resourceQuotaNotBestEffort) - informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc()) - 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) + informerFactory := informers.NewSharedInformerFactory(kubeClient, 0) - handler := &QuotaAdmission{ - Handler: admission.NewHandler(admission.Create, admission.Update), - evaluator: evaluator, + handler, err := createHandler(kubeClient, informerFactory, stopCh) + if err != nil { + 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(resourceQuotaNotBestEffort) // create a pod that is best effort because it does not make a request for anything 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 { t.Errorf("Unexpected error: %v", err) } @@ -1071,21 +978,16 @@ func TestAdmitBestEffortQuotaLimitIgnoresBurstable(t *testing.T) { defer close(stopCh) kubeClient := fake.NewSimpleClientset(resourceQuota) - informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc()) - 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) + informerFactory := informers.NewSharedInformerFactory(kubeClient, 0) - handler := &QuotaAdmission{ - Handler: admission.NewHandler(admission.Create, admission.Update), - evaluator: evaluator, + handler, err := createHandler(kubeClient, informerFactory, stopCh) + if err != nil { + t.Errorf("Error occurred while creating admission plugin: %v", err) } + informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota) 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 { 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 // namespace, it will be set. func TestAdmissionSetsMissingNamespace(t *testing.T) { @@ -1176,25 +1018,20 @@ func TestAdmissionSetsMissingNamespace(t *testing.T) { defer close(stopCh) kubeClient := fake.NewSimpleClientset(resourceQuota) - informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc()) - 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) + informerFactory := informers.NewSharedInformerFactory(kubeClient, 0) - handler := &QuotaAdmission{ - Handler: admission.NewHandler(admission.Create, admission.Update), - evaluator: evaluator, + handler, err := createHandler(kubeClient, informerFactory, stopCh) + if err != nil { + t.Errorf("Error occurred while creating admission plugin: %v", err) } + informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota) newPod := validPod("pod-without-namespace", 1, getResourceRequirements(getResourceList("1", "2Gi"), getResourceList("", ""))) // unset the 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 { t.Errorf("Got unexpected error: %v", err) } @@ -1222,22 +1059,17 @@ func TestAdmitRejectsNegativeUsage(t *testing.T) { defer close(stopCh) kubeClient := fake.NewSimpleClientset(resourceQuota) - informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc()) - 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) + informerFactory := informers.NewSharedInformerFactory(kubeClient, 0) - handler := &QuotaAdmission{ - Handler: admission.NewHandler(admission.Create, admission.Update), - evaluator: evaluator, + handler, err := createHandler(kubeClient, informerFactory, stopCh) + if err != nil { + t.Errorf("Error occurred while creating admission plugin: %v", err) } + informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota) // verify quota rejects negative pvc storage requests 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 { t.Errorf("Expected an error because the pvc has negative storage usage") } @@ -1269,23 +1101,18 @@ func TestAdmitWhenUnrelatedResourceExceedsQuota(t *testing.T) { defer close(stopCh) kubeClient := fake.NewSimpleClientset(resourceQuota) - informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc()) - 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) + informerFactory := informers.NewSharedInformerFactory(kubeClient, 0) - handler := &QuotaAdmission{ - Handler: admission.NewHandler(admission.Create, admission.Update), - evaluator: evaluator, + handler, err := createHandler(kubeClient, informerFactory, stopCh) + if err != nil { + t.Errorf("Error occurred while creating admission plugin: %v", err) } + informerFactory.Core().V1().ResourceQuotas().Informer().GetIndexer().Add(resourceQuota) // create a pod that should pass existing quota 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 { t.Errorf("Unexpected error: %v", err) } @@ -1297,10 +1124,7 @@ func TestAdmitLimitedResourceNoQuota(t *testing.T) { stopCh := make(chan struct{}) defer close(stopCh) - informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc()) - quotaAccessor, _ := newQuotaAccessor() - quotaAccessor.client = kubeClient - quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister() + informerFactory := informers.NewSharedInformerFactory(kubeClient, 0) // disable consumption of cpu unless there is a covering quota. 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: admission.NewHandler(admission.Create, admission.Update), - evaluator: evaluator, + handler, err := createHandlerWithConfig(kubeClient, informerFactory, config, stopCh) + if err != nil { + t.Errorf("Error occurred while creating admission plugin: %v", err) } + 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 { 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{}) defer close(stopCh) - informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc()) - quotaAccessor, _ := newQuotaAccessor() - quotaAccessor.client = kubeClient - quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister() + informerFactory := informers.NewSharedInformerFactory(kubeClient, 0) // disable consumption of cpu unless there is a covering quota. 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: admission.NewHandler(admission.Create, admission.Update), - evaluator: evaluator, + handler, err := createHandlerWithConfig(kubeClient, informerFactory, config, stopCh) + if err != nil { + t.Errorf("Error occurred while creating admission plugin: %v", err) } + 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 { t.Fatalf("Unexpected error: %v", err) } @@ -1377,10 +1196,7 @@ func TestAdmitLimitedResourceWithQuota(t *testing.T) { stopCh := make(chan struct{}) defer close(stopCh) - informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc()) - quotaAccessor, _ := newQuotaAccessor() - quotaAccessor.client = kubeClient - quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister() + informerFactory := informers.NewSharedInformerFactory(kubeClient, 0) // 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: admission.NewHandler(admission.Create, admission.Update), - evaluator: evaluator, + handler, err := createHandlerWithConfig(kubeClient, informerFactory, config, stopCh) + if err != nil { + t.Errorf("Error occurred while creating admission plugin: %v", err) } + indexer.Add(resourceQuota) 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 { t.Errorf("unexpected error: %v", err) } @@ -1436,10 +1251,7 @@ func TestAdmitLimitedResourceWithMultipleQuota(t *testing.T) { stopCh := make(chan struct{}) defer close(stopCh) - informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc()) - quotaAccessor, _ := newQuotaAccessor() - quotaAccessor.client = kubeClient - quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister() + informerFactory := informers.NewSharedInformerFactory(kubeClient, 0) // 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: admission.NewHandler(admission.Create, admission.Update), - evaluator: evaluator, + handler, err := createHandlerWithConfig(kubeClient, informerFactory, config, stopCh) + if err != nil { + t.Errorf("Error occurred while creating admission plugin: %v", err) } + indexer.Add(resourceQuota1) indexer.Add(resourceQuota2) 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 { t.Errorf("unexpected error: %v", err) } @@ -1485,10 +1296,7 @@ func TestAdmitLimitedResourceWithQuotaThatDoesNotCover(t *testing.T) { stopCh := make(chan struct{}) defer close(stopCh) - informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc()) - quotaAccessor, _ := newQuotaAccessor() - quotaAccessor.client = kubeClient - quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister() + informerFactory := informers.NewSharedInformerFactory(kubeClient, 0) // 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: admission.NewHandler(admission.Create, admission.Update), - evaluator: evaluator, + handler, err := createHandlerWithConfig(kubeClient, informerFactory, config, stopCh) + if err != nil { + t.Errorf("Error occurred while creating admission plugin: %v", err) } + indexer.Add(resourceQuota) 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 { 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{}) defer close(stopCh) - informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc()) - quotaAccessor, _ := newQuotaAccessor() - quotaAccessor.client = kubeClient - quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister() + informerFactory := informers.NewSharedInformerFactory(kubeClient, 0) - quotaConfiguration := install.NewQuotaConfigurationForAdmission() - evaluator := NewQuotaEvaluator(quotaAccessor, quotaConfiguration.IgnoredResources(), generic.NewRegistry(quotaConfiguration.Evaluators()), nil, config, 5, stopCh) - - handler := &QuotaAdmission{ - Handler: admission.NewHandler(admission.Create, admission.Update), - evaluator: evaluator, + handler, err := createHandlerWithConfig(kubeClient, informerFactory, config, stopCh) + if err != nil { + t.Errorf("Error occurred while creating admission plugin: %v", err) } + indexer.Add(resourceQuota) if testCase.anotherQuota != nil { 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 err != nil { 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{}) defer close(stopCh) - informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc()) - quotaAccessor, _ := newQuotaAccessor() - quotaAccessor.client = kubeClient - quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister() + informerFactory := informers.NewSharedInformerFactory(kubeClient, 0) // disable services unless there is a covering quota. 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: admission.NewHandler(admission.Create, admission.Update), - evaluator: evaluator, + handler, err := createHandlerWithConfig(kubeClient, informerFactory, config, stopCh) + if err != nil { + t.Errorf("Error occurred while creating admission plugin: %v", err) } existingService := &api.Service{ @@ -2222,7 +2019,7 @@ func TestAdmitZeroDeltaUsageWithoutCoveringQuota(t *testing.T) { 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 { t.Errorf("unexpected error: %v", err) } @@ -2234,10 +2031,7 @@ func TestAdmitRejectIncreaseUsageWithoutCoveringQuota(t *testing.T) { stopCh := make(chan struct{}) defer close(stopCh) - informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc()) - quotaAccessor, _ := newQuotaAccessor() - quotaAccessor.client = kubeClient - quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister() + informerFactory := informers.NewSharedInformerFactory(kubeClient, 0) // disable services unless there is a covering quota. 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: admission.NewHandler(admission.Create, admission.Update), - evaluator: evaluator, + handler, err := createHandlerWithConfig(kubeClient, informerFactory, config, stopCh) + if err != nil { + t.Errorf("Error occurred while creating admission plugin: %v", err) } existingService := &api.Service{ @@ -2268,7 +2060,7 @@ func TestAdmitRejectIncreaseUsageWithoutCoveringQuota(t *testing.T) { 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 { 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{}) defer close(stopCh) - informerFactory := informers.NewSharedInformerFactory(kubeClient, controller.NoResyncPeriodFunc()) - quotaAccessor, _ := newQuotaAccessor() - quotaAccessor.client = kubeClient - quotaAccessor.lister = informerFactory.Core().V1().ResourceQuotas().Lister() + informerFactory := informers.NewSharedInformerFactory(kubeClient, 0) // disable services unless there is a covering quota. 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: admission.NewHandler(admission.Create, admission.Update), - evaluator: evaluator, + handler, err := createHandlerWithConfig(kubeClient, informerFactory, config, stopCh) + if err != nil { + t.Errorf("Error occurred while creating admission plugin: %v", err) } 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 { t.Errorf("Expected no error for decreasing a limited resource without quota, got %v", err) } diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/install/BUILD b/plugin/pkg/admission/resourcequota/apis/resourcequota/install/BUILD deleted file mode 100644 index a5f132fb6c3..00000000000 --- a/plugin/pkg/admission/resourcequota/apis/resourcequota/install/BUILD +++ /dev/null @@ -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"], -) diff --git a/staging/src/k8s.io/apiserver/BUILD b/staging/src/k8s.io/apiserver/BUILD index 830112dc5f2..4ac8a8e9575 100644 --- a/staging/src/k8s.io/apiserver/BUILD +++ b/staging/src/k8s.io/apiserver/BUILD @@ -38,6 +38,7 @@ filegroup( "//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/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/server:all-srcs", "//staging/src/k8s.io/apiserver/pkg/storage:all-srcs", diff --git a/staging/src/k8s.io/apiserver/pkg/admission/BUILD b/staging/src/k8s.io/apiserver/pkg/admission/BUILD index 78ac161c6b5..bcec0711393 100644 --- a/staging/src/k8s.io/apiserver/pkg/admission/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/admission/BUILD @@ -77,6 +77,7 @@ filegroup( "//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/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/testing:all-srcs", ], diff --git a/staging/src/k8s.io/apiserver/pkg/admission/initializer/BUILD b/staging/src/k8s.io/apiserver/pkg/admission/initializer/BUILD index 88d6f2f304f..575975100b9 100644 --- a/staging/src/k8s.io/apiserver/pkg/admission/initializer/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/admission/initializer/BUILD @@ -17,6 +17,7 @@ go_library( deps = [ "//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/quota/v1: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/component-base/featuregate:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/admission/initializer/interfaces.go b/staging/src/k8s.io/apiserver/pkg/admission/initializer/interfaces.go index 2b3031aa279..86a6df1c2c4 100644 --- a/staging/src/k8s.io/apiserver/pkg/admission/initializer/interfaces.go +++ b/staging/src/k8s.io/apiserver/pkg/admission/initializer/interfaces.go @@ -19,6 +19,7 @@ package initializer import ( "k8s.io/apiserver/pkg/admission" "k8s.io/apiserver/pkg/authorization/authorizer" + quota "k8s.io/apiserver/pkg/quota/v1" "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes" "k8s.io/component-base/featuregate" @@ -42,6 +43,12 @@ type WantsAuthorizer interface { 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. // 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. diff --git a/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/BUILD b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/BUILD new file mode 100644 index 00000000000..20a00652d9b --- /dev/null +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/BUILD @@ -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"], +) diff --git a/plugin/pkg/admission/resourcequota/admission.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/admission.go similarity index 91% rename from plugin/pkg/admission/resourcequota/admission.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/admission.go index 0d3eccbfefe..f2a0f8d0b0e 100644 --- a/plugin/pkg/admission/resourcequota/admission.go +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/admission.go @@ -25,13 +25,12 @@ import ( corev1 "k8s.io/api/core/v1" "k8s.io/apiserver/pkg/admission" 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/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 @@ -70,7 +69,7 @@ type QuotaAdmission struct { var _ admission.ValidationInterface = &QuotaAdmission{} var _ = genericadmissioninitializer.WantsExternalKubeInformerFactory(&QuotaAdmission{}) var _ = genericadmissioninitializer.WantsExternalKubeClientSet(&QuotaAdmission{}) -var _ = kubeapiserveradmission.WantsQuotaConfiguration(&QuotaAdmission{}) +var _ = genericadmissioninitializer.WantsQuotaConfiguration(&QuotaAdmission{}) type liveLookupEntry struct { expiry time.Time diff --git a/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/admission_test.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/admission_test.go new file mode 100644 index 00000000000..461eb9bb79e --- /dev/null +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/admission_test.go @@ -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) + } + } +} diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/BUILD b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/BUILD similarity index 52% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/BUILD rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/BUILD index 21141c2f7b5..b93b278f74c 100644 --- a/plugin/pkg/admission/resourcequota/apis/resourcequota/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/BUILD @@ -13,7 +13,8 @@ go_library( "types.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 = [ "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -33,11 +34,11 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", - "//plugin/pkg/admission/resourcequota/apis/resourcequota/install:all-srcs", - "//plugin/pkg/admission/resourcequota/apis/resourcequota/v1:all-srcs", - "//plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1:all-srcs", - "//plugin/pkg/admission/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/install:all-srcs", + "//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1:all-srcs", + "//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1:all-srcs", + "//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1:all-srcs", + "//staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/validation:all-srcs", ], tags = ["automanaged"], ) diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/OWNERS b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/OWNERS similarity index 100% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/OWNERS rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/OWNERS diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/doc.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/doc.go similarity index 85% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/doc.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/doc.go index 5a514f605d4..b8c0ea047c2 100644 --- a/plugin/pkg/admission/resourcequota/apis/resourcequota/doc.go +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/doc.go @@ -16,4 +16,4 @@ limitations under the License. // +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" diff --git a/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/install/BUILD b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/install/BUILD new file mode 100644 index 00000000000..5fb0b56ec05 --- /dev/null +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/install/BUILD @@ -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"], +) diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/install/install.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/install/install.go similarity index 78% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/install/install.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/install/install.go index d0d9033077d..6eabe1809b0 100644 --- a/plugin/pkg/admission/resourcequota/apis/resourcequota/install/install.go +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/install/install.go @@ -21,10 +21,10 @@ package install import ( "k8s.io/apimachinery/pkg/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime" - resourcequotaapi "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota" - resourcequotav1 "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota/v1" - resourcequotav1alpha1 "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1" - resourcequotav1beta1 "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota/v1beta1" + resourcequotaapi "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota" + resourcequotav1 "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1" + resourcequotav1alpha1 "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1" + resourcequotav1beta1 "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1" ) // Install registers the API group and adds types to a scheme diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/register.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/register.go similarity index 100% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/register.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/register.go diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/types.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/types.go similarity index 100% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/types.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/types.go diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1beta1/BUILD b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1/BUILD similarity index 75% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/v1beta1/BUILD rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1/BUILD index 0819802ecc5..1b9d8ff61a0 100644 --- a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1beta1/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1/BUILD @@ -16,14 +16,15 @@ go_library( "zz_generated.deepcopy.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 = [ - "//plugin/pkg/admission/resourcequota/apis/resourcequota: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/conversion: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/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota:go_default_library", ], ) diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1/defaults.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1/defaults.go similarity index 100% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/v1/defaults.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1/defaults.go diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1/doc.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1/doc.go similarity index 78% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/v1/doc.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1/doc.go index f0af6d3692e..4eaeff77adf 100644 --- a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1/doc.go +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1/doc.go @@ -15,9 +15,9 @@ limitations under the License. */ // +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 // +groupName=resourcequota.admission.k8s.io // 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" diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1/register.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1/register.go similarity index 100% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/v1/register.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1/register.go diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1/types.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1/types.go similarity index 100% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/v1/types.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1/types.go diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1/zz_generated.conversion.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1/zz_generated.conversion.go similarity index 98% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/v1/zz_generated.conversion.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1/zz_generated.conversion.go index 3d4276ee203..e1fca3bd348 100644 --- a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1/zz_generated.conversion.go +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1/zz_generated.conversion.go @@ -26,7 +26,7 @@ import ( corev1 "k8s.io/api/core/v1" conversion "k8s.io/apimachinery/pkg/conversion" 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() { diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1/zz_generated.deepcopy.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1/zz_generated.deepcopy.go similarity index 100% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/v1/zz_generated.deepcopy.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1/zz_generated.deepcopy.go diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1/zz_generated.defaults.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1/zz_generated.defaults.go similarity index 100% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/v1/zz_generated.defaults.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1/zz_generated.defaults.go diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/BUILD b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1/BUILD similarity index 74% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/BUILD rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1/BUILD index 65ce81437b0..758a8f0db01 100644 --- a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1/BUILD @@ -16,14 +16,15 @@ go_library( "zz_generated.deepcopy.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 = [ - "//plugin/pkg/admission/resourcequota/apis/resourcequota: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/conversion: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/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota:go_default_library", ], ) diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/defaults.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1/defaults.go similarity index 100% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/defaults.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1/defaults.go diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/doc.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1/doc.go similarity index 78% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/doc.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1/doc.go index 5e8dc097580..b1c83e40dfb 100644 --- a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/doc.go +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1/doc.go @@ -15,9 +15,9 @@ limitations under the License. */ // +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 // +groupName=resourcequota.admission.k8s.io // 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" diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/register.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1/register.go similarity index 100% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/register.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1/register.go diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/types.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1/types.go similarity index 100% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/types.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1/types.go diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/zz_generated.conversion.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1/zz_generated.conversion.go similarity index 98% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/zz_generated.conversion.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1/zz_generated.conversion.go index 3ca9511b3c5..8daa12683d5 100644 --- a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/zz_generated.conversion.go +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1/zz_generated.conversion.go @@ -26,7 +26,7 @@ import ( v1 "k8s.io/api/core/v1" conversion "k8s.io/apimachinery/pkg/conversion" 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() { diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/zz_generated.deepcopy.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1/zz_generated.deepcopy.go similarity index 100% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/zz_generated.deepcopy.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1/zz_generated.deepcopy.go diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/zz_generated.defaults.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1/zz_generated.defaults.go similarity index 100% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/v1alpha1/zz_generated.defaults.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1alpha1/zz_generated.defaults.go diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1/BUILD b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1/BUILD similarity index 75% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/v1/BUILD rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1/BUILD index da66afcd3fc..1698bf3499e 100644 --- a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1/BUILD @@ -16,14 +16,15 @@ go_library( "zz_generated.deepcopy.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 = [ - "//plugin/pkg/admission/resourcequota/apis/resourcequota: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/conversion: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/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota:go_default_library", ], ) diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1beta1/defaults.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1/defaults.go similarity index 100% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/v1beta1/defaults.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1/defaults.go diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1beta1/doc.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1/doc.go similarity index 78% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/v1beta1/doc.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1/doc.go index 3f4dd11b218..6d94d774c7d 100644 --- a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1beta1/doc.go +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1/doc.go @@ -15,9 +15,9 @@ limitations under the License. */ // +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 // +groupName=resourcequota.admission.k8s.io // 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" diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1beta1/register.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1/register.go similarity index 100% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/v1beta1/register.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1/register.go diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1beta1/types.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1/types.go similarity index 100% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/v1beta1/types.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1/types.go diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1beta1/zz_generated.conversion.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1/zz_generated.conversion.go similarity index 98% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/v1beta1/zz_generated.conversion.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1/zz_generated.conversion.go index bff5582a611..250c3e15831 100644 --- a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1beta1/zz_generated.conversion.go +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1/zz_generated.conversion.go @@ -26,7 +26,7 @@ import ( v1 "k8s.io/api/core/v1" conversion "k8s.io/apimachinery/pkg/conversion" 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() { diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1beta1/zz_generated.deepcopy.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1/zz_generated.deepcopy.go similarity index 100% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/v1beta1/zz_generated.deepcopy.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1/zz_generated.deepcopy.go diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/v1beta1/zz_generated.defaults.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1/zz_generated.defaults.go similarity index 100% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/v1beta1/zz_generated.defaults.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1beta1/zz_generated.defaults.go diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/validation/BUILD b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/validation/BUILD similarity index 59% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/validation/BUILD rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/validation/BUILD index fb3682b08ec..baab314f9af 100644 --- a/plugin/pkg/admission/resourcequota/apis/resourcequota/validation/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/validation/BUILD @@ -9,10 +9,11 @@ load( go_library( name = "go_default_library", 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 = [ - "//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/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota:go_default_library", ], ) @@ -33,5 +34,5 @@ go_test( name = "go_default_test", srcs = ["validation_test.go"], 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"], ) diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/validation/validation.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/validation/validation.go similarity index 92% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/validation/validation.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/validation/validation.go index 8e358115189..4b23f0bcaf2 100644 --- a/plugin/pkg/admission/resourcequota/apis/resourcequota/validation/validation.go +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/validation/validation.go @@ -17,9 +17,9 @@ limitations under the License. package validation 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. diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/validation/validation_test.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/validation/validation_test.go similarity index 94% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/validation/validation_test.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/validation/validation_test.go index 8c8d18b07ed..3e7c53c4d67 100644 --- a/plugin/pkg/admission/resourcequota/apis/resourcequota/validation/validation_test.go +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/validation/validation_test.go @@ -19,7 +19,7 @@ package validation import ( "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) { diff --git a/plugin/pkg/admission/resourcequota/apis/resourcequota/zz_generated.deepcopy.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/zz_generated.deepcopy.go similarity index 100% rename from plugin/pkg/admission/resourcequota/apis/resourcequota/zz_generated.deepcopy.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/zz_generated.deepcopy.go diff --git a/plugin/pkg/admission/resourcequota/config.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/config.go similarity index 86% rename from plugin/pkg/admission/resourcequota/config.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/config.go index 979ffba1330..84f03be2558 100644 --- a/plugin/pkg/admission/resourcequota/config.go +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/config.go @@ -23,9 +23,9 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/serializer" - resourcequotaapi "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota" - "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota/install" - resourcequotav1 "k8s.io/kubernetes/plugin/pkg/admission/resourcequota/apis/resourcequota/v1" + resourcequotaapi "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota" + "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/install" + resourcequotav1 "k8s.io/apiserver/pkg/admission/plugin/resourcequota/apis/resourcequota/v1" ) var ( diff --git a/plugin/pkg/admission/resourcequota/config_test.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/config_test.go similarity index 97% rename from plugin/pkg/admission/resourcequota/config_test.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/config_test.go index 18473ebf6e0..1b03c405a2e 100644 --- a/plugin/pkg/admission/resourcequota/config_test.go +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/config_test.go @@ -23,7 +23,7 @@ import ( "testing" 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) { diff --git a/plugin/pkg/admission/resourcequota/controller.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/controller.go similarity index 99% rename from plugin/pkg/admission/resourcequota/controller.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/controller.go index 510db4f6f44..622c7bcfd50 100644 --- a/plugin/pkg/admission/resourcequota/controller.go +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/controller.go @@ -34,10 +34,10 @@ import ( "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/wait" "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" - 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. diff --git a/plugin/pkg/admission/resourcequota/doc.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/doc.go similarity index 88% rename from plugin/pkg/admission/resourcequota/doc.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/doc.go index 42bee9fbab0..4436e33035b 100644 --- a/plugin/pkg/admission/resourcequota/doc.go +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/doc.go @@ -16,4 +16,4 @@ limitations under the License. // Package resourcequota enforces all incoming requests against any applied quota // 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" diff --git a/plugin/pkg/admission/resourcequota/resource_access.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/resource_access.go similarity index 100% rename from plugin/pkg/admission/resourcequota/resource_access.go rename to staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/resource_access.go diff --git a/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/resource_access_test.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/resource_access_test.go new file mode 100644 index 00000000000..753bfa73106 --- /dev/null +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugin/resourcequota/resource_access_test.go @@ -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") + } +} diff --git a/staging/src/k8s.io/apiserver/pkg/quota/v1/BUILD b/staging/src/k8s.io/apiserver/pkg/quota/v1/BUILD new file mode 100644 index 00000000000..9823957d716 --- /dev/null +++ b/staging/src/k8s.io/apiserver/pkg/quota/v1/BUILD @@ -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"], +) diff --git a/staging/src/k8s.io/apiserver/pkg/quota/v1/OWNERS b/staging/src/k8s.io/apiserver/pkg/quota/v1/OWNERS new file mode 100644 index 00000000000..d812b5d3ee6 --- /dev/null +++ b/staging/src/k8s.io/apiserver/pkg/quota/v1/OWNERS @@ -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 diff --git a/pkg/quota/v1/generic/BUILD b/staging/src/k8s.io/apiserver/pkg/quota/v1/generic/BUILD similarity index 87% rename from pkg/quota/v1/generic/BUILD rename to staging/src/k8s.io/apiserver/pkg/quota/v1/generic/BUILD index 7538c4051ad..80e175915f2 100644 --- a/pkg/quota/v1/generic/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/quota/v1/generic/BUILD @@ -9,15 +9,16 @@ go_library( "evaluator.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 = [ - "//pkg/quota/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/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/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/tools/cache:go_default_library", ], diff --git a/pkg/quota/v1/generic/OWNERS b/staging/src/k8s.io/apiserver/pkg/quota/v1/generic/OWNERS similarity index 100% rename from pkg/quota/v1/generic/OWNERS rename to staging/src/k8s.io/apiserver/pkg/quota/v1/generic/OWNERS diff --git a/pkg/quota/v1/generic/configuration.go b/staging/src/k8s.io/apiserver/pkg/quota/v1/generic/configuration.go similarity index 96% rename from pkg/quota/v1/generic/configuration.go rename to staging/src/k8s.io/apiserver/pkg/quota/v1/generic/configuration.go index 1a1acc44185..966c5c7c654 100644 --- a/pkg/quota/v1/generic/configuration.go +++ b/staging/src/k8s.io/apiserver/pkg/quota/v1/generic/configuration.go @@ -18,7 +18,7 @@ package generic import ( "k8s.io/apimachinery/pkg/runtime/schema" - quota "k8s.io/kubernetes/pkg/quota/v1" + quota "k8s.io/apiserver/pkg/quota/v1" ) // implements a basic configuration diff --git a/pkg/quota/v1/generic/evaluator.go b/staging/src/k8s.io/apiserver/pkg/quota/v1/generic/evaluator.go similarity index 99% rename from pkg/quota/v1/generic/evaluator.go rename to staging/src/k8s.io/apiserver/pkg/quota/v1/generic/evaluator.go index f49e2decd4b..7ba48c94286 100644 --- a/pkg/quota/v1/generic/evaluator.go +++ b/staging/src/k8s.io/apiserver/pkg/quota/v1/generic/evaluator.go @@ -26,9 +26,9 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apiserver/pkg/admission" + quota "k8s.io/apiserver/pkg/quota/v1" "k8s.io/client-go/informers" "k8s.io/client-go/tools/cache" - quota "k8s.io/kubernetes/pkg/quota/v1" ) // InformerForResourceFunc knows how to provision an informer diff --git a/pkg/quota/v1/generic/evaluator_test.go b/staging/src/k8s.io/apiserver/pkg/quota/v1/generic/evaluator_test.go similarity index 100% rename from pkg/quota/v1/generic/evaluator_test.go rename to staging/src/k8s.io/apiserver/pkg/quota/v1/generic/evaluator_test.go diff --git a/pkg/quota/v1/generic/registry.go b/staging/src/k8s.io/apiserver/pkg/quota/v1/generic/registry.go similarity index 98% rename from pkg/quota/v1/generic/registry.go rename to staging/src/k8s.io/apiserver/pkg/quota/v1/generic/registry.go index 10404a3f288..0c102360633 100644 --- a/pkg/quota/v1/generic/registry.go +++ b/staging/src/k8s.io/apiserver/pkg/quota/v1/generic/registry.go @@ -20,7 +20,7 @@ import ( "sync" "k8s.io/apimachinery/pkg/runtime/schema" - quota "k8s.io/kubernetes/pkg/quota/v1" + quota "k8s.io/apiserver/pkg/quota/v1" ) // implements a basic registry diff --git a/pkg/quota/v1/interfaces.go b/staging/src/k8s.io/apiserver/pkg/quota/v1/interfaces.go similarity index 99% rename from pkg/quota/v1/interfaces.go rename to staging/src/k8s.io/apiserver/pkg/quota/v1/interfaces.go index d71b6641830..15f8b7613d3 100644 --- a/pkg/quota/v1/interfaces.go +++ b/staging/src/k8s.io/apiserver/pkg/quota/v1/interfaces.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package quota +package v1 import ( corev1 "k8s.io/api/core/v1" diff --git a/pkg/quota/v1/resources.go b/staging/src/k8s.io/apiserver/pkg/quota/v1/resources.go similarity index 99% rename from pkg/quota/v1/resources.go rename to staging/src/k8s.io/apiserver/pkg/quota/v1/resources.go index 9b217489db3..3c2927d738b 100644 --- a/pkg/quota/v1/resources.go +++ b/staging/src/k8s.io/apiserver/pkg/quota/v1/resources.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package quota +package v1 import ( "sort" diff --git a/pkg/quota/v1/resources_test.go b/staging/src/k8s.io/apiserver/pkg/quota/v1/resources_test.go similarity index 99% rename from pkg/quota/v1/resources_test.go rename to staging/src/k8s.io/apiserver/pkg/quota/v1/resources_test.go index 910c2f51120..b8c85a1574e 100644 --- a/pkg/quota/v1/resources_test.go +++ b/staging/src/k8s.io/apiserver/pkg/quota/v1/resources_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package quota +package v1 import ( "reflect" diff --git a/test/integration/quota/BUILD b/test/integration/quota/BUILD index 3bf9cd52aab..76b91fa897c 100644 --- a/test/integration/quota/BUILD +++ b/test/integration/quota/BUILD @@ -17,10 +17,7 @@ go_test( "//pkg/controller:go_default_library", "//pkg/controller/replication:go_default_library", "//pkg/controller/resourcequota:go_default_library", - "//pkg/quota/v1/generic: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/apimachinery/pkg/api/resource: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/util/wait: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/kubernetes:go_default_library", "//staging/src/k8s.io/client-go/rest:go_default_library", diff --git a/test/integration/quota/quota_test.go b/test/integration/quota/quota_test.go index de9d79aeb6a..1196aeb0d55 100644 --- a/test/integration/quota/quota_test.go +++ b/test/integration/quota/quota_test.go @@ -24,7 +24,7 @@ import ( "testing" "time" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/fields" @@ -32,6 +32,9 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/wait" "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" clientset "k8s.io/client-go/kubernetes" restclient "k8s.io/client-go/rest" @@ -40,10 +43,7 @@ import ( "k8s.io/kubernetes/pkg/controller" replicationcontroller "k8s.io/kubernetes/pkg/controller/replication" resourcequotacontroller "k8s.io/kubernetes/pkg/controller/resourcequota" - "k8s.io/kubernetes/pkg/quota/v1/generic" 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" ) diff --git a/vendor/modules.txt b/vendor/modules.txt index 94445b7991c..d0ed8268c00 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1715,6 +1715,13 @@ k8s.io/apiserver/pkg/admission/configuration k8s.io/apiserver/pkg/admission/initializer k8s.io/apiserver/pkg/admission/metrics 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/config 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/warning 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/registry k8s.io/apiserver/pkg/registry/generic/rest