diff --git a/src/authm_mad/quota.rb b/src/authm_mad/quota.rb index 137e2705e8..ee6047ebbc 100644 --- a/src/authm_mad/quota.rb +++ b/src/authm_mad/quota.rb @@ -89,19 +89,43 @@ class Quota # Checks if the user is below resource limits. If new_vm is defined # checks if its requirements fit in limits def check(user, new_vm=nil) - usage=@usage.total(user) + use=@usage.total(user) + use_after=use.clone user_quota=get(user) if new_vm - usage.cpu+=new_vm.cpu.to_f - usage.memory+=new_vm.memory.to_i - usage.num_vms+=1 + use_after.cpu+=new_vm.cpu.to_f + use_after.memory+=new_vm.memory.to_i + use_after.num_vms+=1 + end + + STDERR.puts [user_quota, use_after, new_vm].inspect + + error_message="" + + if !(!user_quota[:cpu] || use_after.cpu<=user_quota[:cpu]) + error_message<<"Cpu quota exceeded (Quota: #{user_quota[:cpu]}, "+ + "Used: #{use.cpu}" + error_message<<", asked: #{new_vm.cpu.to_f}" if new_vm + error_message<<")." + end + + if !(!user_quota[:memory] || use_after.memory<=user_quota[:memory]) + error_message<<" Memory quota exceeded (Quota: "+ + "#{user_quota[:memory]}, Used: #{use.memory}" + error_message<<", asked: #{new_vm.memory.to_i}" if new_vm + error_message<<")." + end + + if !(!user_quota[:num_vms] || use_after.num_vms<=user_quota[:num_vms]) + error_message<<" Num VMS quota exceeded (Quota: "+ + "#{user_quota[:memory]}, Used: #{use.num_vms})." + end + + if error_message=="" + false + else + error_message.strip end - - STDERR.puts [user_quota, usage, new_vm].inspect - - (!user_quota[:cpu] || usage.cpu<=user_quota[:cpu]) && - (!user_quota[:memory] || usage.memory<=user_quota[:memory]) && - (!user_quota[:num_vms] || usage.num_vms<=user_quota[:num_vms]) end # Updates user resource consuption diff --git a/src/authm_mad/simple_permissions.rb b/src/authm_mad/simple_permissions.rb index e69dae12e5..084073b6c5 100644 --- a/src/authm_mad/simple_permissions.rb +++ b/src/authm_mad/simple_permissions.rb @@ -54,8 +54,8 @@ class SimplePermissions if @quota_enabled and object=='VM' and auth_result STDERR.puts 'quota enabled' @quota.update(uid.to_i) - if !@quota.check(uid.to_i, get_vm_usage(id)) - auth_result="Quota exceeded" + if message=@quota.check(uid.to_i, get_vm_usage(id)) + auth_result=message end end diff --git a/src/authm_mad/test/quota_spec.rb b/src/authm_mad/test/quota_spec.rb index 287461e11e..6bb1b7fc3d 100644 --- a/src/authm_mad/test/quota_spec.rb +++ b/src/authm_mad/test/quota_spec.rb @@ -60,8 +60,8 @@ describe 'Quota' do it 'should check for quotas' do @quota.update(0) @quota.update(1) - @quota.check(0).should == true - @quota.check(1).should == true + @quota.check(0).should == false + @quota.check(1).should == false vms=@quota.get_user(0) vms[5]=VmUsage.new(40.0, 8192) @@ -69,13 +69,13 @@ describe 'Quota' do vms=@quota.get_user(1) vms[6]=VmUsage.new(40.0, 8192) - @quota.check(0).should == false - @quota.check(1).should == false + @quota.check(0).class.should == String + @quota.check(1).class.should == String @quota.update(0) @quota.update(1) - @quota.check(0).should == true - @quota.check(1).should == true + @quota.check(0).should == false + @quota.check(1).should == false end it 'should let update limits' do @@ -86,8 +86,8 @@ describe 'Quota' do it 'should understand unlimited quotas' do vms=@quota.get_user(0) vms[7]=VmUsage.new(9999999999.0, 99999999999) - @quota.check(0).should == true - @quota.check(0, VmUsage.new(999999999.0, 99999999)).should == true + @quota.check(0).should == false + @quota.check(0, VmUsage.new(999999999.0, 99999999)).should == false end end