From 58f2cdccf77f57f0c48cae1aeedd2f843c3ca4a2 Mon Sep 17 00:00:00 2001 From: Jordan Liggitt Date: Tue, 30 Apr 2019 22:17:24 -0400 Subject: [PATCH] Add quota admission test for decreasing usage without covering quota --- .../admission/resourcequota/admission_test.go | 58 +++++++++++++++++-- 1 file changed, 52 insertions(+), 6 deletions(-) diff --git a/plugin/pkg/admission/resourcequota/admission_test.go b/plugin/pkg/admission/resourcequota/admission_test.go index 8fdc8d3cff..e8802db7bd 100644 --- a/plugin/pkg/admission/resourcequota/admission_test.go +++ b/plugin/pkg/admission/resourcequota/admission_test.go @@ -2200,7 +2200,7 @@ func TestAdmitZeroDeltaUsageWithoutCoveringQuota(t *testing.T) { LimitedResources: []resourcequotaapi.LimitedResource{ { Resource: "services", - MatchContains: []string{"services"}, + MatchContains: []string{"services.loadbalancers"}, }, }, } @@ -2227,8 +2227,8 @@ func TestAdmitZeroDeltaUsageWithoutCoveringQuota(t *testing.T) { } } -// TestAdmitRejectDeltaUsageWithoutCoveringQuota verifies that resource quota is required for non zero delta requests. -func TestAdmitRejectDeltaUsageWithoutCoveringQuota(t *testing.T) { +// TestAdmitRejectIncreaseUsageWithoutCoveringQuota verifies that resource quota is required for delta requests that increase usage. +func TestAdmitRejectIncreaseUsageWithoutCoveringQuota(t *testing.T) { kubeClient := fake.NewSimpleClientset() stopCh := make(chan struct{}) defer close(stopCh) @@ -2243,7 +2243,53 @@ func TestAdmitRejectDeltaUsageWithoutCoveringQuota(t *testing.T) { LimitedResources: []resourcequotaapi.LimitedResource{ { Resource: "services", - MatchContains: []string{"services"}, + MatchContains: []string{"services.loadbalancers"}, + }, + }, + } + 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, + } + + existingService := &api.Service{ + ObjectMeta: metav1.ObjectMeta{Name: "service", Namespace: "test", ResourceVersion: "1"}, + Spec: api.ServiceSpec{ + Type: api.ServiceTypeNodePort, + Ports: []api.ServicePort{{Port: 1234}}, + }, + } + newService := &api.Service{ + ObjectMeta: metav1.ObjectMeta{Name: "service", Namespace: "test"}, + Spec: api.ServiceSpec{Type: api.ServiceTypeLoadBalancer}, + } + + err := handler.Validate(admission.NewAttributesRecord(newService, existingService, api.Kind("Service").WithVersion("version"), newService.Namespace, newService.Name, corev1.Resource("services").WithVersion("version"), "", admission.Update, false, nil), nil) + if err == nil { + t.Errorf("Expected an error for consuming a limited resource without quota.") + } +} + +// TestAdmitAllowDecreaseUsageWithoutCoveringQuota verifies that resource quota is not required for delta requests that decrease usage. +func TestAdmitAllowDecreaseUsageWithoutCoveringQuota(t *testing.T) { + kubeClient := fake.NewSimpleClientset() + 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() + + // disable services unless there is a covering quota. + config := &resourcequotaapi.Configuration{ + LimitedResources: []resourcequotaapi.LimitedResource{ + { + Resource: "services", + MatchContains: []string{"services.loadbalancers"}, }, }, } @@ -2268,7 +2314,7 @@ func TestAdmitRejectDeltaUsageWithoutCoveringQuota(t *testing.T) { } err := handler.Validate(admission.NewAttributesRecord(newService, existingService, api.Kind("Service").WithVersion("version"), newService.Namespace, newService.Name, corev1.Resource("services").WithVersion("version"), "", admission.Update, false, nil), nil) - if err == nil { - t.Errorf("Expected an error for consuming a limited resource without quota.") + if err != nil { + t.Errorf("Expected no error for decreasing a limited resource without quota, got %v", err) } }