Commit 44808c64 authored by deads2k's avatar deads2k

only compute delta on non-creating updates

parent 9d2a5fe5
...@@ -295,8 +295,8 @@ func TestAdmitHandlesOldObjects(t *testing.T) { ...@@ -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) { ...@@ -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)
} }
......
...@@ -369,9 +369,15 @@ func (e *quotaEvaluator) checkRequest(quotas []api.ResourceQuota, a admission.At ...@@ -369,9 +369,15 @@ 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"))
} }
// 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) prevUsage := evaluator.Usage(prevItem)
deltaUsage = quota.Subtract(deltaUsage, prevUsage) deltaUsage = quota.Subtract(deltaUsage, prevUsage)
} }
}
if quota.IsZero(deltaUsage) { if quota.IsZero(deltaUsage) {
return quotas, nil return quotas, nil
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment