only compute delta on non-creating updates

This commit is contained in:
deads2k 2016-08-18 13:41:33 -04:00
parent 9d2a5fe5e8
commit 44808c64ae
2 changed files with 11 additions and 5 deletions

View File

@ -295,8 +295,8 @@ func TestAdmitHandlesOldObjects(t *testing.T) {
indexer.Add(resourceQuota) indexer.Add(resourceQuota)
// old service was a load balancer, but updated version is a node port. // old service was a load balancer, but updated version is a node port.
oldService := &api.Service{ existingService := &api.Service{
ObjectMeta: api.ObjectMeta{Name: "service", Namespace: "test"}, ObjectMeta: api.ObjectMeta{Name: "service", Namespace: "test", ResourceVersion: "1"},
Spec: api.ServiceSpec{Type: api.ServiceTypeLoadBalancer}, Spec: api.ServiceSpec{Type: api.ServiceTypeLoadBalancer},
} }
newService := &api.Service{ newService := &api.Service{
@ -306,7 +306,7 @@ func TestAdmitHandlesOldObjects(t *testing.T) {
Ports: []api.ServicePort{{Port: 1234}}, 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 { if err != nil {
t.Errorf("Unexpected error: %v", err) t.Errorf("Unexpected error: %v", err)
} }

View File

@ -369,8 +369,14 @@ func (e *quotaEvaluator) checkRequest(quotas []api.ResourceQuota, a admission.At
if prevItem == nil { if prevItem == nil {
return nil, admission.NewForbidden(a, fmt.Errorf("unable to get previous usage since prior version of object was not found")) 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) { if quota.IsZero(deltaUsage) {
return quotas, nil return quotas, nil