diff --git a/plugin/pkg/admission/resourcequota/admission_test.go b/plugin/pkg/admission/resourcequota/admission_test.go index 18f74b995fe..81fd6c1803d 100644 --- a/plugin/pkg/admission/resourcequota/admission_test.go +++ b/plugin/pkg/admission/resourcequota/admission_test.go @@ -292,8 +292,8 @@ func TestAdmitHandlesOldObjects(t *testing.T) { indexer.Add(resourceQuota) // old service was a load balancer, but updated version is a node port. - oldService := &api.Service{ - ObjectMeta: api.ObjectMeta{Name: "service", Namespace: "test"}, + existingService := &api.Service{ + ObjectMeta: api.ObjectMeta{Name: "service", Namespace: "test", ResourceVersion: "1"}, Spec: api.ServiceSpec{Type: api.ServiceTypeLoadBalancer}, } newService := &api.Service{ @@ -303,7 +303,7 @@ func TestAdmitHandlesOldObjects(t *testing.T) { Ports: []api.ServicePort{{Port: 1234}}, }, } - err := handler.Admit(admission.NewAttributesRecord(newService, oldService, api.Kind("Service").WithVersion("version"), newService.Namespace, newService.Name, api.Resource("services").WithVersion("version"), "", admission.Update, nil)) + err := handler.Admit(admission.NewAttributesRecord(newService, existingService, api.Kind("Service").WithVersion("version"), newService.Namespace, newService.Name, api.Resource("services").WithVersion("version"), "", admission.Update, nil)) if err != nil { t.Errorf("Unexpected error: %v", err) } diff --git a/plugin/pkg/admission/resourcequota/controller.go b/plugin/pkg/admission/resourcequota/controller.go index 4fc7c9c0849..770d93589ac 100644 --- a/plugin/pkg/admission/resourcequota/controller.go +++ b/plugin/pkg/admission/resourcequota/controller.go @@ -369,8 +369,14 @@ func (e *quotaEvaluator) checkRequest(quotas []api.ResourceQuota, a admission.At if prevItem == nil { return nil, admission.NewForbidden(a, fmt.Errorf("unable to get previous usage since prior version of object was not found")) } - prevUsage := evaluator.Usage(prevItem) - deltaUsage = quota.Subtract(deltaUsage, prevUsage) + + // if we can definitively determine that this is not a case of "create on update", + // then charge based on the delta. Otherwise, bill the maximum + metadata, err := meta.Accessor(prevItem) + if err == nil && len(metadata.GetResourceVersion()) > 0 { + prevUsage := evaluator.Usage(prevItem) + deltaUsage = quota.Subtract(deltaUsage, prevUsage) + } } if quota.IsZero(deltaUsage) { return quotas, nil